Bagikan melalui


Gambaran Umum Properti Terlampir

Properti terlampir adalah konsep yang ditentukan oleh XAML. Properti terlampir dimaksudkan untuk digunakan sebagai jenis properti global yang dapat diatur pada objek dependensi apa pun. Di Windows Presentation Foundation (WPF), properti terlampir biasanya didefinisikan sebagai bentuk khusus properti dependensi yang tidak memiliki properti konvensional "wrapper".

Prasyarat

Artikel ini mengasumsikan bahwa Anda memahami properti dependensi dari perspektif konsumen properti dependensi yang ada pada kelas Windows Presentation Foundation (WPF), dan telah membaca Gambaran Umum Properti Dependensi. Untuk mengikuti contoh dalam artikel ini, Anda juga harus memahami XAML dan tahu cara menulis aplikasi WPF.

Mengapa Menggunakan Properti Terlampir

Salah satu tujuan properti terlampir adalah untuk memungkinkan elemen turunan yang berbeda menentukan nilai unik untuk properti yang ditentukan dalam elemen induk. Aplikasi spesifik dari skenario ini adalah memiliki elemen turunan yang menginformasikan elemen induk tentang bagaimana elemen tersebut disajikan dalam antarmuka pengguna (UI). Salah satu contohnya DockPanel.Dock adalah properti . Properti DockPanel.Dock dibuat sebagai properti terlampir karena dirancang untuk diatur pada elemen yang terkandung dalam DockPanel bukan pada DockPanel dirinya sendiri. Kelas DockPanel mendefinisikan bidang statis DependencyProperty bernama DockProperty, lalu menyediakan GetDock metode dan SetDock sebagai aksesor publik untuk properti terlampir.

Properti Terlampir di XAML

Di XAML, Anda mengatur properti terlampir dengan menggunakan sintaks AttachedPropertyProvider.PropertyName

Berikut ini adalah contoh bagaimana Anda dapat mengatur DockPanel.Dock di XAML:

<DockPanel>
    <TextBox DockPanel.Dock="Top">Enter text</TextBox>
</DockPanel>

Penggunaannya agak mirip dengan properti statis; Anda selalu mereferensikan jenis DockPanel yang memiliki dan mendaftarkan properti terlampir, daripada merujuk ke instans apa pun yang ditentukan berdasarkan nama.

Selain itu, karena properti terlampir di XAML adalah atribut yang Anda tetapkan dalam markup, hanya operasi yang ditetapkan yang memiliki relevansi apa pun. Anda tidak dapat langsung mendapatkan properti di XAML, meskipun ada beberapa mekanisme tidak langsung untuk membandingkan nilai, seperti pemicu dalam gaya (untuk detailnya, lihat Gaya dan Templat).

Implementasi Properti Terlampir di WPF

Di Windows Presentation Foundation (WPF), sebagian besar properti terlampir terkait UI pada jenis WPF diimplementasikan sebagai properti dependensi. Properti terlampir adalah konsep XAML, sedangkan properti dependensi adalah konsep WPF. Karena properti terlampir WPF adalah properti dependensi, properti tersebut mendukung konsep properti dependensi seperti metadata properti, dan nilai default dari metadata properti tersebut.

Bagaimana Properti Terlampir Digunakan oleh Jenis Pemilik

Meskipun properti terlampir dapat diatur pada objek apa pun, itu tidak secara otomatis berarti bahwa pengaturan properti akan menghasilkan hasil nyata, atau bahwa nilai akan pernah digunakan oleh objek lain. Umumnya, properti terlampir dimaksudkan agar objek yang berasal dari berbagai kemungkinan hierarki kelas atau hubungan logis dapat masing-masing melaporkan informasi umum ke jenis yang menentukan properti terlampir. Jenis yang mendefinisikan properti terlampir biasanya mengikuti salah satu model ini:

  • Jenis yang menentukan properti terlampir dirancang sehingga dapat menjadi elemen induk dari elemen yang akan mengatur nilai untuk properti terlampir. Jenis tersebut kemudian menguraikan objek turunannya melalui logika internal terhadap beberapa struktur pohon objek, mendapatkan nilai, dan bertindak pada nilai-nilai tersebut dengan cara tertentu.

  • Jenis yang mendefinisikan properti terlampir akan digunakan sebagai elemen turunan untuk berbagai elemen induk dan con mode tenda ls yang mungkin.

  • Jenis yang menentukan properti terlampir mewakili layanan. Jenis lain mengatur nilai untuk properti terlampir. Kemudian, ketika elemen yang mengatur properti dievaluasi dalam konteks layanan, nilai properti terlampir diperoleh melalui logika internal kelas layanan.

