wpf - 在 WPF 样式中设置嵌套元素的属性

标签 wpf xaml

我有几种这样的样式(左、右、中),它们的区别仅在于哪些角(如果有)是圆角的。

<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/

相关文章:

wpf - 如何将 RoutedEventHandler 正确传递给 UserControl?

c# - WPF 与 C++,这可能吗?

wpf - 在 WPF 中自定义上下文菜单

wpf - 按钮图像路径未在 wpf 中聚焦

wpf - 你如何在 .xaml 文件中使用 stylecop

.net - DataTemplate 作为具有可定制绑定(bind)的资源

wpf - 使用 WPF/MVVM 从网格中的复选框获取更改事件?

wpf - 如何在 WPF 中流式传输视频?

c# - solidcolorbrush和brush的区别

WPF 文本框 VerticalContentAlignment 不工作