Bagikan melalui


Konteks Skema XAML Default dan Konteks Skema WPF XAML

Konteks skema XAML adalah entitas konseptual yang memenuhi syarat bagaimana produksi XAML yang menggunakan kosakata XAML tertentu berinteraksi dengan perilaku penulisan objek, termasuk bagaimana pemetaan jenis diselesaikan, bagaimana rakitan dimuat, bagaimana pengaturan pembaca dan penulis tertentu ditafsirkan. Topik ini menjelaskan fitur Layanan XAML .NET dan konteks skema XAML default terkait, yang didasarkan pada sistem jenis CLR. Topik ini juga menjelaskan konteks skema XAML yang digunakan untuk WPF.

Konteks Skema XAML Default

Layanan XAML .NET menerapkan dan menggunakan konteks skema XAML default. Perilaku konteks skema XAML default tidak selalu terlihat sepenuhnya di API XamlSchemaContext kelas. Namun, dalam banyak kasus perilaku yang dipengaruhi konteks skema XAML default dapat diamati melalui API umum dari sistem jenis XAML, seperti anggota XamlMember atau XamlType, atau melalui API yang diekspos pada pembaca XAML dan penulis XAML yang menggunakan konteks skema XAML default.

Anda dapat membuat XamlSchemaContext yang merangkum perilaku default dengan memanggil XamlSchemaContext konstruktor. Ini secara eksplisit membuat konteks skema XAML default. Konteks skema XAML default yang sama dibuat secara implisit, jika Anda menginisialisasi pembaca XAML atau penulis XAML menggunakan API yang tidak secara eksplisit mengambil XamlSchemaContext parameter input.

Konteks skema XAML default bergantung pada pantulan CLR untuk perilaku pemetaan jenisnya. Ini termasuk memeriksa CLR Typeyang menentukan , dan terkait PropertyInfo atau MethodInfo. Selain itu, atribusi CLR pada jenis atau anggota digunakan untuk mengisi spesifik untuk jenis XAML atau informasi anggota XAML yang menggunakan jenis backing CLR. Konteks skema XAML default tidak memerlukan teknik ekstensi sistem jenis seperti Invoker pola, karena informasi yang diperlukan tersedia dari sistem jenis CLR.

Untuk logika pemuatan perakitan, konteks skema XAML default terutama bergantung pada nilai rakitan apa pun yang disediakan dalam pemetaan namespace XAML. Selain itu, LocalAssembly dapat mengisyaratkan rakitan untuk dimuat, untuk skenario seperti memuat jenis internal.

Konteks Skema WPF XAML

Konteks skema WPF XAML dijelaskan dalam topik ini karena implementasi WPF memberikan ilustrasi menarik tentang jenis fitur yang dapat diperkenalkan dengan menerapkan konteks skema XAML non-default. Selain itu, konsep konteks skema XAML tidak banyak dibahas dalam dokumentasi WPF yang membahas WPF XAML; perilaku yang diaktifkan konteks skema XAML mungkin hanya dapat dimengerti sepenuhnya jika diintegrasikan dengan diskusi tentang cara kerja konteks skema XAML default. Konteks skema WPF XAML mengimplementasikan perilaku berikut.

Penimpaan pencarian: WPF memiliki beberapa con mode tenda ls untuk XAML di mana ada properti konten XAML yang berfungsi tanpa dikaitkanContentPropertyAttribute. LookupContentProperty mengambil alih untuk WPF menerapkan perilaku ini.

Tangguhkan untuk ekspresi WPF: WPF menampilkan beberapa kelas ekspresi yang menuguhkan nilai hingga konteks runtime tersedia. Selain itu, ekspansi templat adalah perilaku runtime yang bergantung pada teknik penangguhan.

Pengoptimalan pencarian sistem jenis: WPF memiliki model kosakata dan objek XAML yang luas, termasuk definisi anggota kelas dasar yang mewarisi ratusan kelas yang ditentukan WPF secara harfiah. Selain itu, WPF sendiri tersebar di beberapa rakitan. WPF mengoptimalkan pencarian jenisnya menggunakan tabel pencarian dan teknik lainnya. Ini memberikan peningkatan performa atas konteks skema XAML default dan pencarian jenis berbasis CLR-nya. Dalam kasus di mana jenis tidak ada dalam tabel pencarian, perilaku menggunakan teknik konteks skema XAML yang mirip dengan konteks skema XAML default.

Ekstensi XamlType dan XamlMember: WPF memperluas konsep properti dengan properti dependensi, dan konsep peristiwa dengan peristiwa yang dirutekan. Untuk memberikan konsep ini visibilitas yang lebih besar untuk operasi pemrosesan XAML, WPF memperluas XamlType dan XamlMember, dan menambahkan properti internal yang melaporkan properti dependensi dan karakteristik peristiwa yang dirutekan.

Mengakses Konteks Skema WPF XAML

Jika Anda menggunakan teknik XAML yang didasarkan pada WPF System.Windows.Markup.XamlReader atau System.Windows.Markup.XamlWriter, konteks skema WPF XAML sudah digunakan pada implementasi pembaca XAML dan penulis XAML tersebut.

