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的主要内容,如果未能解决你的问题,请参考以下文章