Bagikan melalui


Namespace Layanan XAML dan Pemetaan Namespace layanan untuk WPF XAML

Topik ini lebih lanjut menjelaskan keberadaan dan tujuan dari dua pemetaan namespace XAML seperti yang sering ditemukan dalam tag akar file WPF XAML. Ini juga menjelaskan cara menghasilkan pemetaan serupa untuk menggunakan elemen yang ditentukan dalam kode Anda sendiri, dan/atau dalam rakitan terpisah.

Apa itu Namespace XAML

Namespace XAML benar-benar merupakan ekstensi dari konsep namespace XML. Teknik menentukan namespace XAML mengandalkan sintaks namespace XML, konvensi penggunaan URI sebagai pengidentifikasi namespace, menggunakan awalan untuk menyediakan sarana untuk mereferensikan beberapa namespace dari sumber markup yang sama, dan sebagainya. Konsep utama yang ditambahkan ke definisi XAML dari namespace XML adalah bahwa namespace XAML menyiratkan cakupan keunikan untuk penggunaan markup, dan juga memengaruhi bagaimana entitas markup berpotensi didukung oleh namespace CLR tertentu dan rakitan yang direferensikan. Pertimbangan terakhir ini juga dipengaruhi oleh konsep konteks skema XAML. Tetapi untuk tujuan cara kerja WPF dengan namespace XAML, Anda umumnya dapat memikirkan namespace XAML dalam hal namespace XAML default, namespace bahasa XAML, dan namespace XAML lebih lanjut seperti yang dipetakan oleh markup XAML Anda langsung ke namespace layanan CLR cadangan tertentu dan rakitan yang dirujuk.

Deklarasi Namespace Layanan WPF dan XAML

Dalam deklarasi namespace layanan dalam tag akar banyak file XAML, Anda akan melihat bahwa biasanya ada dua deklarasi namespace XML. Deklarasi pertama memetakan namespace XAML klien/kerangka kerja WPF secara keseluruhan sebagai default:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

Deklarasi kedua memetakan namespace XAML terpisah, memetakannya (biasanya) ke awalan x: .

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Hubungan antara deklarasi ini adalah bahwa x: pemetaan awalan mendukung intrinsik yang merupakan bagian dari definisi bahasa XAML, dan WPF adalah salah satu implementasi yang menggunakan XAML sebagai bahasa dan mendefinisikan kosakata objeknya untuk XAML. Karena penggunaan kosakata WPF akan jauh lebih umum daripada penggunaan intrinsik XAML, kosakata WPF dipetakan sebagai default.

Konvensi x: awalan untuk memetakan dukungan intrinsik bahasa XAML diikuti oleh templat proyek, kode sampel, dan dokumentasi fitur bahasa dalam SDK ini. Namespace XAML mendefinisikan banyak fitur yang umum digunakan yang diperlukan bahkan untuk aplikasi WPF dasar. Misalnya, untuk menggabungkan kode apa pun ke file XAML melalui kelas parsial, Anda harus memberi nama kelas tersebut x:Class sebagai atribut dalam elemen akar file XAML yang relevan. Atau, elemen apa pun seperti yang didefinisikan dalam halaman XAML yang ingin Anda akses sebagai sumber daya utama harus memiliki x:Key atribut yang diatur pada elemen yang dimaksud. Untuk informasi selengkapnya tentang ini dan aspek XAML lainnya, lihat XAML dalam Sintaks WPF atau XAML Secara Terperinci.

Pemetaan ke Kelas dan Rakitan Kustom

Anda dapat memetakan namespace XML ke rakitan menggunakan serangkaian token dalam xmlns deklarasi awalan, mirip dengan bagaimana namespace layanan XAML WPF dan XAML-intrinsik standar dipetakan ke awalan.

Sintaks mengambil kemungkinan token bernama berikut dan nilai berikut:

clr-namespace: Namespace CLR yang dideklarasikan dalam rakitan yang berisi jenis publik untuk diekspos sebagai elemen.

assembly= Rakitan yang berisi beberapa atau semua namespace CLR yang dirujuk. Nilai ini biasanya hanya nama rakitan, bukan jalur, dan tidak menyertakan ekstensi (seperti .dll atau .exe). Jalur ke assembly tersebut harus ditetapkan sebagai referensi proyek dalam file proyek yang berisi XAML yang anda coba petakan. Untuk menggabungkan penerapan versi dan penandatanganan nama yang kuat, assembly nilainya dapat menjadi string seperti yang didefinisikan oleh AssemblyName, daripada nama string sederhana.

Perhatikan bahwa karakter yang memisahkan clr-namespace token dari nilainya adalah titik dua (:) sedangkan karakter yang memisahkan assembly token dari nilainya adalah tanda sama dengan (=). Karakter yang digunakan di antara kedua token ini adalah titik koma. Selain itu, jangan sertakan ruang kosong di mana saja dalam deklarasi.

Contoh pemetaan kustom dasar

Kode berikut mendefinisikan contoh kelas kustom:

namespace SDKSample {  
    public class ExampleClass : ContentControl {  
        public ExampleClass() {  
        ...  
        }  
    }  
}  
Namespace SDKSample  
    Public Class ExampleClass  
        Inherits ContentControl  
         ...  
        Public Sub New()  
        End Sub  
    End Class  
End Namespace  

Kelas kustom ini kemudian dikompilasi ke dalam pustaka, yang sesuai pengaturan proyek (tidak ditampilkan) diberi nama SDKSampleLibrary.

Untuk mereferensikan kelas kustom ini, Anda juga perlu menyertakannya sebagai referensi untuk proyek Anda saat ini, yang biasanya Anda lakukan menggunakan UI Penjelajah Solusi di Visual Studio.

