如何使用样式更改模板化控件

时间:2010-08-21 15:18:48

标签: wpf templates styles

我正在使用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对吧?还有其他想法吗?

2 个答案:

答案 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,因此矩形将为白色。第二种样式继承自第一种样式,但将背景设置为红色,因此矩形将为红色。