Share via


DependencyObject Kelas

Definisi

Mewakili objek yang berpartisipasi dalam sistem properti dependensi.

public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 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(Microsoft.UI.Xaml.WinUIContract), 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

Contoh

Contoh ini mendefinisikan kelas yang berasal dari DependencyObject, dan menentukan properti terlampir bersama dengan bidang pengidentifikasi. Skenario untuk 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 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;
    }
}

Contoh ini menunjukkan deklarasi properti dependensi sederhana. Panggilan ke GetValue merupakan keseluruhan get implementasi pengakses untuk pembungkus properti dari properti dependensi baru. Panggilan ke SetValue merupakan keseluruhan set implementasi pengakses. 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); }
    }
}

Keterangan

Kelas ini DependencyObject memungkinkan layanan sistem properti dependensi pada banyak kelas turunannya, dan merupakan kelas dasar langsung dari banyak kelas terkait UI penting, seperti UIElement, Geometry, FrameworkTemplate, Style, dan ResourceDictionary. Untuk informasi selengkapnya tentang cara DependencyObject mendukung 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 Anda DependencyObject .
  • 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.
  • Get dan Set metode utilitas untuk nilai properti dependensi apa pun yang ada di 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).
  • Penegakan afinitas utas ke utas UI utama Windows Runtime untuk semua DependencyObject instans.
  • Properti DispatcherQueue untuk skenario utas tingkat lanjut. DispatcherQueue memungkinkan utas pekerja menjalankan kode yang menggunakan tetapi tidak pada utas DependencyObject UI, karena dapat menunda eksekusi ke operasi asinkron yang tidak akan memblokir atau mengganggu utas UI. Lihat bagian "DependencyObject dan 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 DependencyObject instans 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 DependencyObject instans 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 memiliki DependencyObject afinitas utas ke utas UI saja. 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 untuk menggunakan DependencyObject dari utas pekerja. Tetapi Anda harus mendapatkan objek DispatcherQueue (nilai DependencyObject.DispatcherQueue) dari DependencyObject untuk melintasi pemisahan yang disengaja antara utas UI aplikasi dan utas lain yang berjalan pada sistem. mengekspos DispatcherQueue metode TryEnqueue untuk menjalankan kode yang dapat ditunggu. Karena mengaktifkan akses di seluruh utas, DependencyObject.DispatcherQueue adalah satu-satunya DependencyObject API instans atau salah satu subkelasnya yang dapat diakses dari utas non-UI tanpa melemparkan pengecualian lintas utas. Semua API lain DependencyObject 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 DispatcherQueue 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 DependencyObjectmasalah -terkait threading jika Anda mendefinisikan jenis Anda sendiri DependencyObject dan Anda mencoba menggunakannya untuk sumber data, atau skenario lain di mana DependencyObject yang 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. Mengevaluasi apakah Anda benar-benar membutuhkan 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

Selalu kembali null di aplikasi SDK Aplikasi Windows. Gunakan DispatcherQueue sebagai gantinya .

DispatcherQueue

DispatcherQueue Mendapatkan yang dikaitkan dengan objek ini. DispatcherQueue mewakili fasilitas yang dapat mengakses DependencyObject pada utas UI bahkan jika 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