所以问题是我有一个主要的ControlTemplate,它定义了我们正在设计的新按钮外观的最基本的东西 . 但是我想为这个按钮做3个其他的控制模板,所以我们可以设置不同的颜色;但我不想复制粘贴主ControlTemplate并更改那里的颜色,而是我想从那里“继承”(与Style中的BasedOn属性一样)并更改继承的ControlTemplate中的颜色 .
这可能吗?
谢谢!
找到了解决方案 . 您不扩展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>
或者,您可以为控制模板中的任何依赖项属性定义“DynamicResource”引用,并在存在可用资源的情况下让它解析它的值 . 例如,你可以设置背景=“”被合并到App.xaml文件,甚至给出一些用户偏好的显示设置或配色方案的用户设置,那么SomeBrushColorVariable可以改变给予不同ResourceDictionaries .
2 回答
找到了解决方案 . 您不扩展ControlTemplates,而是定义所需的所有基本行为,然后让样式或控件本身修改它 . 以下面的例子为例 . ControlTemplate为我的矩形设置OpacityMask和圆角,Styles设置每个按钮的背景颜色(借助TemplateBinding),这是我的解决方案:
或者,您可以为控制模板中的任何依赖项属性定义“DynamicResource”引用,并在存在可用资源的情况下让它解析它的值 . 例如,你可以设置背景=“”被合并到App.xaml文件,甚至给出一些用户偏好的显示设置或配色方案的用户设置,那么SomeBrushColorVariable可以改变给予不同ResourceDictionaries .