我们刚刚开始使用XAML,并且仍在与基本问题打交道: 从CSS开始,我们希望使用自定义控件模板定义通用按钮样式,然后使用“basedon”继承第一种样式的所有内容。这第二种风格应该覆盖属性,例如“前景色”(工作原理),但也包括我们自定义模板中的子元素的属性,例如包含边框元素的“背景颜色”等(不起作用)。如何继承XAML样式并覆盖子元素的属性?
什么是一般的方法去了解这样的事情?能走多远,我们一起去级联样式?
干杯!
我们刚刚开始使用XAML,并且仍在与基本问题打交道: 从CSS开始,我们希望使用自定义控件模板定义通用按钮样式,然后使用“basedon”继承第一种样式的所有内容。这第二种风格应该覆盖属性,例如“前景色”(工作原理),但也包括我们自定义模板中的子元素的属性,例如包含边框元素的“背景颜色”等(不起作用)。如何继承XAML样式并覆盖子元素的属性?
什么是一般的方法去了解这样的事情?能走多远,我们一起去级联样式?
干杯!
制作可定制控件模板的标准方法是在模板中使用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,HorizontalContentAlignment和VerticalContentAlignment。
您可以使用继承的风格,没有关键的参考:在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>
我(在我的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) 。