我有几种这样的样式(左、右、中),它们的区别仅在于哪些角(如果有)是圆角的。
<Style x:Key="ToggleRadioButtonLeft"
TargetType="{x:Type ToggleButton}"
BasedOn="{StaticResource {x:Type ToggleButton}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border BorderBrush="Blue"
Background="{TemplateBinding Background}"
Padding="15,0"
BorderThickness="1"
CornerRadius="10,0,0,10"> <!-- extract this -->
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="Blue"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Background" Value="White"/>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
我希望能够创建一个没有任何圆角的基本样式(即中心按钮样式),然后再创建两个基于它的为左侧和最右侧元素设置圆角的样式,但我无法弄清楚如何在派生样式中设置边框半径,因为它不是样式中的顶级元素。
最佳答案
我知道 3 个以您正在寻找的方式自定义模板的选项
1) 创建一个从 ToggleButton 派生的 userControl,添加一个 RadiusValue
那里的依赖属性(类型 CornerRadius
)并在控制模板中使用它:CornerRadius="{TemplateBinding RadiusValue}"
.
2)使用动态资源。
在遇到动态资源的障碍 (Wpf dynamic resource lookup for Validation.ErrorTemplate) 后,我更喜欢第三个
3) 使用附加的依赖属性
起初我创建了一个类型为 CornerRadius
的附加 DP (默认半径 = 3)
public static class Attached
{
public static readonly DependencyProperty RadiusValueProperty =
DependencyProperty.RegisterAttached("RadiusValue", typeof (CornerRadius), typeof (Attached), new FrameworkPropertyMetadata(new CornerRadius(3)));
public static void SetRadiusValue(DependencyObject element, CornerRadius value)
{
element.SetValue(RadiusValueProperty, value);
}
public static CornerRadius GetRadiusValue(DependencyObject element)
{
return (CornerRadius)element.GetValue(RadiusValueProperty);
}
}
之后我修改了自定义 ToggleButton 模板:
<Style x:Key="ToggleRadioButton"
TargetType="{x:Type ToggleButton}"
BasedOn="{StaticResource {x:Type ToggleButton}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border BorderBrush="Blue"
Background="{TemplateBinding Background}"
Padding="15,0"
BorderThickness="1"
CornerRadius="{Binding Path=(local:Attached.RadiusValue),
RelativeSource={RelativeSource TemplatedParent}}">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="Blue"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Background" Value="White"/>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
唯一的变化(除了关键)是
CornerRadius="{Binding Path=(local:Attached.RadiusValue),
RelativeSource={RelativeSource TemplatedParent}}">
最后为 Left RadioButton 派生样式,基于
ToggleRadioButton
<Style x:Key="ToggleRadioButtonLeft"
TargetType="{x:Type ToggleButton}"
BasedOn="{StaticResource ToggleRadioButton}">
<Setter Property="local:Attached.RadiusValue" Value="10,0,0,10"/>
</Style>
关于wpf - 在 WPF 样式中设置嵌套元素的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40657840/