首页 文章

是否可以像在WPF中扩展Style一样扩展ControlTemplate?

提问于
浏览
7

所以问题是我有一个主要的ControlTemplate,它定义了我们正在设计的新按钮外观的最基本的东西 . 但是我想为这个按钮做3个其他的控制模板,所以我们可以设置不同的颜色;但我不想复制粘贴主ControlTemplate并更改那里的颜色,而是我想从那里“继承”(与Style中的BasedOn属性一样)并更改继承的ControlTemplate中的颜色 .

这可能吗?

谢谢!

2 回答

  • 0

    找到了解决方案 . 您不扩展ControlTemplates,而是定义所需的所有基本行为,然后让样式或控件本身修改它 . 以下面的例子为例 . ControlTemplate为我的矩形设置OpacityMask和圆角,Styles设置每个按钮的背景颜色(借助TemplateBinding),这是我的解决方案:

    <Window.Resources>
            <ControlTemplate x:Key="BaseMainButtonTemplate" TargetType="{x:Type Button}">
                <Grid TextBlock.Foreground="White" TextBlock.FontFamily="Calibri">
                    <Rectangle Stroke="#FFE8E6E6" x:Name="rectangle" RadiusX="14.5" RadiusY="14.5" Fill="{TemplateBinding Property=Background}"> <!-- This TemplateBinding takes the color set by the style and applies it to the rectangle. Doing it this way, allows the style to modify the background color -->
                        <Rectangle.OpacityMask>
                            <LinearGradientBrush EndPoint="0,1" SpreadMethod="Reflect">
                                <GradientStop Offset="0" Color="Transparent"></GradientStop>
                                <GradientStop Offset="1" Color="Gray"></GradientStop>
                            </LinearGradientBrush>
                        </Rectangle.OpacityMask>
                    </Rectangle>
                    <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <!-- OpacityMask when it's Focused, Defaulted and Mouse is over -->
                    <Trigger Property="IsFocused" Value="True"/>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="OpacityMask" TargetName="rectangle">
                            <Setter.Value>
                                <LinearGradientBrush EndPoint="0,1" SpreadMethod="Repeat">
                                    <GradientStop Offset="1" Color="Transparent"></GradientStop>
                                    <GradientStop Offset="0" Color="Gray"></GradientStop>
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <!-- OpacityMask when it's pressed -->
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Stroke" TargetName="rectangle">
                            <Setter.Value>
                                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                    <GradientStop Color="#FF223472" Offset="0"/>
                                    <GradientStop Color="#FFF2F0F0" Offset="0.911"/>
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="StrokeThickness" TargetName="rectangle" Value="3"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
            <Style x:Key="BlueButtonStyle" TargetType="{x:Type Button}">
                <Setter Property="Background" Value="Blue" />
                <Setter Property="Template" Value="{StaticResource BaseMainButtonTemplate}">
                </Setter>
            </Style>
            <Style x:Key="RedButtonStyle" TargetType="{x:Type Button}">
                <Setter Property="Background" Value="Red" />
                <Setter Property="Template" Value="{StaticResource BaseMainButtonTemplate}">
                </Setter>
            </Style>
            <Style x:Key="GreenButtonStyle" TargetType="{x:Type Button}">
                <Setter Property="Background" Value="Green" />
                <Setter Property="Template" Value="{StaticResource BaseMainButtonTemplate}">
                </Setter>
            </Style>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <StackPanel>
                <Button Style="{StaticResource BlueButtonStyle}" Height="30" Content="Test">
                </Button>
                <Button Style="{StaticResource RedButtonStyle}" Height="30" Content="Test">
                </Button>
                <Button Style="{StaticResource GreenButtonStyle}" Height="30" Content="Test">
                </Button>
            </StackPanel>
        </Grid>
    
  • 6

    或者,您可以为控制模板中的任何依赖项属性定义“DynamicResource”引用,并在存在可用资源的情况下让它解析它的值 . 例如,你可以设置背景=“”被合并到App.xaml文件,甚至给出一些用户偏好的显示设置或配色方案的用户设置,那么SomeBrushColorVariable可以改变给予不同ResourceDictionaries .

相关问题