2

拡張するクラスを作成し、たとえばで宣言されているUserControlaのデフォルト値を設定したい場合は、次のような静的コンストラクターを追加できます。DependencyPropertyUserControlFontSize

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値はVisualStudioのプロパティウィンドウにポップアップツールチップとして表示されます。私の質問は、メタデータをオーバーライドするのと同様の方法DescriptionAttributeでこれの値を設定することは可能ですか?DependencyPropertyまたは、CLRゲッター/セッターのプロパティと属性の宣言を保持する必要がありますか?

よろしくお願いします。

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 に答える