依存関係プロパティのフレームワーク プロパティ メタデータ オプションは、Windows Presentation Foundation (WPF) フレームワーク レベルで設定できます。 WPF フレームワーク レベルの指定は、WPF プレゼンテーション API と実行可能ファイルがレンダリングとデータ バインディングを処理する場合に適用されます。 プレゼンテーション API と実行可能ファイルは、依存関係プロパティの FrameworkPropertyMetadata に対してクエリを実行します。
[前提条件]
この記事では、依存関係プロパティの基本的な知識と、依存関係プロパティの概要
フレームワークプロパティメタデータカテゴリ
FrameworkPropertyMetadata は、次のカテゴリに分類されます。
要素のレイアウト 、特に AffectsArrange、AffectsMeasure、および AffectsRender メタデータ フラグに影響するメタデータ。 依存関係プロパティの実装が視覚的な側面に影響し、クラスに MeasureOverride または ArrangeOverride を実装している場合は、これらのフラグを設定できます。
MeasureOverride
およびArrangeOverride
メソッドは、実装固有の動作とレンダリング情報をレイアウト システムに提供します。 依存関係プロパティのメタデータでAffectsArrange
、AffectsMeasure
、またはAffectsRender
がtrue
に設定され、その有効な値が変更されると、WPF プロパティ システムは、再描画をトリガーする要素のビジュアルを無効にする要求を開始します。要素の親要素のレイアウト 、特に AffectsParentArrange および AffectsParentMeasure メタデータ フラグに影響するメタデータ。 これらのフラグを設定する WPF 依存関係プロパティの例としては、FixedPage.Left と Paragraph.KeepWithNextがあります。
プロパティ値の継承メタデータ。具体的には、Inherits および OverridesInheritanceBehavior メタデータ フラグ。 既定では、依存関係プロパティは値を継承しません。 OverridesInheritanceBehavior では、継承の経路をビジュアル ツリーに移動することもできます。これは、一部のコントロール合成シナリオに必要です。 詳細については、「プロパティ値の継承
」を参照してください。 注
プロパティ値のコンテキストでの "inherits" という用語は依存関係プロパティに固有であり、派生型を介したマネージド コードの型とメンバーの継承とは直接関係しません。 依存関係プロパティのコンテキストでは、子要素が親要素から依存関係プロパティ値を継承できることを意味します。
データ バインディング メタデータ(具体的には、BindsTwoWayByDefault および IsNotDataBindable メタデータ フラグ)。 既定では、WPF フレームワークの依存関係プロパティは一方向バインディングをサポートします。 プロパティ が状態を報告し、プロパティ がユーザーアクションによって変更可能である場合、双方向バインディングを既定値として設定することを検討してください。IsSelected また、コントロールのユーザーがプロパティを実装することを期待する場合は、双方向バインディングを既定値として設定することを検討してください (たとえば、TextBox.Text
)。 BindsTwoWayByDefault
は、既定のバインド モードにのみ影響します。 バインドのデータ フローの方向を編集するには、Binding.Mode設定します。 IsNotDataBindable
を使用して、データ バインディングのユース ケースがない場合に無効にすることができます。 データ バインディングの詳細については、「データ バインディングの概要」を参照してください。メタデータ、具体的には Journal メタデータ フラグのジャーナリングについて。
Journal
フラグの既定値は、一部の依存関係プロパティ (true
など) に対してのみ SelectedIndex されます。 ユーザー入力コントロールでは、格納する必要があるユーザー選択を保持する値を持つプロパティに対して、Journal
フラグを設定する必要があります。Journal
フラグは、WPF ジャーナリング サービスなど、ジャーナリングをサポートするアプリケーションまたはサービスによって読み取られます。 ナビゲーションステップの保存については、「ナビゲーションの概要」を参照してください。
FrameworkPropertyMetadata
UIPropertyMetadataから直接派生し、ここで説明するフラグを実装します。 特に設定しない限り、FrameworkPropertyMetadata
フラグの既定値は false
です。
FrameworkPropertyMetadata の読み取り
依存関係プロパティのメタデータを取得するには、GetMetadata 識別子に対して DependencyProperty を呼び出します。
GetMetadata
呼び出しは、PropertyMetadata
オブジェクトを返します。 フレームワークメタデータ値をクエリする必要がある場合は、PropertyMetadata
を FrameworkPropertyMetadataにキャストします。
FrameworkPropertyMetadata の指定
依存関係プロパティを登録するときは、メタデータを作成して割り当てるオプションがあります。 割り当てるメタデータ オブジェクトは、PropertyMetadata することも、その派生クラスの 1 つ (FrameworkPropertyMetadataなど) にすることもできます。 レンダリングとデータ バインディングに WPF プレゼンテーション API と実行可能ファイルに依存する依存関係プロパティの FrameworkPropertyMetadata
を選択します。 より高度なオプションは、FrameworkPropertyMetadata
から派生して、より多くのフラグを持つカスタム メタデータ レポート クラスを作成することです。 または、UI レンダリングに影響するフレームワーク以外のプロパティに UIPropertyMetadata を使用することもできます。
メタデータ オプションは通常、新しい依存関係プロパティの登録中に設定されますが、OverrideMetadata または AddOwner 呼び出しで再指定できます。 メタデータをオーバーライドする場合は、プロパティの登録時に使用されたのと同じメタデータ型で常にオーバーライドします。
FrameworkPropertyMetadata
によって公開されるプロパティ特性は、フラグと呼ばれることもあります。
FrameworkPropertyMetadata
インスタンスを作成する場合、フラグ値を設定する方法は 2 つあります。
FrameworkPropertyMetadataOptions 列挙型のインスタンスにフラグを設定します。
FrameworkPropertyMetadataOptions
では、ビットごとの OR の組み合わせでメタデータ フラグを指定できます。 次に、FrameworkPropertyMetadata
パラメーターを持つコンストラクターを使用してFrameworkPropertyMetadataOptions
をインスタンス化し、FrameworkPropertyMetadataOptions
インスタンスを渡します。FrameworkPropertyMetadataOptions
コンストラクターに FrameworkPropertyMetadata を渡した後でメタデータ フラグを変更するには、新しいFrameworkPropertyMetadata
インスタンスの対応するプロパティを変更します。 たとえば、FrameworkPropertyMetadataOptions.NotDataBindable フラグを設定した場合は、FrameworkPropertyMetadata.IsNotDataBindable をfalse
に設定して元に戻すことができます。FrameworkPropertyMetadata
パラメーターを持たないコンストラクターを使用してFrameworkPropertyMetadataOptions
をインスタンス化し、Booleanに適用可能なFrameworkPropertyMetadata
フラグを設定します。FrameworkPropertyMetadata
インスタンスを依存関係プロパティに関連付ける前にフラグ値を設定します。それ以外の場合は、InvalidOperationExceptionを取得します。
メタデータのオーバーライド動作
フレームワーク プロパティのメタデータをオーバーライドすると、変更されたメタデータ値が元の値に置き換えられるか、元の値にマージされます。
PropertyChangedCallbackの場合、既定のマージ ロジックはテーブル内の以前の
PropertyChangedCallback
値を保持し、すべてプロパティの変更時に呼び出されます。 コールバックの順序は、階層の基底クラスによって登録されたコールバックが最初に実行されるクラスの深さによって決まります。 継承されたコールバックは 1 回だけ実行され、メタデータに追加されたクラスによって所有されます。DefaultValueの場合、新しい値によって既存の既定値が置き換えられます。 オーバーライド メタデータに
DefaultValue
を指定せず、既存の FrameworkPropertyMetadata にInherits
フラグが設定されている場合、既定値はメタデータでDefaultValue
指定した最も近い先祖から取得されます。CoerceValueCallbackの場合、新しい値によって既存の
CoerceValueCallback
値が置き換えられます。 オーバーライド メタデータにCoerceValueCallback
を指定しない場合、値は、CoerceValueCallback
を指定した継承チェーン内の最も近い先祖から取得されます。継承されていないフラグ
FrameworkPropertyMetadata
場合は、既定のfalse
値をtrue
値でオーバーライドできます。 ただし、true
値は、false
、Inherits、Journal、および OverridesInheritanceBehaviorの SubPropertiesDoNotAffectRender 値でのみオーバーライドできます。
注
既定のマージ ロジックは、Merge メソッドによって実装されます。 依存関係プロパティを継承する派生クラスでカスタム マージ ロジックを指定するには、そのクラスの Merge
をオーバーライドします。
こちらも参照ください
.NET Desktop feedback