【问题标题】:WPF control template property set via style [duplicate]通过样式设置的WPF控件模板属性[重复]
【发布时间】:2018-09-26 09:17:30
【问题描述】:

在我们的项目中,我们有按钮的默认样式,它定义了按钮的模板,并且有一个Border 属性为CornerRadius="0"

<Style TargetType="Button" x:Key="TemplatedButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border BorderBrush="{TemplateBinding BorderBrush}"
                        CornerRadius="0"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}"
                        Padding="{TemplateBinding Padding}"
                        Cursor="{TemplateBinding Cursor}"
                        >
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                      ContentStringFormat="{TemplateBinding ContentStringFormat}"
                                      RecognizesAccessKey="True"
                                      />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Button控件没有CornerRadius属性,因此无法将该属性绑定到TemplateBinding,但是对于某些控件我们需要自定义CornerRadius属性:

<Button Style="{StaticResource TemplatedButton}" x:Name="btn1" Content="Button with radius" /*HERE WE NEED TO SET CUSTOM CornerRadius*/ />

是否有可能以某种方式改变拐角半径?也许是继承它的风格,或者通过向 btn1 添加资源?

我看到可以通过将具有相同键的资源设置为不同的值来自定义默认属性,但不知道如何实现。如果您提供有关如何实现它的任何教程或文档,将不胜感激。

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    您需要创建一个继承自Button的新类,并添加所需的属性

    public class ExtendedButton: Button
    {
        public CornerRadius CornerRadius
        {
            get { return (CornerRadius)GetValue(CornerRadiusProperty); }
            set { SetValue(CornerRadiusProperty, value); }
        }
    
        public static readonly DependencyProperty CornerRadiusProperty =
            DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(ExtendedButton), new PropertyMetadata(default(CornerRadius)));
    }
    

    然后您可以使用它来代替您的样式/视图中的标准按钮。

    【讨论】:

    • 是的,我知道这种编码方式,在这种情况下它可以工作,但总是创建嵌套控件不是解决方案,它很重。感谢您的解决方案,但我想我找到了我正在寻找的东西:使用 DynamicResource 并在控制资源(或嵌套样式的资源)中声明 &lt;CornerRadius 具有相同的键但不同的值。刚刚检查过,它可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2011-01-22
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多