Bagikan melalui


Cara mengambil alih metadata untuk properti dependensi (WPF .NET)

Saat Anda berasal dari kelas yang menentukan properti dependensi, Anda mewarisi properti dependensi dan metadatanya. Artikel ini menjelaskan bagaimana Anda dapat mengambil alih metadata properti dependensi yang diwariskan dengan memanggil OverrideMetadata metode . Mengesampingkan metadata memungkinkan Anda memodifikasi karakteristik properti dependensi yang diwariskan agar sesuai dengan persyaratan khusus subkelas.

Penting

Dokumentasi Panduan Desktop untuk .NET 7 dan .NET 6 sedang dibangun.

Latar belakang

Kelas yang menentukan properti dependensi dapat menentukan karakteristiknya di PropertyMetadata atau salah satu jenis turunannya, seperti FrameworkPropertyMetadata. Salah satu karakteristik tersebut adalah nilai default properti dependensi. Banyak kelas yang menentukan properti dependensi, menentukan metadata properti selama pendaftaran properti dependensi. Ketika metadata tidak ditentukan selama pendaftaran, sistem properti WPF menetapkan PropertyMetadata objek dengan nilai default. Kelas turunan yang mewarisi properti dependensi melalui pewarisan kelas memiliki opsi untuk mengambil alih metadata asli properti dependensi apa pun. Dengan cara ini, kelas turunan dapat secara selektif memodifikasi karakteristik properti dependensi untuk memenuhi persyaratan kelas. Saat memanggil OverrideMetadata(Type, PropertyMetadata), kelas turunan menentukan jenisnya sendiri sebagai parameter pertama, dan instans metadata sebagai parameter kedua.

Kelas turunan yang mengambil alih metadata pada properti dependensi harus melakukannya sebelum properti ditempatkan dalam penggunaan oleh sistem properti. Properti dependensi ditempatkan dalam penggunaan ketika instans kelas apa pun yang mendaftarkan properti dibuat. Untuk membantu memenuhi persyaratan ini, kelas turunan harus memanggil OverrideMetadata dalam konstruktor statisnya. Mengambil alih metadata properti dependensi setelah jenis pemiliknya dibuat tidak akan menimbulkan pengecualian, tetapi akan mengakibatkan perilaku yang tidak konsisten dalam sistem properti. Selain itu, jenis turunan tidak dapat mengambil alih metadata properti dependensi lebih dari sekali, dan mencoba melakukannya akan menimbulkan pengecualian.

Contoh

Dalam contoh berikut, kelas TropicalAquarium turunan mengambil alih metadata properti dependensi yang diwarisi dari kelas Aquariumdasar . Jenis metadata adalah FrameworkPropertyMetadata, yang mendukung karakteristik kerangka kerja WPF terkait UI seperti AffectsRender. Kelas turunan tidak mengambil alih bendera yang diwariskan AffectsRender , tetapi memperbarui nilai default pada AquariumGraphic instans kelas turunan.

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

Baca juga