Sekarang setelah Anda memiliki pustaka yang berisi kelas, dan referensi ke dalamnya dalam pengaturan proyek, Anda dapat menambahkan pemetaan awalan berikut sebagai bagian dari elemen akar Anda di XAML:

xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"

Untuk menyatukan semuanya, berikut ini adalah XAML yang menyertakan pemetaan kustom bersama dengan pemetaan default dan x: umum di tag akar, lalu menggunakan referensi awalan untuk membuat instans ExampleClass di UI tersebut:

<Page x:Class="WPFApplication1.MainPage"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary">  
  ...  
  <custom:ExampleClass/>  
...  
</Page>  

Pemetaan ke Rakitan Saat Ini

assembly dapat dihilangkan jika referensi clr-namespace sedang didefinisikan dalam rakitan yang sama dengan kode aplikasi yang mereferensikan kelas kustom. Atau, sintaks yang setara untuk kasus ini adalah menentukan assembly=, tanpa token string setelah tanda sama dengan.

Kelas kustom tidak dapat digunakan sebagai elemen akar halaman jika didefinisikan dalam rakitan yang sama. Kelas parsial tidak perlu dipetakan; hanya kelas yang bukan kelas parsial halaman dalam aplikasi Anda yang perlu dipetakan jika Anda ingin mereferensikannya sebagai elemen di XAML.

Memetakan Namespace CLR ke Namespace XML di Assembly

WPF mendefinisikan atribut CLR yang digunakan oleh prosesor XAML untuk memetakan beberapa namespace CLR ke satu namespace XAML. Atribut ini, XmlnsDefinitionAttribute, ditempatkan pada tingkat perakitan dalam kode sumber yang menghasilkan assembly. Kode sumber rakitan WPF menggunakan atribut ini untuk memetakan berbagai namespace umum, seperti System.Windows dan System.Windows.Controls, ke http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace layanan.

mengambil XmlnsDefinitionAttribute dua parameter: nama namespace XML/XAML, dan nama namespace CLR. Lebih dari satu XmlnsDefinitionAttribute dapat ada untuk memetakan beberapa namespace CLR ke namespace XML yang sama. Setelah dipetakan, anggota namespace tersebut juga dapat dirujuk tanpa kualifikasi penuh jika diinginkan dengan memberikan pernyataan yang sesuai using di halaman kode-belakang kelas parsial. Untuk detail selengkapnya, lihat XmlnsDefinitionAttribute.

Namespace Perancang dan Awalan Lainnya Dari Templat XAML

Jika Anda bekerja dengan lingkungan pengembangan dan/atau alat desain untuk WPF XAML, Anda mungkin melihat bahwa ada namespace XAML / awalan lain yang ditentukan dalam markup XAML.

WPF Designer untuk Visual Studio menggunakan namespace perancang yang biasanya dipetakan ke awalan d:. Templat proyek yang lebih baru untuk WPF mungkin telah memetakan namespace XAML ini untuk mendukung pertukaran XAML antara WPF Designer untuk Visual Studio dan lingkungan desain lainnya. Namespace XAML desain ini digunakan untuk mengabadikan status desain saat melakukan roundtripping UI berbasis XAML dalam perancang. Ini juga digunakan untuk fitur seperti d:IsDataSource, yang mengaktifkan sumber data runtime dalam perancang.

Awalan lain yang mungkin Anda lihat dipetakan adalah mc:. mc: adalah untuk kompatibilitas markup, dan memanfaatkan pola kompatibilitas markup yang belum tentu khusus XAML. Sampai batas tertentu, fitur kompatibilitas markup dapat digunakan untuk bertukar XAML antara kerangka kerja atau di seluruh batas implementasi pendukung lainnya, bekerja antara konteks skema XAML, memberikan kompatibilitas untuk mode terbatas dalam perancang, dan sebagainya. Untuk informasi selengkapnya tentang konsep kompatibilitas markup dan bagaimana mereka berhubungan dengan WPF, lihat Fitur Bahasa Kompatibilitas Markup (mc:).

Pemuatan WPF dan Assembly

Konteks skema XAML untuk WPF terintegrasi dengan model aplikasi WPF, yang pada gilirannya menggunakan konsep yang ditentukan CLR dari AppDomain. Urutan berikut menjelaskan bagaimana konteks skema XAML menginterpretasikan cara memuat rakitan atau menemukan jenis pada waktu proses atau waktu desain, berdasarkan penggunaan AppDomain WPF dan faktor lainnya.

  1. Iterasi melalui AppDomain, mencari rakitan yang sudah dimuat yang cocok dengan semua aspek nama, mulai dari rakitan yang terakhir dimuat.

  2. Jika nama memenuhi syarat, panggil Assembly.Load(String) nama yang memenuhi syarat.

  3. Jika nama pendek + token kunci publik dari nama yang memenuhi syarat cocok dengan assembly tempat markup dimuat, kembalikan rakitan tersebut.

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

  5. Jika nama tidak memenuhi syarat, panggil Assembly.LoadWithPartialName.

XAML longgar tidak menggunakan Langkah 3; tidak ada rakitan yang dimuat dari.

XAML yang dikompilasi untuk WPF (dihasilkan melalui XamlBuildTask) tidak menggunakan rakitan yang sudah dimuat dari AppDomain (Langkah 1). Selain itu, nama tidak boleh tidak memenuhi syarat dari output XamlBuildTask, sehingga Langkah 5 tidak berlaku.

BAML yang dikompilasi (dihasilkan melalui PresentationBuildTask) menggunakan semua langkah, meskipun BAML juga tidak boleh berisi nama rakitan yang tidak memenuhi syarat.

Baca juga