DependencyObject Kelas

Definisi

Mewakili objek yang berpartisipasi dalam sistem properti dependensi. DependencyObject adalah kelas dasar langsung dari banyak kelas terkait UI penting, seperti UIElement, Geometry, FrameworkTemplate, Style, dan ResourceDictionary. Untuk informasi selengkapnya tentang bagaimana DependencyObject mendukung properti dependensi, lihat Gambaran umum properti dependensi.

public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class DependencyObject
Public Class DependencyObject
Warisan
Object Platform::Object IInspectable DependencyObject
Turunan
Atribut

Persyaratan Windows

Rangkaian perangkat
Windows 10 (diperkenalkan dalam 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (diperkenalkan dalam v1.0)

Contoh

Contoh ini mendefinisikan kelas yang berasal dari DependencyObject, dan menentukan properti terlampir bersama dengan bidang pengidentifikasi. Skenario untuk kelas ini adalah bahwa kelas ini adalah kelas layanan yang mendeklarasikan properti terlampir yang dapat diatur elemen UI lain di XAML Layanan berpotensi bertindak pada nilai properti terlampir pada elemen UI tersebut pada durasi.

public abstract class AquariumServices : DependencyObject
{
    public enum Buoyancy {Floats,Sinks,Drifts}

    public static readonly DependencyProperty BuoyancyProperty = DependencyProperty.RegisterAttached(
      "Buoyancy",
      typeof(Buoyancy),
      typeof(AquariumServices),
      new PropertyMetadata(Buoyancy.Floats)
    );
    public static void SetBuoyancy(DependencyObject element, Buoyancy value)
    {
        element.SetValue(BuoyancyProperty, value);
    }
    public static Buoyancy GetBuoyancy(DependencyObject element)
    {
        return (Buoyancy)element.GetValue(BuoyancyProperty);
    }
}
Public Class AquariumServices
    Inherits DependencyObject
    Public Enum Buoyancy
        Floats
        Sinks
        Drifts
    End Enum

    Public Shared ReadOnly BuoyancyProperty As DependencyProperty = _
          DependencyProperty.RegisterAttached(
          "Buoyancy", _
          GetType(Buoyancy), _
          GetType(AquariumServices), _
          New PropertyMetadata(Buoyancy.Floats))


    Public Sub SetBuoyancy(element As DependencyObject, value As Buoyancy)
        element.SetValue(BuoyancyProperty, value)
    End Sub
    Public Function GetBuoyancy(element As DependencyObject) As Buoyancy
        GetBuoyancy = CType(element.GetValue(BuoyancyProperty), Buoyancy)
    End Function
End Class
public static bool ClearSetProperty(DependencyObject targetObject, DependencyProperty targetDP)
{
    if (targetObject == null || targetDP == null)
    {
        throw new ArgumentNullException();
    }
    object localValue = targetObject.ReadLocalValue(targetDP);
    if (localValue == DependencyProperty.UnsetValue)
    {
        return false;
    }
    else
    {
        targetObject.ClearValue(targetDP);
        return true;
    }
}
Public Shared Function ClearSetProperty(targetObject As DependencyObject, targetDP As DependencyProperty) As Boolean
    If targetObject Is Nothing Or targetDP Is Nothing Then
        Throw New ArgumentNullException()
    End If
    Dim localValue As Object = targetObject.ReadLocalValue(targetDP)
    If localValue = DependencyProperty.UnsetValue Then
        ClearSetProperty = False
    Else
        targetObject.ClearValue(targetDP)
        ClearSetProperty = True
    End If
End Function

Contoh ini menunjukkan deklarasi properti dependensi sederhana. Panggilan ke GetValue merupakan keseluruhan implementasi dapatkan aksesor untuk pembungkus properti properti dependensi baru. Panggilan ke SetValue merupakan keseluruhan implementasi pengakses yang ditetapkan . Untuk contoh selengkapnya, lihat Properti dependensi kustom.

public class Fish : Control
{
    public static readonly DependencyProperty SpeciesProperty =
    DependencyProperty.Register(
    "Species",
    typeof(String),
    typeof(Fish), null
    );
    public string Species
    {
        get { return (string)GetValue(SpeciesProperty); }
        set { SetValue(SpeciesProperty, (string)value); }
    }
}
Public Class Fish
    Inherits Control

    Public Shared ReadOnly SpeciesProperty As DependencyProperty = _
    DependencyProperty.Register(
    "Species", _
    GetType(String), _
    GetType(Fish), _
    Nothing)
    Public Property Species As String
        Get
            Species = CType(GetValue(SpeciesProperty), String)
        End Get
        Set(value As String)
            SetValue(SpeciesProperty, value)
        End Set
    End Property
End Class

Keterangan

Kelas DependencyObject memungkinkan layanan sistem properti dependensi pada banyak kelas turunannya. Untuk informasi selengkapnya tentang konsep properti dependensi, lihat Gambaran umum properti dependensi.

Fungsi utama sistem properti dependensi adalah menghitung nilai properti, dan untuk memberikan pemberitahuan sistem tentang nilai yang telah berubah. Kelas kunci lain yang berpartisipasi dalam sistem properti dependensi adalah DependencyProperty. DependencyProperty memungkinkan pendaftaran properti dependensi ke dalam sistem properti, sedangkan DependencyObject sebagai kelas dasar memungkinkan objek untuk menggunakan dan mengatur properti dependensi.

Berikut adalah beberapa layanan dan karakteristik penting yang disediakan atau didukung DependencyObject:

  • Dukungan hosting properti dependensi untuk properti dependensi Windows Runtime yang ada.
  • Dukungan hosting properti dependensi kustom. Anda mendaftarkan properti dependensi dengan memanggil metode Register dan menyimpan nilai pengembalian metode sebagai properti statis publik di kelas DependencyObject Anda.
  • Dukungan hosting properti terlampir untuk properti terlampir Windows Runtime yang ada.
  • Dukungan hosting properti terlampir kustom. Anda mendaftarkan properti dependensi untuk penggunaan properti terlampir dengan memanggil metode RegisterAttached dan menyimpan nilai pengembalian metode sebagai properti statis publik di kelas Anda.
  • Dapatkan dan Atur metode utilitas untuk nilai properti dependensi apa pun yang ada pada DependencyObject. Anda menggunakan ini saat menentukan "pembungkus" properti dependensi kustom dan juga dapat menggunakannya dari kode aplikasi sebagai alternatif untuk menggunakan properti "pembungkus" yang ada.
  • Utilitas skenario lanjutan untuk memeriksa metadata atau nilai properti (misalnya GetAnimationBaseValue).
  • Penerapan afinitas utas ke utas UI utama Windows Runtime untuk semua instans DependencyObject.
  • Properti Dispatcher untuk skenario utas tingkat lanjut. Mendapatkan nilai Dispatcher memberikan referensi ke objek CoreDispatcher . Dengan CoreDispatcher, utas pekerja dapat menjalankan kode yang menggunakan DependencyObject tetapi tidak berada di utas UI, karena CoreDispatcher dapat menunda eksekusi ke operasi asinkron yang tidak akan memblokir atau mengganggu utas UI. Lihat bagian "DependencyObject and threading" di bawah ini.
  • Dukungan pengikatan dan gaya data dasar, dengan memungkinkan properti diatur sebagai ekspresi untuk dievaluasi di beberapa titik kemudian dalam masa pakai objek. Konsep-konsep ini dijelaskan secara lebih rinci dalam Gambaran umum properti Dependensi. Lihat juga Pengikatan data secara mendalam.

DependencyObject dan threading

Semua instans DependencyObject harus dibuat pada utas UI yang terkait dengan Jendela saat ini untuk aplikasi. Ini diberlakukan oleh sistem, dan ada dua implikasi penting dari ini untuk kode Anda:

  • Kode yang menggunakan API dari dua instans DependencyObject akan selalu dijalankan pada utas yang sama, yang selalu merupakan utas UI. Anda biasanya tidak mengalami masalah utas dalam skenario ini.
  • Kode yang tidak berjalan pada utas UI utama tidak dapat mengakses DependencyObject secara langsung karena DependencyObject hanya memiliki afinitas utas ke utas UI. Hanya kode yang berjalan pada utas UI yang dapat mengubah atau bahkan membaca nilai properti dependensi. Misalnya utas pekerja yang telah Anda mulai dengan Tugas .NET atau utas ThreadPool eksplisit tidak akan dapat membaca properti dependensi atau memanggil API lain.

Anda tidak sepenuhnya diblokir menggunakan DependencyObject dari utas pekerja. Tetapi Anda harus mendapatkan objek CoreDispatcher (nilai DependencyObject.Dispatcher) dari DependencyObject untuk melintasi pemisahan yang disengaja antara utas UI aplikasi dan utas lain yang berjalan pada sistem. CoreDispatcher mengekspos metode RunAsync. Panggil RunAsync untuk menjalankan kode yang dapat ditunggu ( IAsyncAction). Jika kode sederhana, Anda dapat menggunakan ekspresi lambda, jika tidak, Anda dapat mengimplementasikan sebagai delegasi (DispatchedHandler). Sistem menentukan waktu kode Anda dapat dijalankan. Karena mengaktifkan akses di seluruh utas, DependencyObject.Dispatcher adalah satu-satunya API instans DependencyObject atau salah satu subkelasnya yang dapat diakses dari utas non-UI tanpa melemparkan pengecualian lintas utas. Semua API DependencyObject lainnya memberikan pengecualian jika Anda mencoba memanggilnya dari utas pekerja atau utas non-UI lainnya.

Masalah utas biasanya dapat dihindari dalam kode UI umum. Namun, perangkat biasanya tidak terkait dengan utas UI. Jika Anda menggunakan info yang diperoleh dari perangkat untuk memperbarui UI secara real-time, Anda sering kali harus mendapatkan CoreDispatcher sehingga Anda dapat memperbarui UI. Layanan adalah kasus lain di mana kode yang Anda gunakan untuk mengakses layanan mungkin tidak berjalan pada utas UI.

Satu skenario kode di mana Anda mungkin mengalami masalah threading terkait DependencyObject jika Anda mendefinisikan jenis DependencyObject Anda sendiri dan Anda mencoba menggunakannya untuk sumber data, atau skenario lain di mana DependencyObject belum tentu sesuai (karena objek tidak terkait langsung dengan UI). Misalnya, Anda mungkin mencoba pengoptimalan perf dengan utas latar belakang atau utas pekerja lain yang mengubah nilai objek sebelum presentasi, atau sebagai respons terhadap perangkat, layanan, atau input eksternal lainnya. Evaluasi apakah Anda benar-benar memerlukan properti dependensi untuk skenario Anda; mungkin properti standar memadai.

Kelas turunan DependencyObject

DependencyObject adalah kelas induk untuk beberapa kelas turunan segera yang semuanya mendasar untuk model pemrograman yang Anda gunakan untuk aplikasi Anda dan UI XAML-nya. Berikut adalah beberapa kelas turunan penting:

Konstruktor

DependencyObject()

Menyediakan perilaku inisialisasi kelas dasar untuk kelas turunan DependencyObject .

Properti

Dispatcher

Mendapatkan CoreDispatcher yang dikaitkan dengan objek ini. CoreDispatcher mewakili fasilitas yang dapat mengakses DependencyObject pada utas UI meskipun kode dimulai oleh utas non-UI.

Metode

ClearValue(DependencyProperty)

Menghapus nilai lokal properti dependensi.

GetAnimationBaseValue(DependencyProperty)

Mengembalikan nilai dasar apa pun yang ditetapkan untuk properti dependensi, yang akan berlaku dalam kasus di mana animasi tidak aktif.

GetValue(DependencyProperty)

Mengembalikan nilai efektif properti dependensi saat ini dari DependencyObject.

ReadLocalValue(DependencyProperty)

Mengembalikan nilai lokal properti dependensi, jika nilai lokal ditetapkan.

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Mendaftarkan fungsi pemberitahuan untuk mendengarkan perubahan pada DependencyProperty tertentu pada instans DependencyObject ini.

SetValue(DependencyProperty, Object)

Mengatur nilai lokal properti dependensi pada DependencyObject.

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Membatalkan pemberitahuan perubahan yang sebelumnya terdaftar dengan memanggil RegisterPropertyChangedCallback.

Berlaku untuk

Lihat juga