2010-09-07 105 views
15

我们刚刚开始使用XAML,并且仍在与基本问题打交道: 从CSS开始,我们希望使用自定义控件模板定义通用按钮样式,然后使用“basedon”继承第一种样式的所有内容。这第二种风格应该覆盖属性,例如“前景色”(工作原理),但也包括我们自定义模板中的子元素的属性,例如包含边框元素的“背景颜色”等(不起作用)。如何继承XAML样式并覆盖子元素的属性?

什么是一般的方法去了解这样的事情?能走多远,我们一起去级联样式?

干杯!

回答

6

制作可定制控件模板的标准方法是在模板中使用TemplateBinding绑定到控件的属性,然后在子样式中设置这些属性。

例如,这将创建一个带有Border控件的按钮模板,并将边框的背景绑定到Button的Background属性。通过在其他样式中设置Button的Background属性,它会更改Border的Background属性。

<StackPanel> 
    <StackPanel.Resources> 
     <Style x:Key="BaseButtonStyle" TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          Background="{TemplateBinding Background}"> 
          <ContentPresenter/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style x:Key="BlueButtonStyle" TargetType="Button" 
       BasedOn="{StaticResource BaseButtonStyle}"> 
      <Setter Property="Background" Value="Blue"/> 
     </Style> 
     <Style x:Key="RedButtonStyle" TargetType="Button" 
       BasedOn="{StaticResource BaseButtonStyle}"> 
      <Setter Property="Background" Value="Red"/> 
     </Style> 
    </StackPanel.Resources> 
    <Button Style="{StaticResource RedButtonStyle}">Red</Button> 
    <Button Style="{StaticResource BlueButtonStyle}">Blue</Button> 
</StackPanel> 

Control上的许多属性都用于控制模板,如果它们发生更改,则不会影响其他行为。它们是BorderBrush,BorderThickness,Background,Padding,Horizo​​ntalContentAlignment和VerticalContentAlignment。

23

您可以使用继承的风格,没有关键的参考:在App.xaml中的资源字典定义(在启动项目)

<Grid> 
    <Grid.Resources> 
     <!-- Definition of default appearance of a button --> 
     <Style TargetType="Button" x:Key="Default"> 
      <Setter Property="Background" Value="Red"></Setter> 
      <Setter Property="FontFamily" Value="Segoe Black" /> 
      <Setter Property="HorizontalAlignment" Value="Center" /> 
      <Setter Property="FontSize" Value="32pt" /> 
      <Setter Property="Foreground" Value="#777777" /> 
     </Style> 
     <!-- Define general style that based is base on the default style of the button without a key reference--> 
     <Style TargetType="Button" BasedOn="{StaticResource Default}"/> 

     <!-- In sub style override the properties you need --> 
     <Style BasedOn="{StaticResource Default}" TargetType="Button" x:Key="SubButton" > 
      <Setter Property="FontSize" Value="8pt" /> 
     </Style> 

    </Grid.Resources> 

    <Button Content="Main" Height="51" HorizontalAlignment="Left" Margin="154,72,0,0" Name="button1" VerticalAlignment="Top" Width="141" /> 
    <Button Content="Sub" Style="{StaticResource SubButton}" Height="51" HorizontalAlignment="Left" Margin="154,162,0,0" Name="button2" VerticalAlignment="Top" Width="141" /> 
</Grid> 
10

我(在我的WPF应用程序)的默认(基地)的风格。例如按钮如下。

<Style TargetType="Button"> 
     <Setter Property="Margin" Value="5"/> 
     <Setter Property="FontWeight" Value="DemiBold"/> 
     <Setter Property="FontSize" Value="16"/> 
    </Style> 

在我使用的所有视图(默认情况下)这个一般样式(自动继承)!当我需要更改或添加一些默认样式属性(在App.xaml中定义)时,我会根据默认样式创建新样式。当我需要隐藏或强烈地重新定义默认样式(在某些视图中)时,我创建了新样式(根据什么都不做)。

<Style TargetType="Button"/> 

当然,您可以继续继承App.xaml或特定视图。您可以根据默认样式命名为,并命名为样式,并按名称使用新样式。例如RedButton和GreenButton样式。

<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" x:Key="RedButton"> 
     <Setter Property="Foreground" Value="Red" /> 
    </Style> 

    <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" x:Key="GreenButton"> 
     <Setter Property="Foreground" Value="Green" /> 
    </Style> 

等...

注:,而不是定义的App.xaml你的风格,你可以只用和风格的ResourceDictionary从库的App.xaml ResourceDictionary.MergedDictionaries使用独立的库(DLL) 。