UWP Setter 自定义 DependencyProperty

Posted

技术标签:

【中文标题】UWP Setter 自定义 DependencyProperty【英文标题】:UWP Setter custom DependencyProperty 【发布时间】:2020-01-18 22:31:09 【问题描述】:

我有一个名为IconTextButton 的自定义控件,它定义了一些属性。

public sealed partial class IconTextButton : UserControl

    public string Label
    
        get => (string)GetValue(LabelProperty);
        set => SetValue(LabelProperty, value);
    
    public static readonly DependencyProperty LabelProperty = DependencyProperty.Register("Label",
                                                                                          typeof(string),
                                                                                          typeof(IconTextButton),
                                                                                          new PropertyMetadata(""));
    public IconElement Icon  get; set; 
    public IconTextButtonLabelPosition LabelPosition
    
        get => (IconTextButtonLabelPosition)GetValue(LabelPositionProperty);
        set
        
            SetValue(LabelPositionProperty, value);
            Grid.SetColumn(LabelTextBlock, value == IconTextButtonLabelPosition.Left ? 0 : 2);
        
    
    public static readonly DependencyProperty LabelPositionProperty = DependencyProperty.Register("LabelPosition", 
                                                                                                  typeof(IconTextButtonLabelPosition), 
                                                                                                  typeof(IconTextButton), 
                                                                                                  new PropertyMetadata(IconTextButtonLabelPosition.Left));
    public Thickness IconTextMargin
    
        get => (Thickness)GetValue(IconTextMarginProperty);
        set => SetValue(IconTextMarginProperty, value);
    
    public static readonly DependencyProperty IconTextMarginProperty = DependencyProperty.Register("IconTextMargin",
                                                                                                   typeof(Thickness),
                                                                                                   typeof(IconTextButton),
                                                                                                   new PropertyMetadata(null));
    public Brush IconBackground
    
        get  return (Brush)GetValue(IconBackgroundProperty); 
        set  SetValue(IconBackgroundProperty, value); 
    
    public static readonly DependencyProperty IconBackgroundProperty = DependencyProperty.Register("IconBackground",
                                                                                          typeof(Brush),
                                                                                          typeof(IconTextButton),
                                                                                          new PropertyMetadata(null));

    public double IconRadius
    
        get => (double)GetValue(IconRadiusProperty);
        set
        
            SetValue(IconRadiusProperty, value);
            IconBackgroundBorder.Width = value * 2;
            IconBackgroundBorder.Height = value * 2;
            IconBackgroundBorder.CornerRadius = new CornerRadius(value);
        
    
    public static readonly DependencyProperty IconRadiusProperty = DependencyProperty.Register("IconRadius",
                                                                                          typeof(double),
                                                                                          typeof(IconTextButton),
                                                                                          new PropertyMetadata(15));

我想根据它的视觉状态改变它的属性,但它没有改变。这是为什么呢?

    <VisualState.Setters>
        <Setter Target="LocalShuffleItem.Label" Value="" />
        <Setter Target="LocalListViewItem.Label" Value="" />
        <Setter Target="LocalGridViewItem.Label" Value="" />
        <Setter Target="LocalShuffleItem.IconTextMargin" Value="0" />
        <Setter Target="LocalListViewItem.IconTextMargin" Value="0" />
        <Setter Target="LocalGridViewItem.IconTextMargin" Value="0" />
    </VisualState.Setters>

【问题讨论】:

你是否在代码中调用了这个状态? @NicoZhu-MSFT 不,因为我使用了AdaptiveTrigger @NicoZhu-MSFT 源码为here 【参考方案1】:

问题是 Label 和 IconTextMargin 不是代码中的依赖属性。

问题在于默认的x:Bind 模型是OneTime。当您在VisualState 中编辑其值时,该属性的值不会更改。请检查IconTextButton 类并将x:Bind 模式更改为OneWay

<TextBlock
    x:Name="LabelTextBlock"
    Grid.Column="2"
    Margin="x:Bind IconTextMargin,Mode=OneWay"
    VerticalAlignment="Center"
    AutomationProperties.AccessibilityView="Raw"
    FontSize="x:Bind FontSize"
    FontWeight="x:Bind FontWeight"
    Foreground="x:Bind Foreground"
    Text="x:Bind Label, Mode=OneWay"
    TextAlignment="Center"
    TextWrapping="Wrap" />

【讨论】:

以上是关于UWP Setter 自定义 DependencyProperty的主要内容,如果未能解决你的问题,请参考以下文章

自定义控制按钮 C# UWP

UWP 自定义矩形形状

如何自定义渲染 UWP 湿墨

UWP 自定义文本框样式

形状的 UWP/XAML 自定义边框

Xamarin.UWP 自定义 ViewCell 存在绑定问题