我在XAML中有以下基礎Style
,我需要基於它創建幾個新樣式,每種新樣式中只有1個屬性不同。在XAML中設置樣式
<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>
和我設置爲使用
<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
到Button.DefaultState.BorderNEWZ
控制部分,但它以基礎樣式省略了其餘<Setter Property="Template">
中包含的其餘值。
我可以複製整個<Setter Property="Template">
每次和改變我需要的線,但似乎矯枉過正。有沒有一種方法只針對每種新風格的變化Button.DefaultState.Border2
,同時保持其他所有內容不變,而不重複大塊代碼?