フレームワーク プロパティ メタデータ
更新 : 2007 年 11 月
フレームワーク プロパティ メタデータのオプションは、Windows Presentation Foundation (WPF) アーキテクチャの WPF フレームワーク レベルにあると見なされるオブジェクト要素のプロパティに対して報告されます一般に、WPF フレームワーク レベルが指定されている場合、レンダリング、データ バインディング、プロパティ システムの調整などの機能が、WPF のプレゼンテーション API と実行可能ファイルによって処理されます。フレームワーク プロパティ メタデータがこれらのシステムによって照会されて、特定の要素プロパティに対する機能固有の特性が決まります。
このトピックには次のセクションが含まれています。
- 必要条件
- フレームワーク プロパティ メタデータによる通知内容
- FrameworkPropertyMetadata の読み取り
- メタデータの指定
- フレームワーク プロパティ メタデータのマージ動作
- 関連トピック
必要条件
このトピックでは、ユーザーが Windows Presentation Foundation (WPF) クラスの既存の依存関係プロパティの使用という観点から依存関係プロパティを理解し、「依存関係プロパティの概要」トピックを通読していることを前提としています。また、「依存関係プロパティのメタデータ」を通読している必要もあります。
フレームワーク プロパティ メタデータによる通知内容
フレームワーク プロパティ メタデータは、次のように分類できます。
要素に影響するレイアウト プロパティ (AffectsArrange、AffectsMeasure、AffectsRender) の報告。プロパティがそれぞれの側面に影響する場合、メタデータにこれらのフラグを設定できます。また、MeasureOverride / ArrangeOverride メソッドをクラスに実装して、特定のレンダリングの動作と情報をレイアウト システムに指定します。通常、そのような実装では、依存関係プロパティのメタデータでこれらのレイアウト プロパティのいずれかが true であると、プロパティの無効化があるかどうかがチェックされます。無効化があった場合にのみ、新しいレイアウト パスの要求が必要となります。
要素の親要素に影響するレイアウト プロパティ (AffectsParentArrange、AffectsParentMeasure) の報告。これらのフラグが既定で設定される例として、FixedPage.Left と Paragraph.KeepWithNext があります。
Inherits。既定では、依存関係プロパティは値を継承しません。OverridesInheritanceBehavior を使用すると、継承のパスがビジュアル ツリー内を通ることもできるようになります。コントロールを複合する一部のシナリオでは、このような必要が生じることがあります。
メモ : プロパティ値のコンテキストにおける "継承" という用語は、依存関係プロパティに固有の事項を意味します。つまり、WPF プロパティ システムの WPF フレームワーク レベルの機能によって、実際の依存関係プロパティ値を子要素が親要素から継承できることを意味します。派生型を通じたマネージ コードの型およびメンバの継承とは、直接関係がありません。詳細については、「プロパティ値の継承」を参照してください。
データ バインディング特性 (IsNotDataBindable、BindsTwoWayByDefault) の報告。既定では、フレームワークの依存関係プロパティは、一方向のバインディング動作を持つデータ バインディングをサポートします。必要がない場合はデータ バインディングを無効にできます (柔軟性と拡張性を目的とするため、既定の WPF API にそのようなプロパティの例は多くありません)。複数のコンポーネント間でコントロールの動作を関連付けるプロパティ (IsSubmenuOpen など) や、ユーザーにとって双方向のバインディングが一般的かつ期待されるシナリオであるプロパティ (Text など) に対しては、双方向のバインディングを既定として設定できます。データ バインディング関連のメタデータを変更した場合に影響を受けるのは既定値だけです。この既定値は、バインディングごとにいつでも変更できます。バインディング モードおよびバインディング全般の詳細については、「データ バインディングの概要」を参照してください。
履歴作成をサポートするアプリケーションまたはサービスによって、プロパティの履歴を作成するかどうか (Journal) の報告。一般的な要素に対しては、履歴作成が既定で有効にされることはありません。特定のユーザー入力コントロールに対して、選択的に有効にします。これは、WPF の履歴作成の実装を含む、履歴サービスによって読み取られるプロパティです。通常、複数のナビゲーション段階にわたって永続化する必要があるユーザー コントロール (一覧におけるユーザー選択など) に設定します。履歴の詳細については、「ナビゲーションの概要」を参照してください。
FrameworkPropertyMetadata の読み取り
上記にリンクを示した各プロパティは、FrameworkPropertyMetadata によって直接の基本クラス UIPropertyMetadata に追加される特定のプロパティです。これらのプロパティの既定値はいずれも false です。これらのプロパティの値を知るためにメタデータを要求する場合は、返されたメタデータを FrameworkPropertyMetadata にキャストしてから、必要に応じて個々のプロパティの値を確認する必要があります。
メタデータの指定
新しい依存関係プロパティの登録にメタデータを適用する目的で、メタデータ インスタンスを新しく作成するときは、基本メタデータ クラス PropertyMetadata を使用するか、FrameworkPropertyMetadata などの派生クラスを使用するかを選択できます。通常は FrameworkPropertyMetadata を使用します。特に、プロパティがプロパティ システムと対話する場合や、レイアウトやデータ バインディングなどの WPF 機能と対話する場合は、このクラスを使用します。より高度なシナリオでは、FrameworkPropertyMetadata から派生して独自のメタデータ報告クラスを作成し、メンバに追加情報が含まれるようにします。PropertyMetadata または UIPropertyMetadata を使用して、実装の機能をサポートする度合いを通知することもできます。
既存のプロパティ (AddOwner 呼び出しまたは OverrideMetadata 呼び出し) は必ず、元の登録で使用されているメタデータ型でオーバーライドします。
FrameworkPropertyMetadata のインスタンスを作成する場合、フレームワーク プロパティの特性を通知する特定のプロパティの値をそのメタデータに読み込むには、次の 2 つの方法があります。
flags パラメータを使用可能な FrameworkPropertyMetadata コンストラクタ シグネチャを使用します。このパラメータには、FrameworkPropertyMetadataOptions 列挙体フラグの結合された値を、必要に応じすべて指定します。
flags パラメータを持たないシグネチャのいずれかを使用し、各特性の任意の変更について、FrameworkPropertyMetadata 上の報告する各 Boolean プロパティを true に設定します。この場合、この依存関係プロパティを持つすべての要素の構築前に、これらのプロパティを設定する必要があります。flags パラメータを使用せずにメタデータを読み込めるよう、これらの Boolean プロパティは読み書き可能な状態ですが、プロパティ使用前にメタデータを事実上シールする必要があります。そのため、メタデータの要求後にこれらのプロパティを設定しようとすると、無効な操作となります。
フレームワーク プロパティ メタデータのマージ動作
フレームワーク プロパティ メタデータをオーバーライドすると、さまざまなメタデータ特性が、マージされるか置き換えられます。
PropertyChangedCallback はマージされます。新しい PropertyChangedCallback を追加すると、そのコールバックがメタデータに格納されます。オーバーライド時に PropertyChangedCallback を指定しないと、PropertyChangedCallback の値が昇格され、メタデータでそれを指定した最も近い先祖からの参照となります。
PropertyChangedCallback の実際のプロパティ システム動作では、階層内のすべてのメタデータ所有者用の実装が維持されてテーブルに追加されます。プロパティ システムによる実行順序としては、最派生クラスのコールバックが最初に呼び出されます。継承されたコールバックは、それらをメタデータに配置したクラスによって所有されていると見なされ、それぞれ 1 回だけ実行されます。
DefaultValue は置き換えられます。オーバーライド時に PropertyChangedCallback を指定しないと、DefaultValue の値は、メタデータでそれを指定した最も近い先祖によって決まります。
CoerceValueCallback 実装は置き換えられます。新しい CoerceValueCallback を追加すると、そのコールバックがメタデータに格納されます。オーバーライド時に CoerceValueCallback を指定しないと、CoerceValueCallback の値が昇格され、メタデータでそれを指定した最も近い先祖からの参照となります。
プロパティ システム動作では、直接のメタデータ内の CoerceValueCallback だけが呼び出されます。階層内の他の CoerceValueCallback 実装への参照は行われません。
FrameworkPropertyMetadataOptions のフラグは、継承されたメタデータの FrameworkPropertyMetadata 上にある同等のブール型プロパティ値に対して、ビット単位の論理和演算で結合されます。IsAnimationProhibited は、新しい値に置き換えられるか、継承されたメタデータからの値を永続化します。
この動作は Merge によって実装され、派生メタデータ クラス上でオーバーライドできます。