Jika Anda menggunakan implementasi pembaca XAML lain atau penulis XAML yang tidak menginisialisasi dengan konteks skema WPF XAML, Anda mungkin bisa mendapatkan konteks skema WPF XAML yang berfungsi dari XamlReader.GetWpfSchemaContext. Anda kemudian dapat menggunakan nilai ini sebagai inisialisasi untuk API lain yang menggunakan XamlSchemaContext. Misalnya, Anda dapat memanggil XamlXmlReader inisialisasi dan meneruskan konteks skema WPF XAML. Atau Anda dapat menggunakan konteks skema WPF XAML untuk operasi sistem jenis XAML. Ini mungkin termasuk inisialisasi konstruksi dari XamlType atau XamlMember, atau memanggil XamlSchemaContext.GetXamlType.

Perhatikan bahwa jika Anda mengakses aspek tertentu dari WPF XAML dari perspektif aliran simpul XAML murni, beberapa kemampuan kerangka kerja WPF mungkin belum bertindak. Misalnya, templat WPF untuk kontrol belum diterapkan. Jadi, jika Anda mengakses properti yang pada waktu proses mungkin diisi dengan pohon visual penuh, Anda mungkin hanya melihat nilai properti yang mereferensikan templat. Konteks layanan yang disediakan untuk ekstensi markup WPF mungkin juga tidak akurat jika disediakan dari situasi non-runtime, dan dapat mengakibatkan pengecualian saat mencoba menulis grafik objek.

Pemuatan XAML dan Assembly

Pemuatan perakitan untuk Layanan XAML dan .NET XAML terintegrasi dengan konsep yang ditentukan CLR dari AppDomain. Konteks skema XAML menginterpretasikan cara memuat rakitan atau menemukan jenis pada waktu proses atau waktu desain, berdasarkan penggunaan AppDomain dan faktor lainnya. Logikanya sedikit berbeda tergantung pada apakah XAML longgar XAML untuk pembaca XAML, adalah XAML yang dikompilasi ke dalam DLL oleh XamlBuildTask, atau BAML yang dihasilkan oleh WPF PresentationBuildTask.

Konteks skema XAML untuk WPF terintegrasi dengan model aplikasi WPF, yang pada gilirannya menggunakan AppDomain serta faktor lain yang merupakan detail implementasi WPF.

Input pembaca XAML (XAML longgar)

  1. Konteks skema XAML berulang melalui AppDomain aplikasi, mencari rakitan yang sudah dimuat yang cocok dengan semua aspek nama, mulai dari rakitan yang baru dimuat. Jika kecocokan ditemukan, rakitan tersebut digunakan untuk resolusi.

  2. Jika tidak, salah satu teknik berikut berdasarkan CLR Assembly API digunakan untuk memuat rakitan:

XamlBuildTask

XamlBuildTask digunakan untuk Windows Communication Foundation (WCF) dan Windows Workflow Foundation.

Perhatikan bahwa referensi rakitan melalui XamlBuildTask selalu sepenuhnya memenuhi syarat.

  1. Panggil Assembly.Load(String) pada nama yang memenuhi syarat.

  2. Jika langkah sebelumnya gagal, gunakan nama pendek (dan token kunci publik jika ada) untuk memanggil Assembly.Load(String).

BAML (PresentationBuildTask)

Ada dua aspek untuk pemuatan rakitan untuk BAML: memuat rakitan awal yang berisi BAML sebagai komponen, dan memuat rakitan type-backing untuk jenis apa pun yang dirujuk oleh produksi BAML.

Beban rakitan untuk markup awal:

Referensi ke rakitan untuk memuat markup dari selalu tidak memenuhi syarat.

  1. Konteks skema WPF XAML melakukan iterasi melalui AppDomain aplikasi WPF, mencari rakitan yang sudah dimuat yang cocok dengan semua aspek nama, mulai dari rakitan yang terakhir dimuat. Jika kecocokan ditemukan, rakitan tersebut digunakan untuk resolusi.

  2. Jika langkah sebelumnya gagal, gunakan nama pendek (dan token kunci publik jika ada) untuk memanggil Assembly.Load(String).

Referensi rakitan berdasarkan jenis BAML:

Referensi perakitan untuk jenis yang digunakan dalam produksi BAML selalu sepenuhnya memenuhi syarat, sebagai output dari tugas build.

  1. Konteks skema WPF XAML melakukan iterasi melalui AppDomain aplikasi WPF, mencari rakitan yang sudah dimuat yang cocok dengan semua aspek nama, mulai dari rakitan yang terakhir dimuat. Jika kecocokan ditemukan, rakitan tersebut digunakan untuk resolusi.

  2. Jika tidak, salah satu teknik berikut digunakan untuk memuat assembly:

    • Panggil Assembly.Load(String) pada nama yang memenuhi syarat.

    • Jika kombinasi nama pendek + token kunci publik cocok dengan rakitan tempat BAML dimuat, gunakan rakitan tersebut.

    • Gunakan nama pendek + token kunci publik untuk memanggil Assembly.Load(String).

Baca juga