Gambaran umum properti terlampir

Properti terlampir adalah konsep XAML. Properti terlampir memungkinkan pasangan properti/nilai tambahan diatur pada objek, tetapi properti bukan bagian dari definisi objek asli. Properti terlampir biasanya didefinisikan sebagai bentuk khusus properti dependensi yang tidak memiliki pembungkus properti konvensional dalam model objek jenis pemilik.

Prasyarat

Kami berasumsi bahwa Anda memahami konsep dasar properti dependensi, dan memiliki gambaran umum properti Dependensi baca.

Properti terlampir di XAML

Di XAML, Anda mengatur properti terlampir dengan menggunakan sintaks AttachedPropertyProvider.PropertyName. Berikut adalah contoh bagaimana Anda dapat mengatur Canvas.Left di XAML.

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

Catatan

Kami hanya menggunakan Canvas.Left sebagai contoh properti terlampir tanpa sepenuhnya menjelaskan mengapa Anda akan menggunakannya. Jika Anda ingin tahu lebih banyak tentang apa itu Canvas.Left dan bagaimana Canvas menangani anak tata letaknya, lihat topik referensi Canvas atau Tentukan tata letak dengan XAML.

Mengapa menggunakan properti terlampir?

Properti terlampir adalah cara untuk menghindari konvensi pengodean yang mungkin mencegah objek yang berbeda dalam hubungan berkomunikasi satu sama lain pada durasi. Dimungkinkan untuk menempatkan properti pada kelas dasar umum sehingga setiap objek bisa saja mendapatkan dan mengatur properti tersebut. Tetapi akhirnya banyaknya skenario di mana Anda mungkin ingin melakukan ini akan membengkak kelas dasar Anda dengan properti yang dapat dibagikan. Bahkan mungkin memperkenalkan kasus di mana mungkin hanya ada dua dari ratusan keturunan yang mencoba menggunakan properti . Itu bukan desain kelas yang bagus. Untuk mengatasi hal ini, konsep properti terlampir memungkinkan objek menetapkan nilai untuk properti yang tidak ditentukan struktur kelasnya sendiri. Kelas yang menentukan dapat membaca nilai dari objek anak pada durasi setelah berbagai objek dibuat di pohon objek.

Misalnya, elemen anak dapat menggunakan properti terlampir untuk menginformasikan elemen induk mereka tentang bagaimana elemen tersebut disajikan di UI. Ini adalah kasus dengan properti Terlampir Canvas.Left . Canvas.Left dibuat sebagai properti terlampir karena diatur pada elemen yang terkandung dalam elemen Canvas , bukan pada Kanvas itu sendiri. Setiap elemen anak yang mungkin kemudian menggunakan Canvas.Left dan Canvas.Top untuk menentukan offset tata letaknya dalam induk kontainer tata letak Canvas . Properti terlampir memungkinkan ini berfungsi tanpa mengacaukan model objek elemen dasar dengan banyak properti yang masing-masing hanya berlaku untuk salah satu dari banyak kontainer tata letak yang mungkin. Sebagai gantinya, banyak kontainer tata letak mengimplementasikan kumpulan properti terlampir mereka sendiri.

Untuk mengimplementasikan properti terlampir, kelas Canvas menentukan bidang DependencyProperty statis bernama Canvas.LeftProperty. Kemudian, Canvas menyediakan metode SetLeft dan GetLeft sebagai aksesor publik untuk properti terlampir, untuk mengaktifkan pengaturan XAML dan akses nilai run-time. Untuk XAML dan untuk sistem properti dependensi, set API ini memenuhi pola yang memungkinkan sintaks XAML tertentu untuk properti terlampir, dan menyimpan nilai di penyimpanan properti dependensi.

Cara jenis pemilik menggunakan properti terlampir

Meskipun properti terlampir dapat diatur pada elemen XAML apa pun (atau DependencyObject yang mendasar), itu tidak secara otomatis berarti bahwa pengaturan properti menghasilkan hasil yang nyata, atau bahwa nilainya pernah diakses. Jenis yang menentukan properti terlampir biasanya mengikuti salah satu skenario berikut:

  • Jenis yang menentukan properti terlampir adalah induk dalam hubungan objek lain. Objek anak akan mengatur nilai untuk properti terlampir. Jenis pemilik properti terlampir memiliki beberapa perilaku bawaan yang melakukan iterasi melalui elemen turunannya, mendapatkan nilai, dan bertindak pada nilai-nilai tersebut pada beberapa titik dalam masa pakai objek (tindakan tata letak, SizeChanged, dll.)
  • Jenis yang mendefinisikan properti terlampir digunakan sebagai elemen turunan untuk berbagai elemen induk dan model konten yang mungkin, tetapi info tersebut belum tentu merupakan info tata letak.
  • Properti terlampir melaporkan info ke layanan, bukan ke elemen UI lain.

Untuk informasi selengkapnya tentang skenario dan jenis pemilik ini, lihat bagian "Selengkapnya tentang Canvas.Left" dari Properti terlampir kustom.

Properti terlampir dalam kode

Properti terlampir tidak memiliki pembungkus properti umum untuk memudahkan mendapatkan dan mengatur akses seperti properti dependensi lainnya. Ini karena properti terlampir belum tentu menjadi bagian dari model objek yang berpusat pada kode untuk instans tempat properti diatur. (Diperbolehkan, meskipun jarang, untuk menentukan properti yang merupakan properti terlampir yang dapat diatur oleh jenis lain sendiri, dan yang juga memiliki penggunaan properti konvensional pada jenis pemilik.)

