XAML 中的空格符處理
XAML 狀態的語言規則,表示 XAML 處理器實作必須處理大量空格符。 本文記載這些 XAML 語言規則。 它也記錄了 WINDOWS Presentation Foundation (WPF) 實作定義之 XAML 處理器和 XAML 寫入器進行串行化的其他空格符處理。
空格元定義
與 XML 一致,XAML 中的空格符是空格符、換行符和索引標籤。這些值分別對應至 Unicode 值 0020、000A 和 0009。
空格元正規化
根據預設,當 XAML 處理器處理 XAML 檔案時,會發生下列空格元正規化:
東亞字元之間的換行字元會移除。 如需此字詞的定義,請參閱本主題稍後的一節。
所有空格元(空格、換行字元、製表元)都會轉換成空格。
所有連續空格都會刪除,並以一個空格取代。
刪除緊接在開始標記後面的空格。
刪除結尾標記前的空格。
“Default” 會對應至 xml:space 屬性預設值所表示的狀態。
內部文字中的空格元和字串基本類型
先前的正規化規則會套用至 XAML 元素內找到的內部文字。 正規化之後,XAML 處理器會將任何內部文字轉換成適當的類型,如下所示:
如果屬性的類型不是集合,但不是直接 Object 類型,XAML 處理器會嘗試使用其類型轉換器轉換成該類型。 此處失敗的轉換會導致編譯時間錯誤。
如果屬性的類型是集合,而且內部文字是連續的(沒有介入的元素標記),內部文字就會剖析為單一 String。 如果集合類型無法接受 String,這也會導致編譯時期錯誤。
如果屬性的類型是 Object,則內部文字會剖析為單一 String。 如果有介入的元素標記,這會導致編譯時間錯誤,因為 Object 類型表示單一物件(String 或其他)。
如果屬性的類型是集合,而且內部文字不是連續的,則第一個子字元串會轉換成 String 並新增為集合專案,交錯專案會新增為集合專案,最後會將尾端子字元串新增為第三個 String 專案。
保留空格符
來源 XAML 中有數種技術可保留空格符,以供最終呈現不受 XAML 處理器空格符正規化影響。
xml:space=“preserve”:在想要保留空格符的專案層級指定此屬性。 這會保留所有空格符,其中包括程式代碼編輯應用程式可能會新增到「漂亮的列印」對齊元素的空間,以可視化方式直覺的巢狀結構。 不過,這些空格轉譯是否由包含項目的內容模型所決定。 請避免在根層級指定 xml:space="preserve"
,因為不論您如何設定屬性,大多數物件模型都不會將空格符視為重要。 全域設定 xml:space
在某些實作中,可能會對 XAML 處理(特別是串行化)產生效能後果。 最好只在字串內呈現空格符的專案層級,或是空格元重要集合的層級設定屬性。
實體和非中斷空格:XAML 支援將任何 Unicode 實體放在文字物件模型中。 您可以在UTF-8編碼中使用專用實體,例如非中斷空間( )。 您也可以使用支援不中斷空格字元的 RTF 控制件。 如果您使用實體來模擬版面配置特性,例如縮排,您應該謹慎,因為實體的運行時間輸出會根據比產生一般版面配置系統的功能更大的因素而有所不同,例如適當使用面板和邊界。 例如,實體會對應至字型,而且可以變更大小以回應使用者字型選取。
東亞字元
「東亞字元」定義為一組 Unicode 字元範圍 U+20000 到 U+2FFFD,U+30000 到 U+3FFFD。 此子集有時也稱為「CJK 表意」。 如需詳細資訊,請參閱 https://www.unicode.org。
空格元和文字內容模型
實際上,保留空格符只關心所有可能內容模型的子集。 該子集是由內容模型所組成,這些模型可以採用某種形式的單一 String 類型、專用 String 集合,或混合 IList 或 ICollection<T> 集合中的 String 和其他類型。
WPF 中的空格符和文字內容模型
為了說明目的,本節的其餘部分會參考 WPF 所定義的特定類型。 本文所述的空格符處理功能與 .NET XAML 服務和 WPF 都相關。 若要查看此作用中的行為,您可以實驗某些 WPF XAML 標記、在物件圖形中檢視結果,然後再次串行化回標記。
即使是可以接受字串的內容模型,這些內容模型中的預設行為是,任何保留的空格符都不會被視為重要。 例如,ListBox 會採用 IList,但不會保留和未轉譯每個 ListBoxItem之間的換行符。 如果您嘗試使用換行字元做為 ListBoxItem 專案字串之間的分隔符,則完全無法運作;以換行字元分隔的字串會被視為一個字串和一個專案。
那些將空格符視為重大的集合通常是流程檔模型的一部分。 支援空白保留行為的主要集合 InlineCollection。 這個集合類別是以 WhitespaceSignificantCollectionAttribute宣告的;找到此屬性時,XAML 處理器會將集合內的空格符視為重要。
WhitespaceSignificantCollectionAttribute 表示集合內 xml:space="preserve"
和空格符的組合是保留和轉譯所有空格符。
WhitespaceSignificantCollectionAttribute 內 xml:space="default"
和空格符的組合會導致先前所述的初始空格正規化,這會在特定位置留下一個空格,並保留和轉譯這些空格。 您需要哪種行為,而且您應該選擇性地使用 xml:space
來啟用您想要的行為。
此外,在流程檔模型中表示換行符的特定內嵌項目,應該刻意不要在空格符大量集合中引進額外的空間。 例如,LineBreak 元素的用途與 HTML 中的 <BR/> 標記相同,而且為了在標記中具有可讀性,通常 LineBreak 會與撰寫的換行字元隔開任何後續文字。 該換行不應正規化成後續行的前置空格。 若要啟用該行為,LineBreak 項目的類別定義會套用 TrimSurroundingWhitespaceAttribute,然後由 XAML 處理器解譯,表示一律修剪圍繞 LineBreak 的空格符。
另請參閱
- XAML 概觀 (WPF .NET)
- XML 字元實體和 XAML
- XAML 中的 xml:space 處理