次の方法で共有


フレームワーク プロパティ メタデータ (WPF .NET)

依存関係プロパティのフレームワーク プロパティ メタデータ オプションは、Windows Presentation Foundation (WPF) フレームワーク レベルで設定できます。 WPF フレームワーク レベルの指定は、WPF プレゼンテーション API と実行可能ファイルがレンダリングとデータ バインディングを処理する場合に適用されます。 プレゼンテーション API と実行可能ファイルは、依存関係プロパティの FrameworkPropertyMetadata に対してクエリを実行します。

前提 条件

この記事では、依存関係プロパティの基本的な知識と、依存関係プロパティの概要読んだことを前提としています。 この記事の例に従うには、拡張アプリケーション マークアップ言語 (XAML) に慣れている場合や、WPF アプリケーションを記述する方法を理解している場合に役立ちます。

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

FrameworkPropertyMetadata は、次のカテゴリに分類されます。

  • 要素のレイアウト 、特に AffectsArrangeAffectsMeasure、および AffectsRender メタデータ フラグに影響するメタデータ。 依存関係プロパティの実装が視覚的な側面に影響し、クラスに MeasureOverride または ArrangeOverride を実装している場合は、これらのフラグを設定できます。 MeasureOverride および ArrangeOverride メソッドは、実装固有の動作とレンダリング情報をレイアウト システムに提供します。 依存関係プロパティのメタデータで AffectsArrangeAffectsMeasure、または AffectsRendertrue に設定され、その有効な値が変更されると、WPF プロパティ システムは、再描画をトリガーする要素のビジュアルを無効にする要求を開始します。

  • 要素の親要素のレイアウト 、特に AffectsParentArrange および AffectsParentMeasure メタデータ フラグに影響するメタデータ。 これらのフラグを設定する WPF 依存関係プロパティの例としては、FixedPage.LeftParagraph.KeepWithNextがあります。

  • プロパティ値の継承メタデータ。具体的には、Inherits および OverridesInheritanceBehavior メタデータ フラグ。 既定では、依存関係プロパティは値を継承しません。 OverridesInheritanceBehavior では、継承の経路をビジュアル ツリーに移動することもできます。これは、一部のコントロール合成シナリオに必要です。 詳細については、「プロパティ値の継承」を参照してください。

    手記

    プロパティ値のコンテキストでの "inherits" という用語は依存関係プロパティに固有であり、派生型を介したマネージド コードの型とメンバーの継承とは直接関係しません。 依存関係プロパティのコンテキストでは、子要素が親要素から依存関係プロパティ値を継承できることを意味します。

  • データ バインディング メタデータ(具体的には、BindsTwoWayByDefault および IsNotDataBindable メタデータ フラグ)。 既定では、WPF フレームワークの依存関係プロパティは一方向バインディングをサポートします。 プロパティ が状態を報告し、プロパティ がユーザーアクションによって変更可能である場合、双方向バインディングを既定値として設定することを検討してください。IsSelected また、コントロールのユーザーがプロパティを実装することを期待する場合は、双方向バインディングを既定値として設定することを検討してください (たとえば、TextBox.Text)。 BindsTwoWayByDefault は、既定のバインド モードにのみ影響します。 バインドのデータ フローの方向を編集するには、Binding.Mode設定します。 IsNotDataBindable を使用して、データ バインディングのユース ケースがない場合に無効にすることができます。 データ バインディングの詳細については、「データ バインディングの概要」を参照してください。

  • メタデータ、具体的には Journal メタデータ フラグのジャーナリングについて。 Journal フラグの既定値は、一部の依存関係プロパティ (SelectedIndexなど) に対してのみ true されます。 ユーザー入力コントロールでは、格納する必要があるユーザー選択を保持する値を持つプロパティに対して、Journal フラグを設定する必要があります。 Journal フラグは、WPF ジャーナリング サービスなど、ジャーナリングをサポートするアプリケーションまたはサービスによって読み取られます。 ナビゲーションステップの保存については、「ナビゲーションの概要参照してください。

FrameworkPropertyMetadataUIPropertyMetadataから直接派生し、ここで説明するフラグを実装します。 特に設定しない限り、FrameworkPropertyMetadata フラグの既定値は falseです。

FrameworkPropertyMetadata の読み取り

