2010-04-06 132 views
0

我试图确保给定元素(MPF.MWindow)的孩子获取自定义模板。例如,该按钮应该获得在resMButton.xaml中定义的模板。截至目前我使用的是下面的代码:(resMWindow.xamlWPF中模板的继承

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:MPF"> 
    <Style x:Key="SystemKeyAnimations" TargetType="{x:Type Button}"> 
     <Setter Property="Opacity" Value="0.5" /> 
     <Setter Property="Background" Value="Transparent" /> 
     <Style.Triggers> 
      <EventTrigger RoutedEvent="Mouse.MouseEnter"> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
                  Storyboard.TargetProperty="Opacity"> 
          <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="1.0" /> 
         </DoubleAnimationUsingKeyFrames> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
      <EventTrigger RoutedEvent="Mouse.MouseLeave"> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
                  Storyboard.TargetProperty="Opacity"> 
          <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="0.5" /> 
         </DoubleAnimationUsingKeyFrames> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Style.Triggers> 
    </Style> 

    <Style TargetType="{x:Type local:MWindow}"> 

     <!-- Remove default frame appearance --> 
     <Setter Property="WindowStyle" Value="None" /> 
     <Setter Property="AllowsTransparency" Value="True" /> 
     <Setter Property="Background" Value="Transparent" /> 

     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:MWindow}"> 
        <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" x:Name="ChromeBorder"> 

         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="4" /> 
           <ColumnDefinition /> 
           <ColumnDefinition Width="4" /> 
          </Grid.ColumnDefinitions> 

          <Grid.RowDefinitions> 
           <RowDefinition Height="4" /> 
           <RowDefinition /> 
           <RowDefinition Height="4" /> 
          </Grid.RowDefinitions> 

          <Thumb Grid.Row="0" Grid.Column="1" x:Name="TopThumb" Cursor="SizeNS" BorderThickness="4" BorderBrush="Transparent" /> 
          <Thumb Grid.Row="2" Grid.Column="1" x:Name="BottomThumb" Cursor="SizeNS" BorderThickness="4" BorderBrush="Transparent" /> 
          <Thumb Grid.Row="1" Grid.Column="0" x:Name="LeftThumb" Cursor="SizeWE" BorderThickness="4" BorderBrush="Transparent" /> 
          <Thumb Grid.Row="1" Grid.Column="2" x:Name="RightThumb" Cursor="SizeWE" BorderThickness="4" BorderBrush="Transparent" /> 

          <Thumb Grid.Row="0" Grid.Column="0" x:Name="TopLeftThumb" Cursor="SizeNWSE" BorderThickness="5" BorderBrush="Transparent" /> 
          <Thumb Grid.Row="0" Grid.Column="2" x:Name="TopRightThumb" Cursor="SizeNESW" BorderThickness="5" BorderBrush="Transparent" /> 
          <Thumb Grid.Row="2" Grid.Column="0" x:Name="BottomLeftThumb" Cursor="SizeNESW" BorderThickness="5" BorderBrush="Transparent" /> 
          <Thumb Grid.Row="2" Grid.Column="2" x:Name="BottomRightThumb" Cursor="SizeNWSE" BorderThickness="5" BorderBrush="Transparent" /> 

          <Grid Grid.Row="1" Grid.Column="1"> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="20" /> 
            <RowDefinition /> 
           </Grid.RowDefinitions> 

           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition /> 
             <ColumnDefinition Width="Auto" /> 
            </Grid.ColumnDefinitions> 

            <StackPanel Orientation="Horizontal" Grid.Column="1"> 

             <Button Command="local:WindowCommands.Minimize" Style="{StaticResource ResourceKey=SystemKeyAnimations}"> 
              <Button.Template> 
               <ControlTemplate> 
                <Canvas Width="10" Height="10" Margin="5" Background="Transparent"> 
                 <Line X1="0" X2="10" Y1="5" Y2="5" Stroke="White" StrokeThickness="2" /> 
                </Canvas> 
               </ControlTemplate> 
              </Button.Template> 
             </Button> 

             <Button Command="local:WindowCommands.Maximize" x:Name="MaximizeButton" Style="{StaticResource ResourceKey=SystemKeyAnimations}"> 
              <Button.Template> 
               <ControlTemplate> 
                <Canvas Width="10" Height="10" Margin="5" Background="Transparent"> 
                 <Rectangle Width="10" Height="10" Stroke="White" StrokeThickness="2" /> 
                </Canvas> 
               </ControlTemplate> 
              </Button.Template> 
             </Button> 

             <Button Command="ApplicationCommands.Close" Style="{StaticResource ResourceKey=SystemKeyAnimations}"> 
              <Button.Template> 
               <ControlTemplate> 
                <Canvas Width="10" Height="10" Margin="5" Background="Transparent"> 
                 <Line X1="0" X2="10" Y1="0" Y2="10" Stroke="White" StrokeThickness="2" /> 
                 <Line X1="10" X2="0" Y1="0" Y2="10" Stroke="White" StrokeThickness="2" /> 
                </Canvas> 
               </ControlTemplate> 
              </Button.Template> 
             </Button> 

            </StackPanel> 

            <ContentControl x:Name="TitleContentControl"> 
             <TextBlock Text="{TemplateBinding Title}" Foreground="DarkGray" Margin="5,0" /> 
            </ContentControl> 
           </Grid> 

           <ContentPresenter Content="{TemplateBinding Content}" Grid.Row="1"> 
            <ContentPresenter.Resources> 
             <ResourceDictionary> 
              <ResourceDictionary.MergedDictionaries> 
               <ResourceDictionary Source="/MPF;component/Themes/resMWindowContent.xaml" /> 
              </ResourceDictionary.MergedDictionaries> 
             </ResourceDictionary> 
            </ContentPresenter.Resources> 
           </ContentPresenter> 
          </Grid> 
         </Grid> 
        </Border> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 

    </Style> 
</ResourceDictionary> 

,你可以在ContentPresenter它得到我在一个叫resMWindowContent.xaml dicrionary合并窗口的内容中看到。该resMWindowContent.xaml看起来如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:MPF"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/MPF;component/Themes/resMButton.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

它只是合并在resMButton.xaml字典(这是在功能,因为做我会MTextBox,mList ......我想将它们分开)。

resMButton.xaml看起来如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:MPF"> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid Background="Transparent"> 
         <Rectangle Stroke="{TemplateBinding BorderBrush}" StrokeThickness="{TemplateBinding BorderThickness}" 
            Fill="{TemplateBinding Background}" /> 
         <ContentPresenter Content="{TemplateBinding Content}" Margin="3" /> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

一个简单的模板绘制一个方形按钮。但是,它根本不适用。我的按钮保持正常,我不明白我做错了什么。我只是想让MWindow中的每个按钮都得到一种特殊的风格(以及每个文本框等等)。我如何实现这一目标?

但有一点需要注意:风格不适用于MWindow以外的元素很重要。

回答

0

您确定要加载resMButton.xaml吗?

+0

我该如何确定它是什么? – Alxandr 2010-04-06 23:20:57

+0

您可以尝试使用Mole(http://www.codeproject.com/KB/WPF/MoleForWPF.aspx)或Snoop(http://blois.us/Snoop/) 等特殊工具在运行时检查视觉树检查将什么resMButton.xaml加载为ContentPresenter的资源。 – Win4ster 2010-04-07 00:06:43

+0

...如果未加载,请尝试指定完整包Uri至Source: 或相对包Uri: Win4ster 2010-04-07 00:10:59

1

从样式元素中删除x:Key = "SystemKeyAnimations"