Bagikan melalui


Metadata properti kerangka kerja

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. Mengkueri FrameworkPropertyMetadata dari properti dependensi pada API presentasi dan berkas eksekusi.

Prasyarat

Artikel ini mengasumsikan pengetahuan dasar tentang properti dependensi, dan 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-kategori metadata properti dari kerangka kerja

FrameworkPropertyMetadata termasuk dalam kategori ini:

  • Metadata yang memengaruhi tata letak elemen, khususnya bendera metadata AffectsArrange, 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 nilai efektifnya berubah, sistem properti WPF akan memulai permintaan untuk meniadakan visual elemen tersebut guna memicu penggambaran ulang.

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

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

    Nota

    Istilah "mewarisi" dalam konteks nilai properti merupakan khusus bagi properti dependensi serta tidak berkaitan langsung dengan tipe kode terkelola dan sifat pewarisan anggota melalui tipe turunan. Dalam konteks properti dependensi, itu berarti bahwa elemen turunan dapat mewarisi nilai properti dependensi dari elemen induk.

  • Metadata pengikatan data, khususnya penanda metadata BindsTwoWayByDefault 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 bendera metadata Journal. Nilai default bendera Journal hanya true untuk beberapa properti dependensi, seperti SelectedIndex. Kontrol input pengguna harus mengatur bendera Journal 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, bendera FrameworkPropertyMetadata memiliki nilai default false.

Membaca FrameworkPropertyMetadata

Untuk mengambil metadata untuk properti dependensi, panggil GetMetadata pada pengidentifikasi DependencyProperty. Panggilan GetMetadata mengembalikan objek PropertyMetadata. 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 PropertyMetadata atau salah satu kelas turunannya, seperti FrameworkPropertyMetadata. Pilih FrameworkPropertyMetadata untuk properti dependensi yang mengandalkan API presentasi WPF dan dapat dieksekusi untuk penyajian dan pengikatan data. Opsi yang lebih canggih adalah memperoleh dari FrameworkPropertyMetadata untuk membuat kelas pelaporan metadata kustom dengan lebih banyak bendera. Atau, Anda dapat menggunakan UIPropertyMetadata untuk properti non-kerangka kerja yang memengaruhi penyajian UI.

Meskipun opsi metadata biasanya diatur selama pendaftaran properti dependensi baru, Anda dapat menspesifikasikannya kembali dalam panggilan OverrideMetadata atau AddOwner. Saat menggantikan metadata, selalu lakukan dengan menggunakan jenis metadata yang sama seperti yang digunakan selama pendaftaran properti.

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

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

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

Perilaku penggantian metadata

Saat Anda mengganti metadata properti kerangka, nilai metadata yang diubah menggantikan atau digabungkan dengan nilai asli:

  • Untuk PropertyChangedCallback, logika penggabungan default mempertahankan nilai PropertyChangedCallback sebelumnya 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.

  • Untuk DefaultValue, nilai baru akan menggantikan nilai default yang ada. Jika Anda tidak menentukan DefaultValue dalam metadata override dan jika FrameworkPropertyMetadata yang ada memiliki flag Inherits yang disetel, maka nilai default berasal dari leluhur terdekat yang menentukan DefaultValue dalam metadata.

  • Untuk CoerceValueCallback, nilai baru akan menggantikan nilai CoerceValueCallback yang ada. Jika Anda tidak menentukan CoerceValueCallback dalam metadata penimpaan, nilai diambil dari pendahulu terdekat dalam rantai pewarisan yang telah menentukan CoerceValueCallback.

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

Nota

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

Lihat juga