Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以像在WPF中扩展样式那样扩展ControlTemplate?_Wpf_Controltemplate - Fatal编程技术网

是否可以像在WPF中扩展样式那样扩展ControlTemplate?

是否可以像在WPF中扩展样式那样扩展ControlTemplate?,wpf,controltemplate,Wpf,Controltemplate,问题是我有一个主控件模板,它定义了我们正在设计的新按钮外观的最基本内容。但我想为这个按钮做3个其他的控制模板,这样我们就可以在这些模板中设置不同的颜色;但是我不想复制粘贴主ControlTemplate并在那里更改颜色,而是想从中“继承”(就像样式中的BasedOn属性)并更改继承的ControlTemplate中的颜色 这可能吗 谢谢 找到了解决办法。您不扩展ControlTemplates,而是定义所需的所有基本行为,然后让样式或控件本身对其进行修改。以下面的例子为例。ControlTemp

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

这可能吗


谢谢

找到了解决办法。您不扩展ControlTemplates,而是定义所需的所有基本行为,然后让样式或控件本身对其进行修改。以下面的例子为例。ControlTemplate为我的矩形设置不透明材质和圆角,样式为每个按钮设置背景颜色(借助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>

或者,您可以在控件模板中定义对任何依赖项属性的“DynamicSource”引用,并让它在存在可用资源的情况下解析其值。 例如,您可以设置Background=“{DynamicResource SomeBrushColorVariable}”
然后,SomeBrushColorVariable可以更改合并到App.xaml文件中的不同ResourceDictionary,甚至可以更改用户根据某些用户首选项显示设置或颜色方案设置的ResourceDictionary

是的,那是最好的办法。不严格地说,ControlTemplate应该定义其中的内容,样式修改ControlTemplate上的属性以定义其实际外观。如果控件模板中有控件没有的属性,则此操作无效。