Bagikan melalui


Pemrosesan spasi kosong di XAML

Aturan bahasa untuk status XAML bahwa ruang kosong yang signifikan harus diproses oleh implementasi prosesor XAML. Artikel ini men dokumentasikan aturan bahasa XAML ini. Ini juga mencakup penanganan ruang putih tambahan yang didefinisikan oleh implementasi Windows Presentation Foundation (WPF) dari prosesor XAML dan penulis XAML untuk serialisasi.

Definisi spasi putih

Konsisten dengan XML, karakter spasi putih di XAML adalah spasi, linefeed, dan tab. Ini sesuai dengan nilai Unicode masing-masing 0020, 000A, dan 0009.

Normalisasi spasi putih

Secara default normalisasi spasi putih berikut terjadi ketika prosesor XAML memproses file XAML:

  1. Karakter linefeed antara karakter Asia Timur dihapus. Lihat bagian "Karakter Asia Timur" nanti dalam topik ini untuk definisi istilah ini.

  2. Semua karakter spasi putih (spasi, umpan baris, tab) dikonversi menjadi spasi.

  3. Semua spasi berturut-turut dihapus dan digantikan oleh satu spasi.

  4. Spasi yang segera mengikuti tag mulai dihapus.

  5. Spasi segera sebelum tag akhir dihapus.

"Default" sesuai dengan status yang ditandai dengan nilai default atribut xml:space .

Spasi kosong dalam teks dalam, dan primitif string

Aturan normalisasi sebelumnya berlaku untuk teks dalam yang ditemukan dalam elemen XAML. Setelah normalisasi, prosesor XAML mengonversi teks dalam apa pun menjadi jenis yang sesuai sebagai berikut:

  • Jika jenis properti bukan koleksi tetapi bukan jenis secara langsung Object , prosesor XAML mencoba mengonversi ke jenis tersebut dengan menggunakan pengonversi jenisnya. Konversi yang gagal di sini menyebabkan kesalahan waktu kompilasi.

  • Jika jenis properti adalah koleksi dan teks dalam berdekatan (tidak ada tag elemen intervensi), teks dalam diurai sebagai satu String. Jika jenis koleksi tidak dapat menerima String, ini juga menyebabkan kesalahan waktu kompilasi.

  • Jika jenis properti adalah Object, teks dalam diurai sebagai satu String. Jika ada tag elemen intervensi, ini menyebabkan kesalahan waktu kompilasi karena jenis menyiratkan Object satu objek (String atau sebaliknya).

  • Jika jenis properti adalah koleksi, dan teks dalam tidak bersebelahan, substring pertama dikonversi menjadi String dan ditambahkan sebagai item koleksi, elemen intervensi ditambahkan sebagai item koleksi, dan akhirnya substring berikutnya (jika ada) ditambahkan ke koleksi sebagai item ketiga String .

Mempertahankan spasi kosong

Ada beberapa teknik untuk mempertahankan ruang putih di XAML sumber untuk presentasi akhirnya yang tidak terpengaruh oleh normalisasi ruang putih prosesor XAML.

xml:space="preserve": Tentukan atribut ini pada tingkat elemen tempat pelestarian spasi putih diinginkan. Ini mempertahankan semua spasi kosong, yang mencakup spasi yang mungkin ditambahkan oleh aplikasi pengeditan kode ke elemen sejajar "pretty-print" sebagai sarang yang intuitif secara visual. Namun, apakah spasi tersebut dirender ditentukan oleh con mode tenda l untuk elemen yang mengandung. Hindari menentukan xml:space="preserve" di tingkat akar karena sebagian besar model objek tidak menganggap spasi kosong sebagai signifikan terlepas dari bagaimana Anda mengatur atribut. Pengaturan xml:space secara global mungkin memiliki konsekuensi performa pada pemrosesan XAML (terutama serialisasi) dalam beberapa implementasi. Ini adalah praktik yang lebih baik untuk hanya mengatur atribut secara khusus pada tingkat elemen yang merender spasi putih dalam string, atau merupakan koleksi signifikan spasi putih.

