Bagikan melalui


Metadata properti kerangka kerja (WPF .NET)

Anda dapat mengatur opsi metadata properti kerangka kerja untuk properti dependensi di tingkat kerangka kerja Windows Presentation Foundation (WPF). Penunjukan tingkat kerangka kerja WPF berlaku ketika API presentasi WPF dan executable menangani penyajian dan pengikatan data. API presentasi dan executable mengkueri FrameworkPropertyMetadata properti dependensi.

Penting

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

Prasyarat

Artikel ini mengasumsikan pengetahuan dasar tentang properti dependensi, dan bahwa Anda telah membaca gambaran umum properti Dependensi. Untuk mengikuti contoh dalam artikel ini, ini membantu jika Anda terbiasa dengan Extensible Application Markup Language (XAML) dan tahu cara menulis aplikasi WPF.

Kategori metadata properti kerangka kerja

FrameworkPropertyMetadata termasuk dalam kategori ini:

  • Metadata yang memengaruhi tata letak elemen, khususnya AffectsArrangebendera metadata , AffectsMeasure, dan AffectsRender . Anda dapat mengatur bendera tersebut jika implementasi properti dependensi Anda memengaruhi aspek visual dan Anda menerapkan MeasureOverride atau ArrangeOverride di kelas Anda. Metode MeasureOverride dan ArrangeOverride menyediakan perilaku khusus implementasi dan informasi penyajian ke sistem tata letak. Ketika AffectsArrange, AffectsMeasure, atau AffectsRender diatur ke true dalam metadata properti dependensi dan perubahan nilai efektifnya, sistem properti WPF akan memulai permintaan untuk membatalkan validasi visual elemen untuk memicu penggalian ulang.

  • Metadata yang memengaruhi tata letak elemen induk elemen, khususnya AffectsParentArrange bendera metadata dan AffectsParentMeasure . Contoh properti dependensi WPF yang mengatur bendera ini adalah FixedPage.Left dan Paragraph.KeepWithNext.

  • Metadata pewarisan nilai properti, khususnya Inherits bendera metadata dan OverridesInheritanceBehavior . Secara default, properti dependensi tidak mewarisi nilai. OverridesInheritanceBehavior memungkinkan jalur pewarisan juga melakukan perjalanan ke pohon visual, yang diperlukan untuk beberapa skenario komposit kontrol. Untuk informasi selengkapnya, lihat Pewarisan nilai properti.

    Catatan

    Istilah "mewarisi" dalam konteks nilai properti khusus untuk properti dependensi, dan tidak secara langsung terkait dengan jenis kode terkelola dan pewarisan anggota melalui jenis turunan. Dalam konteks properti dependensi, itu berarti bahwa elemen turunan dapat mewarisi nilai properti dependensi dari elemen induk.

  • Metadata pengikatan data, khususnya BindsTwoWayByDefault bendera metadata dan IsNotDataBindable . Secara default, properti dependensi dalam kerangka kerja WPF mendukung pengikatan satu arah. Pertimbangkan untuk mengatur pengikatan dua arah sebagai default untuk properti yang melaporkan status dan dapat dimodifikasi oleh tindakan pengguna, misalnya IsSelected. Selain itu, pertimbangkan untuk mengatur pengikatan dua arah sebagai default saat pengguna kontrol mengharapkan properti untuk mengimplementasikannya, misalnya TextBox.Text. BindsTwoWayByDefault hanya memengaruhi mode pengikatan default. Untuk mengedit arah aliran data pengikatan, atur Binding.Mode. Anda dapat menggunakan IsNotDataBindable untuk menonaktifkan pengikatan data saat tidak ada kasus penggunaan untuk itu. Untuk informasi selengkapnya tentang pengikatan data, lihat Gambaran umum pengikatan data.

  • Metadata penjurnalan, khususnya Journal bendera metadata. Nilai Journal default bendera hanya true untuk beberapa properti dependensi, seperti SelectedIndex. Kontrol input pengguna harus mengatur Journal bendera untuk properti yang nilainya menyimpan pilihan pengguna yang perlu disimpan. Bendera Journal dibaca oleh aplikasi atau layanan yang mendukung jurnal, termasuk layanan jurnal WPF. Untuk informasi tentang menyimpan langkah-langkah navigasi, lihat Gambaran umum navigasi.

FrameworkPropertyMetadata berasal langsung dari UIPropertyMetadata, dan mengimplementasikan bendera yang dibahas di sini. Kecuali diatur secara khusus, FrameworkPropertyMetadata bendera memiliki nilai falsedefault .

Membaca FrameworkPropertyMetadata