依存関係プロパティのメタデータを取得するには、DependencyProperty 識別子に対して GetMetadata を呼び出します。 GetMetadata 呼び出しは、PropertyMetadata オブジェクトを返します。 フレームワークメタデータ値をクエリする必要がある場合は、PropertyMetadataFrameworkPropertyMetadataにキャストします。

FrameworkPropertyMetadata の指定

依存関係プロパティを登録するときは、メタデータを作成して割り当てるオプションがあります。 割り当てるメタデータ オブジェクトは、PropertyMetadata することも、その派生クラスの 1 つ (FrameworkPropertyMetadataなど) にすることもできます。 レンダリングとデータ バインディングに WPF プレゼンテーション API と実行可能ファイルに依存する依存関係プロパティの FrameworkPropertyMetadata を選択します。 より高度なオプションは、FrameworkPropertyMetadata から派生して、より多くのフラグを持つカスタム メタデータ レポート クラスを作成することです。 または、UI レンダリングに影響するフレームワーク以外のプロパティに UIPropertyMetadata を使用することもできます。

メタデータ オプションは通常、新しい依存関係プロパティの登録中に設定されますが、OverrideMetadata または AddOwner 呼び出しで再指定できます。 メタデータをオーバーライドする場合は、プロパティの登録時に使用されたのと同じメタデータ型で常にオーバーライドします。

FrameworkPropertyMetadata によって公開されるプロパティ特性は、フラグと呼ばれることもあります。 FrameworkPropertyMetadata インスタンスを作成する場合、フラグ値を設定する方法は 2 つあります。

  1. FrameworkPropertyMetadataOptions 列挙型のインスタンスにフラグを設定します。 FrameworkPropertyMetadataOptions では、ビットごとの OR の組み合わせでメタデータ フラグを指定できます。 次に、FrameworkPropertyMetadataOptions パラメーターを持つコンストラクターを使用して FrameworkPropertyMetadata をインスタンス化し、FrameworkPropertyMetadataOptions インスタンスを渡します。 FrameworkPropertyMetadata コンストラクターに FrameworkPropertyMetadataOptions を渡した後でメタデータ フラグを変更するには、新しい FrameworkPropertyMetadata インスタンスの対応するプロパティを変更します。 たとえば、FrameworkPropertyMetadataOptions.NotDataBindable フラグを設定した場合は、FrameworkPropertyMetadata.IsNotDataBindablefalseに設定して元に戻すことができます。

  2. FrameworkPropertyMetadataOptions パラメーターを持たないコンストラクターを使用して FrameworkPropertyMetadata をインスタンス化し、FrameworkPropertyMetadataに適用可能な Boolean フラグを設定します。 FrameworkPropertyMetadata インスタンスを依存関係プロパティに関連付ける前にフラグ値を設定します。それ以外の場合は、InvalidOperationExceptionを取得します。

メタデータのオーバーライド動作

フレームワーク プロパティのメタデータをオーバーライドすると、変更されたメタデータ値が元の値に置き換えられるか、元の値にマージされます。

  • PropertyChangedCallbackの場合、既定のマージ ロジックはテーブル内の以前の PropertyChangedCallback 値を保持し、すべてプロパティの変更時に呼び出されます。 コールバックの順序は、階層の基底クラスによって登録されたコールバックが最初に実行されるクラスの深さによって決まります。 継承されたコールバックは 1 回だけ実行され、メタデータに追加されたクラスによって所有されます。

  • DefaultValueの場合、新しい値によって既存の既定値が置き換えられます。 オーバーライド メタデータに DefaultValue を指定せず、既存の FrameworkPropertyMetadataInherits フラグが設定されている場合、既定値はメタデータで DefaultValue 指定した最も近い先祖から取得されます。

  • CoerceValueCallbackの場合、新しい値によって既存の CoerceValueCallback 値が置き換えられます。 オーバーライド メタデータに CoerceValueCallback を指定しない場合、値は、CoerceValueCallbackを指定した継承チェーン内の最も近い先祖から取得されます。

  • 継承されていないフラグ FrameworkPropertyMetadata 場合は、既定の false 値を true 値でオーバーライドできます。 ただし、true 値は、InheritsJournalOverridesInheritanceBehavior、および SubPropertiesDoNotAffectRenderfalse 値でのみオーバーライドできます。

手記

既定のマージ ロジックは、Merge メソッドによって実装されます。 依存関係プロパティを継承する派生クラスでカスタム マージ ロジックを指定するには、そのクラスの Merge をオーバーライドします。

関連項目