Entitas dan spasi non-breaking: XAML mendukung penempatan entitas Unicode dalam model objek teks. Anda dapat menggunakan entitas khusus seperti ruang tidak pecah (  dalam pengodean UTF-8). Anda juga dapat menggunakan kontrol teks kaya yang mendukung karakter spasi yang tidak pecah. Anda harus berhati-hati jika Anda menggunakan entitas untuk mensimulasikan karakteristik tata letak seperti indentasi, karena output run-time entitas akan bervariasi berdasarkan sejumlah besar faktor daripada kemampuan untuk menghasilkan indentasi menghasilkan sistem tata letak umum, seperti penggunaan panel dan margin yang tepat. Misalnya, entitas dipetakan ke font dan dapat mengubah ukuran sebagai respons terhadap pilihan font pengguna.

Karakter Asia Timur

"Karakter Asia Timur" didefinisikan sebagai sekumpulan rentang karakter Unicode U+20000 hingga U+2FFFD dan U+30000 hingga U+3FFFD. Subset ini juga terkadang disebut sebagai "ideograf CJK". Untuk informasi selengkapnya, lihat https://www.unicode.org .

Spasi kosong dan teks con mode tenda ls

Dalam praktiknya, mempertahankan ruang putih hanya menjadi perhatian untuk subset semua kemungkinan con mode tenda ls. Subset tersebut terdiri dari con mode tenda ls yang dapat mengambil jenis singleton String dalam beberapa bentuk, koleksi khususString, atau campuran dan String jenis lain dalam suatu IList atau ICollection<T> koleksi.

Spasi kosong dan teks con mode tenda ls di WPF

Untuk tujuan ilustrasi, sisa bagian ini mereferensikan jenis tertentu yang ditentukan oleh WPF. Fitur penanganan spasi putih yang dijelaskan dalam artikel ini berkaitan dengan Layanan .NET XAML dan WPF. Untuk melihat perilaku ini beraksi, Anda mungkin bereksperimen dengan beberapa markup WPF XAML, melihat hasilnya dalam grafik objek, lalu membuat serialisasi kembali ke markup lagi.

Bahkan untuk con mode tenda ls yang dapat mengambil string, perilaku default dalam con ini mode tenda ls adalah bahwa ruang kosong yang tersisa tidak diperlakukan sebagai signifikan. Misalnya, ListBox mengambil IList, tetapi spasi kosong (seperti linefeed di antara masing-masing ListBoxItem) tidak dipertahankan dan tidak dirender. Jika Anda mencoba menggunakan linefeed sebagai pemisah antara string untuk ListBoxItem item, itu tidak berfungsi sama sekali; string yang dipisahkan oleh linefeed diperlakukan sebagai satu string dan satu item.

Koleksi yang memperlakukan ruang kosong sebagai signifikan biasanya merupakan bagian dari model dokumen alur. Koleksi utama yang mendukung perilaku pelestarian spasi putih adalah InlineCollection. Kelas koleksi ini dideklarasikan dengan WhitespaceSignificantCollectionAttribute; ketika atribut ini ditemukan, prosesor XAML akan memperlakukan ruang kosong dalam koleksi sebagai signifikan. Kombinasi xml:space="preserve" ruang kosong dan dalam koleksi yang WhitespaceSignificantCollectionAttribute ditandai adalah bahwa semua spasi kosong dipertahankan dan dirender. Kombinasi xml:space="default" ruang kosong dan dalam menyebabkan WhitespaceSignificantCollectionAttribute normalisasi spasi putih awal yang dijelaskan sebelumnya, yang meninggalkan satu ruang dalam posisi tertentu, dan ruang tersebut dipertahankan dan dirender. Perilaku mana yang diinginkan terserah Anda, dan Anda harus menggunakan xml:space secara selektif untuk mengaktifkan perilaku yang Anda inginkan.

Selain itu, elemen sebaris tertentu yang menunjukkan jeda baris dalam model dokumen alur harus sengaja tidak memperkenalkan ruang tambahan bahkan dalam koleksi signifikan spasi putih. Misalnya, LineBreak elemen memiliki tujuan yang sama dengan <tag BR/> dalam HTML, dan untuk keterbacaan dalam markup, biasanya dipisahkan LineBreak dari teks berikutnya oleh linefeed yang ditulis. Linefeed tersebut tidak boleh dinormalisasi untuk menjadi ruang terdepan di baris berikutnya. Untuk mengaktifkan perilaku itu, definisi kelas untuk LineBreak elemen menerapkan TrimSurroundingWhitespaceAttribute, yang kemudian ditafsirkan oleh prosesor XAML untuk berarti bahwa ruang kosong di sekitarnya LineBreak selalu dipangkas.

Baca juga