Ada dua cara untuk mengatur properti terlampir dalam kode: gunakan API sistem properti, atau gunakan pengaktor pola XAML. Teknik-teknik ini cukup setara dalam hal hasil akhirnya, sehingga yang digunakan sebagian besar adalah masalah gaya pengkodian.

Menggunakan sistem properti

Properti terlampir untuk Windows Runtime diimplementasikan sebagai properti dependensi, sehingga nilai dapat disimpan di penyimpanan properti dependensi bersama oleh sistem properti. Oleh karena itu, properti terlampir mengekspos pengidentifikasi properti dependensi pada kelas pemilik.

Untuk mengatur properti terlampir dalam kode, Anda memanggil metode SetValue , dan meneruskan bidang DependencyProperty yang berfungsi sebagai pengidentifikasi untuk properti terlampir tersebut. (Anda juga meneruskan nilai yang akan ditetapkan.)

Untuk mendapatkan nilai properti terlampir dalam kode, Anda memanggil metode GetValue , sekali lagi meneruskan bidang DependencyProperty yang berfungsi sebagai pengidentifikasi.

Menggunakan pola aksesor XAML

Prosesor XAML harus dapat mengatur nilai properti terlampir saat XAML diurai ke dalam pohon objek. Jenis pemilik properti terlampir harus menerapkan metode pengakses khusus bernama dalam formulir GetPropertyName dan SetPropertyName. Metode aksesor khusus ini juga merupakan salah satu cara untuk mendapatkan atau mengatur properti terlampir dalam kode. Dari perspektif kode, properti terlampir mirip dengan bidang dukungan yang memiliki pengaktif metode alih-alih pengaktif properti, dan bidang dukungan tersebut dapat ada pada objek apa pun daripada harus ditentukan secara khusus.

Contoh berikutnya menunjukkan bagaimana Anda dapat mengatur properti terlampir dalam kode melalui API pengakses XAML. Dalam contoh ini, myCheckBox adalah instans kelas CheckBox . Baris terakhir adalah kode yang benar-benar menetapkan nilai; baris sebelum itu hanya membuat instans dan hubungan induk-anak mereka. Baris terakhir yang tidak berkomentar adalah sintaksis jika Anda menggunakan sistem properti. Baris terakhir yang dikomentari adalah sintaksis jika Anda menggunakan pola aksesor XAML.

    Canvas myC = new Canvas();
    CheckBox myCheckBox = new CheckBox();
    myCheckBox.Content = "Hello";
    myC.Children.Add(myCheckBox);
    myCheckBox.SetValue(Canvas.TopProperty,75);
    //Canvas.SetTop(myCheckBox, 75);
    Dim myC As Canvas = New Canvas()
    Dim myCheckBox As CheckBox= New CheckBox()
    myCheckBox.Content = "Hello"
    myC.Children.Add(myCheckBox)
    myCheckBox.SetValue(Canvas.TopProperty,75)
    ' Canvas.SetTop(myCheckBox, 75)
Canvas myC;
CheckBox myCheckBox;
myCheckBox.Content(winrt::box_value(L"Hello"));
myC.Children().Append(myCheckBox);
myCheckBox.SetValue(Canvas::TopProperty(), winrt::box_value(75));
// Canvas::SetTop(myCheckBox, 75);
    Canvas^ myC = ref new Canvas();
    CheckBox^ myCheckBox = ref new CheckBox();
    myCheckBox->Content="Hello";
    myC->Children->Append(myCheckBox);
    myCheckBox->SetValue(Canvas::TopProperty,75);
    // Canvas::SetTop(myCheckBox, 75);

Properti terlampir kustom

Untuk contoh kode tentang cara menentukan properti terlampir kustom, dan info selengkapnya tentang skenario untuk menggunakan properti terlampir, lihat Properti terlampir kustom.

Sintaks khusus untuk referensi properti terlampir

Titik dalam nama properti terlampir adalah bagian kunci dari pola identifikasi. Terkadang ada ambiguitas ketika sintaks atau situasi memperlakukan titik sebagai memiliki beberapa arti lain. Misalnya, titik diperlakukan sebagai traversal model objek untuk jalur pengikatan. Dalam kebanyakan kasus yang melibatkan ambiguitas seperti itu, ada sintaks khusus untuk properti terlampir yang memungkinkan titik dalam masih diurai sebagai pemilik.pemisah properti properti terlampir.

  • Untuk menentukan properti terlampir sebagai bagian dari jalur target untuk animasi, sertakan nama properti terlampir dalam tanda kurung ("()")—misalnya, "(Canvas.Left)". Untuk informasi selengkapnya, lihat Sintaks jalur properti.

Peringatan

Batasan implementasi Windows Runtime XAML yang ada adalah Anda tidak dapat menganimasikan properti terlampir kustom.

  • Untuk menentukan properti terlampir sebagai properti target untuk referensi sumber daya dari file sumber daya ke x:Uid, gunakan sintaks khusus yang menyuntikkan gaya kode, sepenuhnya memenuhi syarat menggunakan: deklarasi di dalam kurung siku ("[]"), untuk membuat jeda cakupan yang disengaja. Misalnya, dengan asumsi ada elemen <TextBlock x:Uid="Title" />, kunci sumber daya dalam file sumber daya yang menargetkan nilai Canvas.Top pada instans tersebut adalah "Judul.[ menggunakan:Windows.UI.Xaml.Controls]Canvas.Top". Untuk informasi selengkapnya tentang file sumber daya dan XAML, lihat Mulai Cepat: Menerjemahkan sumber daya UI.