如果我创建一个扩展UserControl的类并想为在DependencyProperty中声明的UserControl设置默认值,例如FontSize,则可以添加如下所示的静态构造函数:

static MyUserControl()
{
    UserControl.FontSizeProperty.OverrideMetadata(typeof(MyUserControl),
new FrameworkPropertyMetadata(28.0));
}


在了解OverrideMetadata方法之前,我曾使用以下方法重写该属性并设置DescriptionAttribute

public new static readonly DependencyProperty FontSizeProperty =
DependencyProperty.Register("FontSize", typeof(double), typeof(MyUserControl),
new PropertyMetadata(28.0));

[Description("My custom description."), Category("Text")]
public new double FontSize
{
    get { return (double)GetValue(FontSizeProperty); }
    set { SetValue(FontSizeProperty, value); }
}


当用户将鼠标指针移到相关属性名称上时,DescriptionAttribute值在Visual Studio的“属性”窗口中显示为弹出工具提示。我的问题是,是否可以通过类似于覆盖元数据的方式设置此DescriptionAttributeDependencyProperty值?还是我必须保留CLR getter / setter属性和属性声明?

提前谢谢了。

最佳答案

我发现我可以访问继承的type属性的DescriptionAttribute值,但是只能从实例构造函数而不是静态构造函数访问,因为我需要引用控制对象。另外,我无法使用此方法设置它,因为它是只读属性:

AttributeCollection attributes =
    TypeDescriptor.GetProperties(this)["FontSize"].Attributes;
DescriptionAttribute attribute =
    (DescriptionAttribute)attributes[typeof(DescriptionAttribute)];
attribute.Description = "Custom description"; // not possible - read only property


然后,我从这些文章中发现您无法在运行时更改声明的属性值:


Can attributes be added dynamically in C#?
Programmatically add an attribute to a method or parameter


因此,我将继续使用新的DescriptionAttribute值声明CLR包装器属性,并覆盖静态构造函数中的元数据以仅设置新的默认值。

10-04 15:16