Contoh Properti Terlampir yang Ditentukan Induk

Skenario paling umum di mana WPF mendefinisikan properti terlampir adalah ketika elemen induk mendukung pengumpulan elemen turunan, dan juga menerapkan perilaku di mana spesifikasi perilaku dilaporkan secara individual untuk setiap elemen anak.

DockPanelDockPanel.Dock mendefinisikan properti terlampir, dan DockPanel memiliki kode tingkat kelas sebagai bagian dari logika penyajiannya (khususnya, MeasureOverride dan ArrangeOverride). Instans DockPanel akan selalu memeriksa untuk melihat apakah salah satu elemen turunan langsungnya telah menetapkan nilai untuk DockPanel.Dock. Jika demikian, nilai-nilai tersebut menjadi input untuk logika penyajian yang diterapkan ke elemen anak tertentu. Instans berlapis DockPanel masing-masing memperlakukan koleksi elemen turunan langsung mereka sendiri, tetapi perilaku tersebut khusus untuk bagaimana DockPanel memproses DockPanel.Dock nilai. Secara teoritis mungkin memiliki sifat terlampir yang memengaruhi elemen di luar induk langsung. DockPanel.Dock Jika properti terlampir diatur pada elemen yang tidak DockPanel memiliki elemen induk untuk bertindak atasnya, tidak ada kesalahan atau pengecualian yang dimunculkan. Ini berarti bahwa nilai properti global telah ditetapkan, tetapi tidak memiliki induk saat ini DockPanel yang dapat menggunakan informasi.

Properti Terlampir dalam Kode

Properti terlampir di WPF tidak memiliki metode "pembungkus" CLR khas untuk akses yang mudah didapat/diatur. Ini karena properti terlampir belum tentu menjadi bagian dari namespace CLR untuk instans tempat properti diatur. Namun, prosesor XAML harus dapat mengatur nilai-nilai tersebut saat XAML diurai. Untuk mendukung penggunaan properti terlampir yang efektif, jenis pemilik properti terlampir harus menerapkan metode aksesor khusus dalam formulir Get PropertyName dan SetPropertyName. Metode aksesor khusus ini juga berguna untuk mendapatkan atau mengatur properti terlampir dalam kode. Dari perspektif kode, properti terlampir mirip dengan bidang backing yang memiliki aksesor metode alih-alih aksesor properti, dan bidang backing tersebut dapat ada pada objek apa pun daripada perlu ditentukan secara khusus.

Contoh berikut menunjukkan bagaimana Anda dapat mengatur properti terlampir dalam kode. Dalam contoh ini, myCheckBox adalah instans CheckBox kelas .

DockPanel myDockPanel = new DockPanel();
CheckBox myCheckBox = new CheckBox();
myCheckBox.Content = "Hello";
myDockPanel.Children.Add(myCheckBox);
DockPanel.SetDock(myCheckBox, Dock.Top);
Dim myDockPanel As New DockPanel()
Dim myCheckBox As New CheckBox()
myCheckBox.Content = "Hello"
myDockPanel.Children.Add(myCheckBox)
DockPanel.SetDock(myCheckBox, Dock.Top)

Mirip dengan kasus XAML, jika myCheckBox belum ditambahkan sebagai elemen turunan dari myDockPanel oleh baris kode keempat, baris kode kelima tidak akan menimbulkan pengecualian, tetapi nilai properti tidak akan berinteraksi dengan DockPanel induk dan dengan demikian tidak akan melakukan apa-apa. Hanya nilai yang DockPanel.Dock ditetapkan pada elemen anak yang dikombinasikan dengan keberadaan elemen induk yang DockPanel akan menyebabkan perilaku efektif dalam aplikasi yang dirender. (Dalam hal ini, Anda dapat mengatur properti terlampir, lalu melampirkan ke pohon. Atau Anda dapat melampirkan ke pohon lalu mengatur properti terlampir. Salah satu urutan tindakan memberikan hasil yang sama.)

