2

如果我创建一个扩展类UserControl并希望为在DependencyProperty中声明的a 设置默认值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 的“属性”窗口中显示为弹出工具提示。我的问题是,是否可以以类似于覆盖元数据的方式设置DescriptionAttributethis 的值?DependencyProperty还是我必须保留 CLR getter/setter 属性和属性声明?

提前谢谢了。

4

1 回答 1

2

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

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

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

  1. 可以在 C# 中动态添加属性吗?
  2. 以编程方式将属性添加到方法或参数

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

于 2012-03-20T23:39:39.093 回答