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