我正在使用ControlTemplate
来定义WPF应用程序中按钮的外观。另外我想使用样式来设置我的按钮的某些方面。这些样式应该在ControlTemplate
中定义的元素上设置属性,如(简化):
<Window.Resources>
<ControlTemplate x:Key="Template1" TargetType="Button">
<Grid>
<Rectangle Name="rect" Fill="White" Stroke="Blue" StrokeThickness="2"/>
<TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</ControlTemplate>
<Style x:Key="Style1" TargetType="Button" >
<Setter TargetName="rect" Property="Fill" Value="Red"/>
</Style>
</Window.Resources>
现在编译器抱怨TargetName“rect”不是我能理解的有效目标,因为未模拟的Button
不包含名为“rect”的元素。
我知道我可以改变样式来设置完整的模板,但我想避免这种情况(因为模板比这里显示的要复杂得多,我不想为每种样式复制它......)
有可能实现这种行为吗?也许设置TargetType
对吧?还有其他想法吗?
答案 0 :(得分:1)
您可以 NOT 仅覆盖控件模板的一部分。你可以改变一切或者什么都不做。
您可以在样式上设置属性的设置器。
答案 1 :(得分:1)
标准模式是在控件模板中使用TemplateBinding绑定到控件本身的属性,然后在样式中设置控件的属性。例如:
<Window.Resources>
<ControlTemplate x:Key="Template1" TargetType="Button">
<Grid>
<Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/>
<TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</ControlTemplate>
<Style x:Key="Style1" TargetType="Button" >
<Setter Property="Background" Value="Red"/>
</Style>
</Window.Resources>
这会将rect上的Fill属性绑定到Button上的Background属性。该样式将Background属性设置为Red,这将使Fill设置为Red。
为了设置默认值,您通常会创建一个样式来设置模板以及其他属性:
<Window.Resources>
<Style x:Key="BaseStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/>
<TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="White"/>
</Style>
<Style x:Key="Style1" TargetType="Button" BasedOn="{StaticResource BaseStyle}">
<Setter Property="Background" Value="Red"/>
</Style>
</Window.Resources>
第一个样式将应用模板并将Background设置为White,因此矩形将为白色。第二种样式继承自第一种样式,但将背景设置为红色,因此矩形将为红色。