我Style
在 XAML 中有以下基础,我需要基于它创建一些新样式,每个新样式中只有 1 个属性不同。
<UserControl.Resources>
<Style x:Key="BaseButtonStyle" TargetType="{x:Type ButtonBase}">
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Background" Value="{StaticResource Button.Background}"/>
<Setter Property="BorderBrush" Value="{StaticResource Button.BorderBrush}"/>
<Setter Property="Foreground" Value="{StaticResource Button.Foreground}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="10,1,10,1"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ButtonBase}">
<Grid x:Name="Root" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
<Grid x:Name="FocusState" Opacity="0">
<Border CornerRadius="4" Style="{StaticResource FocusTemplate}"/>
</Grid>
<Grid x:Name="DefaultState">
<Border Background="{StaticResource Button.DefaultState.Border1}"
Padding="1" CornerRadius="3">
<Border Background="{StaticResource Button.DefaultState.Border2}"
Padding="1" CornerRadius="2">
</Border>
</Border>
</Grid>
<Grid x:Name="HoverState" Opacity="0">
<Border Background="{StaticResource Button.HoverState.Border1}"
Padding="1" CornerRadius="3">
<Grid>
<Border Background="{StaticResource Button.HoverState.Border2}"
Padding="1" CornerRadius="2">
<Border Background="{StaticResource Button.HoverState.Border3}"
CornerRadius="1"/>
</Border>
<Border>
<Border.Background>
<RadialGradientBrush>
<RadialGradientBrush.RelativeTransform>
<TranslateTransform X="0" Y="0.5"/>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#00FFFFFF" Offset="1"/>
<GradientStop Color="#BFFFFFFF" Offset="0"/>
</RadialGradientBrush>
</Border.Background>
</Border>
</Grid>
</Border>
</Grid>
<Grid x:Name="PressedState" Opacity="0">
<Border Background="{StaticResource Button.PressedState.Border1}"
Padding="1" CornerRadius="3">
<Border Background="{StaticResource Button.PressedState.Border2}"
Padding="1" CornerRadius="2">
<Border Background="{StaticResource Button.PressedState.Border3}"
CornerRadius="1"/>
</Border>
</Border>
</Grid>
<Grid x:Name="CheckedState" Opacity="0">
<Border Background="{StaticResource Button.CheckedState.Border1}"
Padding="1" CornerRadius="3">
<Border Background="{StaticResource Button.CheckedState.Border2}"
Padding="1" CornerRadius="2">
<Border Background="{StaticResource Button.CheckedState.Border3}"
CornerRadius="1"/>
</Border>
</Border>
</Grid>
<Grid Margin="2">
<ContentPresenter Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Grid>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="DefaultState" Property="Opacity" Value="0"/>
<Setter TargetName="HoverState" Property="Opacity" Value="1"/>
<Setter TargetName="PressedState" Property="Opacity" Value="0"/>
<Setter TargetName="CheckedState" Property="Opacity" Value="0"/>
<Setter Property="Foreground"
Value="{StaticResource Button.Foreground}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="DefaultState" Property="Opacity" Value="0"/>
<Setter TargetName="HoverState" Property="Opacity" Value="0"/>
<Setter TargetName="PressedState" Property="Opacity" Value="1"/>
<Setter TargetName="CheckedState" Property="Opacity" Value="0"/>
<Setter Property="Foreground"
Value="{StaticResource Button.Foreground}"/>
</Trigger>
<Trigger Property="ToggleButton.IsChecked" Value="True">
<Setter TargetName="DefaultState" Property="Opacity" Value="0"/>
<Setter TargetName="HoverState" Property="Opacity" Value="0"/>
<Setter TargetName="PressedState" Property="Opacity" Value="0"/>
<Setter TargetName="CheckedState" Property="Opacity" Value="1"/>
<Setter Property="Foreground"
Value="{StaticResource Button.Foreground}"/>
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="FocusState" Property="Opacity" Value="1"/>
</Trigger>
<Trigger Property="Button.IsDefaulted" Value="True">
<Setter TargetName="FocusState" Property="Opacity" Value="1"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Root" Property="Opacity" Value="0.35"/>
<Setter Property="Foreground"
Value="{StaticResource Button.Foreground}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<UserControl.Resources>
我将其设置为基本 Button 样式使用
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"/>
到目前为止,一切都很好。接下来我想要第二种风格,唯一不同的部分是
<Border Background="{StaticResource Button.DefaultState.BorderNEWZ}"
//instead of
<Border Background="{StaticResource Button.DefaultState.Border2}"
所以我尝试了 NEWSTYLETEST ......
<Style x:Key="NEWSTYLETEST" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ButtonBase}">
<Grid x:Name="Root" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
<Grid x:Name="FocusState" Opacity="0">
<Border CornerRadius="4" Style="{StaticResource FocusTemplate}"/>
</Grid>
<Grid x:Name="DefaultState">
<Border Background="{StaticResource Button.DefaultState.Border1}"
Padding="1" CornerRadius="3">
<Border Background="{StaticResource Button.DefaultState.BorderNEWZ}"
Padding="1" CornerRadius="2">
</Border>
</Border>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这确实将我需要的控制部分从Button.DefaultState.Border2
to更改为,但它省略了基本样式Button.DefaultState.BorderNEWZ
中其余部分中包含的其余值。<Setter Property="Template">
<Setter Property="Template">
我可以每次都复制整个并更改我需要的行,但这似乎有点矫枉过正。有没有办法只Button.DefaultState.Border2
针对每种新样式的更改,同时保持其他所有内容相同而不重复大量代码?