Metadata Properti Terlampir

Saat mendaftarkan properti, FrameworkPropertyMetadata diatur untuk menentukan karakteristik properti, seperti apakah properti memengaruhi penyajian, pengukuran, dan sebagainya. Metadata untuk properti terlampir umumnya tidak berbeda dari pada properti dependensi. Jika Anda menentukan nilai default dalam penimpaan ke metadata properti terlampir, nilai tersebut menjadi nilai default properti terlampir implisit pada instans kelas penimpaan. Secara khusus, nilai default Anda dilaporkan jika beberapa kueri proses untuk nilai properti terlampir melalui Get aksesor metode untuk properti tersebut, menentukan instans kelas tempat Anda menentukan metadata, dan nilai untuk properti terlampir tersebut tidak diatur.

Jika Anda ingin mengaktifkan pewarisan nilai properti pada properti, Anda harus menggunakan properti terlampir daripada properti dependensi yang tidak terpasang. Untuk detailnya, lihat Pewarisan Nilai Properti.

Properti Terlampir Kustom

Kapan Membuat Properti Terlampir

Anda dapat membuat properti terlampir ketika ada alasan untuk memiliki mekanisme pengaturan properti yang tersedia untuk kelas selain kelas yang menentukan. Skenario yang paling umum untuk ini adalah tata letak. Contoh properti tata letak yang ada adalah DockPanel.Dock, , Panel.ZIndexdan Canvas.Top. Skenario yang diaktifkan di sini adalah bahwa elemen yang ada sebagai elemen turunan untuk elemen pengontrol tata letak dapat mengekspresikan persyaratan tata letak ke elemen induk tata letaknya satu per satu, masing-masing mengatur nilai properti yang didefinisikan induk sebagai properti terlampir.

Skenario lain untuk menggunakan properti terlampir adalah ketika kelas Anda mewakili layanan, dan Anda ingin kelas dapat mengintegrasikan layanan secara lebih transparan.

Skenario lain adalah menerima dukungan Visual Studio WPF Designer, seperti pengeditan jendela Properti . Untuk informasi selengkapnya, lihat Gambaran Umum Penulisan Kontrol.

Seperti disebutkan sebelumnya, Anda harus mendaftar sebagai properti terlampir jika Anda ingin menggunakan pewarisan nilai properti.

Cara Membuat Properti Terlampir

Jika kelas Anda mendefinisikan properti terlampir secara ketat untuk digunakan pada jenis lain, maka kelas tidak harus berasal dari DependencyObject. Tetapi Anda perlu memperoleh dari DependencyObject jika Anda mengikuti model WPF keseluruhan dari memiliki properti terlampir Anda juga menjadi properti dependensi.

Tentukan properti terlampir Anda sebagai properti dependensi dengan mendeklarasikan public static readonly bidang jenis DependencyProperty. Anda menentukan bidang ini dengan menggunakan nilai RegisterAttached pengembalian metode. Nama bidang harus cocok dengan nama properti terlampir, ditambahkan dengan string Property, untuk mengikuti pola WPF yang ditetapkan untuk menamai bidang identifikasi versus properti yang diwakilinya. Penyedia properti terlampir juga harus menyediakan metode GetPropertyName dan SetPropertyName statis sebagai aksesor untuk properti terlampir; gagal melakukan ini mengakibatkan sistem properti tidak dapat menggunakan properti terlampir Anda.

Catatan

Jika Anda menghilangkan aksesor get properti terlampir, pengikatan data pada properti tidak akan berfungsi di alat desain, seperti Visual Studio dan Blend untuk Visual Studio.

Dapatkan Aksesor

Tanda tangan untuk aksesor GetPropertyName harus:

public static object GetPropertyName(object target)

  • Objek target dapat ditentukan sebagai jenis yang lebih spesifik dalam implementasi Anda. Misalnya, DockPanel.GetDock metode mengetik parameter sebagai UIElement, karena properti terlampir hanya dimaksudkan untuk diatur pada UIElement instans.

  • Nilai pengembalian dapat ditentukan sebagai jenis yang lebih spesifik dalam implementasi Anda. Misalnya, metode mengetikkannya GetDock sebagai Dock, karena nilai hanya dapat diatur ke enumerasi tersebut.

