依存関係プロパティのメタデータをオーバーライドする方法 (WPF .NET)
依存関係プロパティを定義するクラスから派生する場合は、依存関係プロパティとそのメタデータを継承します。 この記事では、OverrideMetadata メソッドを呼び出すことによって、継承された依存関係プロパティのメタデータをオーバーライドする方法について説明します。 メタデータをオーバーライドすると、サブクラス固有の要件に合わせて継承された依存関係プロパティの特性を変更できます。
バックグラウンド
依存関係プロパティを定義するクラスは、PropertyMetadata またはその派生型 (FrameworkPropertyMetadataなど) の特性を指定できます。 これらの特性の 1 つは、依存関係プロパティの既定値です。 依存関係プロパティを定義する多くのクラスでは、依存関係プロパティの登録時にプロパティ メタデータを指定します。 登録中にメタデータが指定されていない場合、WPF プロパティ システムは既定値を持つ PropertyMetadata
オブジェクトを割り当てます。 クラス継承によって依存関係プロパティを継承する派生クラスには、依存関係プロパティの元のメタデータをオーバーライドするオプションがあります。 このようにして、派生クラスは、クラス要件を満たすように依存関係プロパティの特性を選択的に変更できます。 OverrideMetadata(Type, PropertyMetadata)を呼び出すとき、派生クラスは最初のパラメーターとして独自の型を指定し、2 番目のパラメーターとしてメタデータ インスタンスを指定します。
依存関係プロパティのメタデータをオーバーライドする派生クラスは、プロパティ がプロパティ システムによって使用される前に、これを行う必要があります。 依存関係プロパティは、プロパティを登録するクラスのインスタンスがインスタンス化されるときに使用されます。 この要件を満たすために、派生クラスは静的コンストラクター内で OverrideMetadata を呼び出す必要があります。 所有者の型がインスタンス化された後に依存関係プロパティのメタデータをオーバーライドしても、例外は発生しませんが、プロパティ システムの動作に一貫性がありません。 また、派生型は依存関係プロパティのメタデータを複数回オーバーライドできないため、これを試みると例外が発生します。
例
次の例では、派生クラス TropicalAquarium
は、基底クラス Aquarium
から継承された依存関係プロパティのメタデータをオーバーライドします。 メタデータ型は FrameworkPropertyMetadataであり、AffectsRenderなどの UI 関連の WPF フレームワークの特性をサポートします。 派生クラスは継承された AffectsRender
フラグをオーバーライドしませんが、派生クラス インスタンスの AquariumGraphic
の既定値を更新します。
public class Aquarium : DependencyObject
{
// Register a dependency property with the specified property name,
// property type, owner type, and property metadata.
public static readonly DependencyProperty AquariumGraphicProperty =
DependencyProperty.Register(
name: "AquariumGraphic",
propertyType: typeof(Uri),
ownerType: typeof(Aquarium),
typeMetadata: new FrameworkPropertyMetadata(
defaultValue: new Uri("http://www.contoso.com/aquarium-graphic.jpg"),
flags: FrameworkPropertyMetadataOptions.AffectsRender)
);
// Declare a read-write CLR wrapper with get/set accessors.
public Uri AquariumGraphic
{
get => (Uri)GetValue(AquariumGraphicProperty);
set => SetValue(AquariumGraphicProperty, value);
}
}
Public Class Aquarium
Inherits DependencyObject
' Register a dependency property with the specified property name,
' property type, owner type, and property metadata.
Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty =
DependencyProperty.Register(
name:="AquariumGraphic",
propertyType:=GetType(Uri),
ownerType:=GetType(Aquarium),
typeMetadata:=New FrameworkPropertyMetadata(
defaultValue:=New Uri("http://www.contoso.com/aquarium-graphic.jpg"),
flags:=FrameworkPropertyMetadataOptions.AffectsRender))
' Declare a read-write CLR wrapper with get/set accessors.
Public Property AquariumGraphic As Uri
Get
Return CType(GetValue(AquariumGraphicProperty), Uri)
End Get
Set
SetValue(AquariumGraphicProperty, Value)
End Set
End Property
End Class
public class TropicalAquarium : Aquarium
{
// Static constructor.
static TropicalAquarium()
{
// Create a new metadata instance with a modified default value.
FrameworkPropertyMetadata newPropertyMetadata = new(
defaultValue: new Uri("http://www.contoso.com/tropical-aquarium-graphic.jpg"));
// Call OverrideMetadata on the dependency property identifier.
// Pass in the type for which the new metadata will be applied
// and the new metadata instance.
AquariumGraphicProperty.OverrideMetadata(
forType: typeof(TropicalAquarium),
typeMetadata: newPropertyMetadata);
}
}
Public Class TropicalAquarium
Inherits Aquarium
' Static constructor.
Shared Sub New()
' Create a new metadata instance with a modified default value.
Dim newPropertyMetadata As New FrameworkPropertyMetadata(
defaultValue:=New Uri("http://www.contoso.com/tropical-aquarium-graphic.jpg"))
' Call OverrideMetadata on the dependency property identifier.
' Pass in the type for which the new metadata will be applied
' and the new metadata instance.
AquariumGraphicProperty.OverrideMetadata(
forType:=GetType(TropicalAquarium),
typeMetadata:=newPropertyMetadata)
End Sub
End Class
関連項目
.NET Desktop feedback