Untuk mengambil metadata untuk properti dependensi, panggil GetMetadata pengidentifikasi DependencyProperty . Panggilan GetMetadata mengembalikan PropertyMetadata objek. Jika Anda perlu mengkueri nilai metadata kerangka kerja yang dilemparkan PropertyMetadata ke FrameworkPropertyMetadata.

Menentukan FrameworkPropertyMetadata

Saat mendaftarkan properti dependensi, Anda memiliki opsi untuk membuat dan menetapkan metadata ke properti tersebut. Objek metadata yang Anda tetapkan dapat berupa PropertyMetadata atau salah satu kelas turunannya, seperti FrameworkPropertyMetadata. Pilih FrameworkPropertyMetadata properti dependensi yang mengandalkan API presentasi WPF dan executable untuk penyajian dan pengikatan data. Opsi yang lebih canggih adalah mendapatkan dari FrameworkPropertyMetadata untuk membuat kelas pelaporan metadata kustom dengan lebih banyak bendera. Atau, Anda mungkin menggunakan UIPropertyMetadata untuk properti non-kerangka kerja yang memengaruhi penyajian UI.

Meskipun opsi metadata biasanya diatur selama pendaftaran properti dependensi baru, Anda dapat menentukan OverrideMetadata ulang dalam atau AddOwner panggilan. Saat mengambil alih metadata, selalu ambil alih dengan jenis metadata yang sama yang digunakan selama pendaftaran properti.

Karakteristik properti yang diekspos oleh FrameworkPropertyMetadata terkadang disebut sebagai bendera. Jika Anda membuat FrameworkPropertyMetadata instans, ada dua cara untuk mengisi nilai bendera:

  1. Atur bendera pada instans jenis FrameworkPropertyMetadataOptions enumerasi. FrameworkPropertyMetadataOptions memungkinkan Anda menentukan bendera metadata dalam kombinasi BITWISE OR. Kemudian, buat instans FrameworkPropertyMetadata menggunakan konstruktor yang memiliki FrameworkPropertyMetadataOptions parameter, dan teruskan instans Anda FrameworkPropertyMetadataOptions . Untuk mengubah bendera metadata setelah meneruskan FrameworkPropertyMetadataOptions ke FrameworkPropertyMetadata konstruktor, ubah properti yang sesuai pada instans baru FrameworkPropertyMetadata . Misalnya, jika Anda mengatur FrameworkPropertyMetadataOptions.NotDataBindable bendera, Anda dapat membatalkannya dengan mengatur FrameworkPropertyMetadata.IsNotDataBindable ke false.

  2. FrameworkPropertyMetadata Buat instans menggunakan konstruktor yang tidak memiliki FrameworkPropertyMetadataOptions parameter, lalu atur bendera yang berlaku Boolean pada FrameworkPropertyMetadata. Atur nilai bendera sebelum mengaitkan instans Anda FrameworkPropertyMetadata dengan properti dependensi, jika tidak, Anda akan mendapatkan InvalidOperationException.

Perilaku penimpaan metadata

Saat Anda mengambil alih metadata properti kerangka kerja, nilai metadata yang diubah mengganti atau digabungkan dengan nilai asli:

  • PropertyChangedCallbackUntuk , logika penggabungan default mempertahankan nilai sebelumnya PropertyChangedCallback dalam tabel, dan semuanya dipanggil pada perubahan properti. Urutan panggilan balik ditentukan oleh kedalaman kelas, di mana panggilan balik yang didaftarkan oleh kelas dasar dalam hierarki akan berjalan terlebih dahulu. Panggilan balik yang diwariskan hanya berjalan sekali, dan dimiliki oleh kelas yang menambahkannya ke dalam metadata.

  • DefaultValueUntuk , nilai baru akan menggantikan nilai default yang ada. Jika Anda tidak menentukan DefaultValue dalam metadata penimpaan FrameworkPropertyMetadata dan jika yang ada memiliki Inherits set bendera, maka nilai default berasal dari leluhur terdekat yang ditentukan DefaultValue dalam metadata.

  • CoerceValueCallbackUntuk , nilai baru akan menggantikan nilai yang adaCoerceValueCallback. Jika Anda tidak menentukan CoerceValueCallback dalam metadata penimpaan, nilai berasal dari leluhur terdekat dalam rantai warisan yang menentukan CoerceValueCallback.

  • Untuk FrameworkPropertyMetadata bendera yang tidak diwariskan, Anda dapat mengambil alih nilai default false dengan true nilai . Namun, Anda hanya dapat mengambil alih nilai dengan false nilai untuk Inherits, , JournalOverridesInheritanceBehavior, dan SubPropertiesDoNotAffectRender.true

Catatan

Logika penggabungan default diimplementasikan oleh Merge metode . Anda dapat menentukan logika penggabungan kustom di kelas turunan yang mewarisi properti dependensi, dengan mengambil alih di kelas tersebut Merge .

Baca juga