依存関係プロパティのメタデータは、PropertyMetadataクラスの他に、PropertyMetadataクラスを継承したUIPropertyMetadataクラスや、FrameworkPropertyMetadataクラスがあります。UIPropertyMetadataクラスは、WPFのアニメーションを無効化にする機能を提供します。UIPropertyMetadataクラスを継承したFrameworkPropertyMetadataクラスは、FrameworkPropertyMetadataOptions列挙体によるレイアウトシステムへの影響の有無の設定や値の継承の有無の設定、データバインディングのデフォルト値の設定などWPFのフレームワークレベルの設定をサポートしています。カスタムコントロールを作成する場合などは通常FrameworkPropertyMetadataクラスを依存関係プロパティのメタデータに使用するといいでしょう。
FrameworkPropertyMetadataクラスの使用方法の一例として、子要素へ継承するプロパティの定義方法を以下に示します。
publicclass Person : FrameworkElement { publicstaticreadonly DependencyProperty FirstNameProperty = DependencyProperty.Register( "FirstName", typeof(string), typeof(Person), new FrameworkPropertyMetadata(null)); publicstring FirstName { get { return (string)GetValue(FirstNameProperty); } set { SetValue(FirstNameProperty, value); } } publicstaticreadonly DependencyProperty LastNameProperty = DependencyProperty.Register( "LastName", typeof(string), typeof(Person), // 子要素へ継承するプロパティnew FrameworkPropertyMetadata( null, FrameworkPropertyMetadataOptions.Inherits)); publicstring LastName { get { return (string)GetValue(LastNameProperty); } set { SetValue(LastNameProperty, value); } } publicvoid AddChild(Person child) { this.AddLogicalChild(child); } }
FrameworkElementという、DependencyObjectを間接的に継承したオブジェクトを継承してPersonクラスを作成しています。Personクラスには、名前を表すFirstName依存関係プロパティと、苗字を表すLastName依存関係プロパティがあります。苗字は、親子関係にある場合は同じものを使用するのが自然なので、FrameworkPropertyMetadataを使って、Inheritsを指定しています。親子関係の構築は、FrameworkElementクラスのAddLogicalChildメソッドを使って指定しています。
Personクラスの使用例を以下に示します。親と子のインスタンスを作って親のほうにだけLastNameプロパティを指定します。その状態で、親と子の両方のLastNameプロパティとFirstNameプロパティを表示しています。
[STAThread] // FrameworkElement使うのに必要staticvoid Main(string[] args) { var parent = new Person { FirstName = "taro", LastName = "tanaka" }; var child = new Person { FirstName = "jiro" }; parent.AddChild(child); Console.WriteLine("{0} {1}", parent.LastName, parent.FirstName); Console.WriteLine("{0} {1}", child.LastName, child.FirstName); }
実行すると以下のような結果になります。LastNameプロパティの値が継承されていることが確認できます。
tanaka taro tanaka jiro
ここで紹介したFrameworkPropertyMetadataクラスは、カスタムコントロールを作成する場合でもない限り使用することはありませんが、カスタムコントロールを作成するときには、以下のリンクを読んでおくと役に立ちます。
- FrameworkPropertyMetadataクラス:http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkpropertymetadata(v=vs.110).aspx
- フレームワーク プロパティ メタデータ:http://msdn.microsoft.com/ja-jp/library/ms751554(v=vs.110).aspx
過去記事
- WPF4.5入門 その1 「はじめに」
- WPF4.5入門 その2 「WPFとは」
- WPF4.5入門 その3 「Hello world」
- WPF4.5入門 その4 「Mainメソッドはどこにいった?」
- WPF4.5入門 その5 「全てC#でHello world」
- WPF4.5入門 その6 「WPFを構成するものを考えてみる」
- WPF4.5入門 その7 「XAMLのオブジェクト要素と名前空間」
- WPF4.5入門 その8 「オブジェクト要素のプロパティ」
- WPF4.5入門 その9 「コレクション構文」
- WPF4.5入門 その10 「コンテンツ構文」
- WPF4.5入門 その11 「マークアップ拡張」
- WPF4.5入門 その12 「その他のXAMLの機能」
- WPF4.5入門 その13 「簡単なレイアウトを行うコントロール」
- WPF4.5入門 その14 「レイアウトコントロールのCanvasとStackPanel」
- WPF4.5入門 その15 「レイアウトコントロールのDockPanelとWrapPanel」
- WPF4.5入門 その16 「ViewBoxコントロール」
- WPF4.5入門 その17 「ScrollViewerコントロール」
- WPF4.5入門 その18 「Gridコントロール part 1」
- WPF4.5入門 その19 「Gridコントロール part 2」
- WPF4.5入門 その20 「レイアウトに影響を与えるプロパティ」
- WPF4.5入門 その21 「WPFのコンセプトと重要な機能つまみ食い」
- WPF4.5入門 その22 「Buttonコントロール」
- WPF4.5入門 その23 「DataGridコントロール その1」
- WPF4.5入門 その24 「DataGridコントロール その2」
- WPF4.5入門 その25 「TreeViewコントロール その1」
- WPF4.5入門 その26 「TreeViewコントロール その2」
- WPF4.5入門 その28 「Calendarコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その29 「ContextMenuコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その30「Menuコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その31 「ToolBarコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その32 「CheckBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その33 「ComboBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その34 「ListBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その35 「RadioButtonコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その36 「Sliderコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その37 「TabControl」 - かずきのBlog@hatena
- WPF4.5入門 その38 「ファイルダイアログ」 - かずきのBlog@hatena
- WPF4.5入門 その39 「情報を表示するコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その40 「Popup、ToolTip、TextBox、Image、MediaElementコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その41 「DispatcherObject」 - かずきのBlog@hatena
- WPF4.5入門 その42 「WPFのプロパティシステム」 - かずきのBlog@hatena
- WPF4.5入門 その43 「読み取り専用の依存関係プロパティ」 - かずきのBlog@hatena