DependencyObject Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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
- 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
danSet
metode utilitas untuk nilai properti dependensi apa pun yang ada diDependencyObject
. 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 utasDependencyObject
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 memilikiDependencyObject
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 DependencyObject
masalah -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:
- UIElement: Kelas dasar untuk sebagian besar objek visual yang dapat memproses input di UI. FrameworkElement lebih lanjut dalam hierarki ini, seperti halnya Kontrol, sehingga ada ratusan kontrol dan kelas lain di Windows Runtime yang semuanya memiliki kelas UIElement dalam hierarki kelas mereka.
- Kelas dukungan sistem gaya XAML: FrameworkTemplate (induk ControlTemplate, DataTemplate, ItemsPanelTemplate), Style, SetterBase (induk Setter), ToolTipTemplateSettings dan TemplateSettings lainnya.
- Model status visual: Transisi, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- Dukungan pengikatan data: BindingBase (induk Pengikatan), CollectionViewSource, PropertyPath, RelativeSource.
- Animasi papan cerita: Garis Waktu (induk Papan Cerita, animasi yang diketik, animasi tema), keyframe yang diketik (seperti ColorKeyFrame), KeySpline, EasingFunctionBase.
- Grafik XAML dan primitif penyajian: Brush, Geometry, GeneralTransform, GradientStop, PathFigure, PathSegment, Projection.
- Interop pencitraan dan render permukaan: ImageSource (induk BitmapSource, RenderTargetBitmap, SurfaceImageSource , dan lainnya).
- Jendela: mewakili jendela aplikasi utama.
- FlyoutBase (induk Flyout dan MenuFlyout).
- ResourceDictionary: mendefinisikan sumber daya kunci di XAML.
- TextElement: induk Blok danSebaris, ini pada gilirannya adalah kelas dasar untuk elemen teks yang digunakan untuk konten TextBlock atau elemen teks kaya.
- AutomationPeer: kelas dasar untuk rekan Otomatisasi UI Microsoft yang mewakili kontrol XAML ke pendengar Otomatisasi UI Microsoft. Juga, IRawElementProviderSimple.
- Lain-lain: CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TriggerAction, TriggerBase.
Konstruktor
DependencyObject() |
Menyediakan perilaku inisialisasi kelas dasar untuk kelas turunan DependencyObject . |
Properti
Dispatcher |
Selalu kembali |
DispatcherQueue |
|
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. |