wpfコントロール設計時サポート(1)
この部分はほとんどみんなが無視している内容なので、やはり紹介したいと思います.
本編ソースのダウンロード
vs IDEではasp.Net,winfromなどの開発環境では,右側のPropertyGrid属性パネルで属性を分類することができ,コントロール属性の用途を理解するのに有利である.
もしあなたが前にいたら.Netプラットフォームの下でコントロールの開発をしたことがあって、あなたはこれらの機能が属性メタデータを通じて実現したことを知っているべきで、例えばCategoryメタデータを使って、Content属性をContentカテゴリの下に分けます.
この方法はwpfカスタムコントロールの開発において依然として利用可能である.DesginCustomControlというカスタムコントロールを例に挙げます.wpfコントロールであるため、属性は依存項目属性に変更する.
効果は次のとおりです。
本編ソースのダウンロード
1.属性メタデータ
vs IDEではasp.Net,winfromなどの開発環境では,右側のPropertyGrid属性パネルで属性を分類することができ,コントロール属性の用途を理解するのに有利である.
もしあなたが前にいたら.Netプラットフォームの下でコントロールの開発をしたことがあって、あなたはこれらの機能が属性メタデータを通じて実現したことを知っているべきで、例えばCategoryメタデータを使って、Content属性をContentカテゴリの下に分けます.
[Category("Content")]
public object Content { get; set; }
この方法はwpfカスタムコントロールの開発において依然として利用可能である.DesginCustomControlというカスタムコントロールを例に挙げます.wpfコントロールであるため、属性は依存項目属性に変更する.
public class DesginCustomControl : ContentControl
{
[Category("Content")]
public string Content
{
get { return (string)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content", typeof(string), typeof(DesginCustomControl), new UIPropertyMetadata(String.Empty));
}
効果は次のとおりです。 2.属性メタデータの集合
wpfの設計では、これらのメタデータとコントロール属性を分離することができる.簡単な機能を実現します
2.1設計時にサポートされる個別プロジェクトの新規作成
WPF.Controlsはコントロール項目、WPFです.Controls.VisualStudio.Designはコントロール設計時のアイテムです
注意:
(1)プログラムセット命名規則
設計時のプログラムセットは命名規則があるので、VisualStudioのサポートを受けることができる.コントロールセットがWPFである.Controlsでは、設計時のプログラムセットは
コントロールセットの名前+VisualStudio.Design
(2)設計時のプログラムセットのコンパイル位置
設計時のプログラムセットは、設計時のプログラムセットを参照する必要がなく、コントロールと同じディレクトリに保存する必要があります.
仮にWPF.Controlsのコンパイルディレクトリが変更されていなければ、WPF.Controls.VisualStudio.DesignというプロジェクトはコンパイルされてからWPFに存在する.Controlsのbinディレクトリの下の.
(3)Microsoftを引用する.Windows.Designプログラムセット
Microsoft.Windows.Designはwpf設計時にサポートされる基礎ですので、このプログラムセットを参照してください.
2.2属性のメタデータセットの登録
IregisterMetadataというインタフェースを実装します.コードを見てみましょうpublic class WPFControlsCommonMetadata : IRegisterMetadata
{
public void Register()
{
AttributeTableBuilder MainBuilder = new AttributeTableBuilder();
MainBuilder.AddCustomAttributes(typeof(DesginCustomControl),DesginCustomControl.ContentProperty,new Attribute[]{
new CategoryAttribute("Content")});
MetadataStore.AddAttributeTable(MainBuilder.CreateTable());
}
}
AttributeTable Builderは属性メタデータテーブル、msdnは解釈属性テーブルである.AttributeTable Builderには複数のAddCustomAttributesリロード方法がある.属性にメタデータを付加することができる.例えば、上記のコードはDesginCustomControlのContent属性にCategoryAttributeメタデータを追加する.追加してから
MetadataStoreのAddAttributeTableメソッドは属性メタデータテーブルを追加する.MetadataStoreをメタデータ記憶領域と呼ぶ.
以上のコードの実現は、コントロールに直接メタデータラベルを掛ける効果と同様である.どんな違いがありますか.
私たちがaspならNetの内蔵コントロール拡張設計の場合、そのコントロールを継承する必要がある.ここではこの問題はなく、両者は完全に分離されている.
2.3属性メタデータの追加遅延
上記の例では、MainBuilderクラスで直接コントロールにメタデータを追加するが、比較的多くのコントロールにメタデータを追加すると同時にロードするとパフォーマンスに問題が発生するため、MainBuilderはAddCallbackメソッドを提供し、必要に応じてコントロールにメタデータを追加する.次に、上記のサンプルコードを以下のように変更します.public class WPFControlsCommonMetadata : IRegisterMetadata
{
public void Register()
{
AttributeTableBuilder MainBuilder = new AttributeTableBuilder();
MainBuilder.AddCallback(
typeof(DesginCustomControl),
delegate(AttributeCallbackBuilder builder)
{
builder.AddCustomAttributes(DesginCustomControl.ContentProperty, new Attribute[]{
new CategoryAttribute("Content")});
});
MetadataStore.AddAttributeTable(MainBuilder.CreateTable());
}
}
とてもつまらないと感じて、このようなもののためにまた研究しなければなりません:)、役に立つと思ったのは见てみましょう、この编はこんなに多く书いて、书き终わって多くなくて休みに家に帰ることができます.
public class WPFControlsCommonMetadata : IRegisterMetadata
{
public void Register()
{
AttributeTableBuilder MainBuilder = new AttributeTableBuilder();
MainBuilder.AddCustomAttributes(typeof(DesginCustomControl),DesginCustomControl.ContentProperty,new Attribute[]{
new CategoryAttribute("Content")});
MetadataStore.AddAttributeTable(MainBuilder.CreateTable());
}
}
public class WPFControlsCommonMetadata : IRegisterMetadata
{
public void Register()
{
AttributeTableBuilder MainBuilder = new AttributeTableBuilder();
MainBuilder.AddCallback(
typeof(DesginCustomControl),
delegate(AttributeCallbackBuilder builder)
{
builder.AddCustomAttributes(DesginCustomControl.ContentProperty, new Attribute[]{
new CategoryAttribute("Content")});
});
MetadataStore.AddAttributeTable(MainBuilder.CreateTable());
}
}