Atur Aksesor

Tanda tangan untuk aksesor SetPropertyName harus:

public static void SetPropertyName(object target, object value)

  • Objek target dapat ditentukan sebagai jenis yang lebih spesifik dalam implementasi Anda. Misalnya, metode mengetikkannya SetDock sebagai UIElement, karena properti terlampir hanya dimaksudkan untuk diatur pada UIElement instans.

  • Objek value dapat ditentukan sebagai jenis yang lebih spesifik dalam implementasi Anda. Misalnya, metode mengetikkannya SetDock sebagai Dock, karena nilai hanya dapat diatur ke enumerasi tersebut. Ingatlah bahwa nilai untuk metode ini adalah input yang berasal dari pemuat XAML ketika menemukan properti terlampir Anda dalam penggunaan properti terlampir dalam markup. Input tersebut adalah nilai yang ditentukan sebagai nilai atribut XAML dalam markup. Oleh karena itu harus ada konversi jenis, serializer nilai, atau dukungan ekstensi markup untuk jenis yang Anda gunakan, sehingga jenis yang sesuai dapat dibuat dari nilai atribut (yang pada akhirnya hanya string).

Contoh berikut menunjukkan pendaftaran properti dependensi (menggunakan RegisterAttached metode ), serta aksesor GetPropertyName dan SetPropertyName. Dalam contoh, nama properti yang dilampirkan adalah IsBubbleSource. Oleh karena itu, aksesor harus diberi nama GetIsBubbleSource dan SetIsBubbleSource.

public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
  "IsBubbleSource",
  typeof(Boolean),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)
);
public static void SetIsBubbleSource(UIElement element, Boolean value)
{
  element.SetValue(IsBubbleSourceProperty, value);
}
public static Boolean GetIsBubbleSource(UIElement element)
{
  return (Boolean)element.GetValue(IsBubbleSourceProperty);
}
Public Shared ReadOnly IsBubbleSourceProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsBubbleSource", GetType(Boolean), GetType(AquariumObject), New FrameworkPropertyMetadata(False, FrameworkPropertyMetadataOptions.AffectsRender))
Public Shared Sub SetIsBubbleSource(ByVal element As UIElement, ByVal value As Boolean)
    element.SetValue(IsBubbleSourceProperty, value)
End Sub
Public Shared Function GetIsBubbleSource(ByVal element As UIElement) As Boolean
    Return CType(element.GetValue(IsBubbleSourceProperty), Boolean)
End Function

Atribut Properti Terlampir

WPF mendefinisikan beberapa atribut .NET yang dimaksudkan untuk memberikan informasi tentang properti terlampir ke proses refleksi, dan untuk pengguna umum refleksi dan informasi properti seperti desainer. Karena properti terlampir memiliki jenis cakupan tidak terbatas, desainer memerlukan cara untuk menghindari pengguna yang kewalahan dengan daftar global semua properti terlampir yang ditentukan dalam implementasi teknologi tertentu yang menggunakan XAML. Atribut .NET yang didefinisikan WPF untuk properti terlampir dapat digunakan untuk mencakup situasi di mana properti terlampir tertentu harus ditampilkan di jendela properti. Anda mungkin mempertimbangkan untuk menerapkan atribut ini untuk properti terlampir kustom Anda sendiri juga. Tujuan dan sintaks atribut .NET dijelaskan pada halaman referensi yang sesuai:

Pembelajaran Selengkapnya tentang Properti Terlampir

  • Untuk informasi selengkapnya tentang membuat properti terlampir, lihat Mendaftarkan Properti Terlampir.

  • Untuk skenario penggunaan tingkat lanjut lainnya untuk properti dependensi dan properti terlampir, lihat Properti Dependensi Kustom.

  • Anda juga dapat mendaftarkan properti sebagai properti terlampir, dan sebagai properti dependensi, tetapi kemudian masih mengekspos implementasi "pembungkus". Dalam hal ini, properti dapat diatur baik pada elemen tersebut, atau pada elemen apa pun melalui sintaks properti terlampir XAML. Contoh properti dengan skenario yang sesuai untuk penggunaan standar dan terlampir adalah FrameworkElement.FlowDirection.

Baca juga