フレームワーク プロパティ メタデータ

フレームワーク プロパティ メタデータのオプションは、Windows Presentation Foundation (WPF) アーキテクチャの WPF フレームワーク レベルにあると見なされるオブジェクト要素のプロパティに対して報告されます。 一般に、WPF フレームワーク レベルが指定されている場合、レンダリング、データ バインディング、プロパティ システムの調整などの機能は、WPF のプレゼンテーション API と実行可能ファイルによって処理されます。 フレームワーク プロパティ メタデータがこれらのシステムによって照会されて、特定の要素プロパティに対する機能固有の特性が決まります。

必須コンポーネント

このトピックでは、ユーザーが Windows Presentation Foundation (WPF) クラスの既存の依存関係プロパティの使用という観点から依存関係プロパティを理解し、「依存関係プロパティの概要」を読んでいることを前提としています。 また、「依存関係プロパティのメタデータ」を読んでいる必要もあります。

フレームワーク プロパティ メタデータによる通知内容

フレームワーク プロパティ メタデータは、次のように分類できます。

  • 要素に影響するレイアウト プロパティの報告 (AffectsArrangeAffectsMeasureAffectsRender)。 プロパティがそれぞれの側面に影響する場合、メタデータにこれらのフラグを設定できます。また、MeasureOverride / ArrangeOverride メソッドをクラスに実装して、特定のレンダリングの動作と情報をレイアウト システムに指定します。 通常、そのような実装では、依存関係プロパティのメタデータでこれらのレイアウト プロパティのいずれかが true であると、プロパティの無効化があるかどうかがチェックされます。無効化があった場合にのみ、新しいレイアウト パスの要求が必要となります。

  • 要素の親要素に影響するレイアウト プロパティの報告 (AffectsParentArrangeAffectsParentMeasure)。 これらのフラグが既定で設定される例は、FixedPage.LeftParagraph.KeepWithNext などです。

  • Inherits。 既定では、依存関係プロパティは値を継承しません。 OverridesInheritanceBehavior を使用すると、継承のパスがビジュアル ツリー内を通ることもできるようになります。コントロールを複合する一部のシナリオでは、このような必要が生じることがあります。

    注意

    プロパティ値のコンテキストにおける "継承" という用語は、依存関係プロパティに固有の事項を意味します。つまり、WPF プロパティ システムの WPF フレームワーク レベルの機能によって、実際の依存関係プロパティ値を子要素が親要素から継承できることを意味します。 派生型を通じたマネージド コードの型およびメンバーの継承とは直接関係はありません。 詳細については、「プロパティ値の継承」を参照してください。

  • データ バインディング特性の報告 (IsNotDataBindableBindsTwoWayByDefault)。 既定では、フレームワークの依存関係プロパティは、一方向のバインディング動作を持つデータ バインディングをサポートします。 必要がない場合はデータ バインディングを無効にできます (柔軟性と拡張性を目的とするため、既定の WPF API にそのようなプロパティの例は多くありません)。 複数のコンポーネント間でコントロールの動作を関連付けるプロパティ (IsSubmenuOpen など) や、ユーザーにとって双方向のバインディングが一般的かつ期待されるシナリオであるプロパティ (Text など) に対しては、双方向のバインディングを既定として設定できます。 データ バインディング関連のメタデータを変更した場合に影響を受けるのは既定値だけです。この既定値は、バインディングごとにいつでも変更できます。 バインディング モードおよびバインディング全般の詳細については、「データ バインドの概要」を参照してください。

  • ジャーナリングをサポートするアプリケーションまたはサービスによって、プロパティをジャーナリングするかどうかの報告 (Journal)。 一般的な要素に対しては、ジャーナリングは既定で有効になりませんが、特定のユーザー入力コントロールに対しては選択的に有効になります。 これは、WPF のジャーナリングの実装を含む、ジャーナリング サービスによって読み取られるプロパティです。通常は、複数のナビゲーション ステップにわたって永続化する必要があるユーザー コントロール (一覧におけるユーザー選択など) に設定します。 ジャーナリングの詳細については、「ナビゲーションの概要」を参照してください。

FrameworkPropertyMetadata の読み取り

上でリンクされている各プロパティは、FrameworkPropertyMetadata によって直接の基底クラス UIPropertyMetadata に追加される特定のプロパティです。 これらのプロパティの既定値はいずれも false です。 これらのプロパティの値を知るためにメタデータを要求する場合は、返されたメタデータを FrameworkPropertyMetadata にキャストしてから、必要に応じて個々のプロパティの値を確認する必要があります。

メタデータの指定

新しい依存関係プロパティの登録にメタデータを適用する目的で、メタデータ インスタンスを新しく作成するときは、基底の PropertyMetadata を使用するか、FrameworkPropertyMetadata などの派生クラスを使用するかを選択できます。 通常は FrameworkPropertyMetadata を使用します。特に、プロパティがプロパティ システムと対話する場合や、レイアウトやデータ バインディングなどの WPF 機能と対話する場合はこのクラスを使用します。 より高度なシナリオでは、FrameworkPropertyMetadata から派生して独自のメタデータ報告クラスを作成し、メンバーに追加情報が含まれるようにします。 PropertyMetadata または UIPropertyMetadata を使用して、実装の機能をサポートする度合いを通知することもできます。

既存のプロパティ (AddOwner または OverrideMetadata の呼び出し) については、常に元の登録で使用されているメタデータ型によりオーバーライドする必要があります。

FrameworkPropertyMetadata のインスタンスを作成する場合、フレームワーク プロパティの特性を通知する特定のプロパティの値をそのメタデータに読み込むには、次の 2 つの方法があります。

  1. flags パラメーターを使用可能な FrameworkPropertyMetadata コンストラクター シグネチャを使用します。 このパラメーターには、FrameworkPropertyMetadataOptions 列挙フラグの結合された該当する値をすべて指定します。

  2. flags パラメーターを持たないシグネチャのいずれかを使用し、各特性の任意の変更について、FrameworkPropertyMetadata 上の各報告ブール型プロパティを true に設定します。 この場合、この依存関係プロパティを持つすべての要素の構築前に、これらのプロパティを設定する必要があります。flags パラメーターを使用せずに引き続きメタデータを読み込めるよう、これらのブール型プロパティは読み書き可能な状態ですが、プロパティの使用前にメタデータを事実上シールする必要があります。 そのため、メタデータの要求後にこれらのプロパティを設定しようとすると、無効な操作となります。

フレームワーク プロパティ メタデータのマージ動作

フレームワーク プロパティ メタデータをオーバーライドすると、さまざまなメタデータ特性がマージされるか置き換えられます。

この動作は Merge によって実装され、派生メタデータ クラスでオーバーライドできます。

関連項目