XAML 中的空白字元處理

XAML 狀態的語言規則,表示 XAML 處理器實作必須處理大量空格符。 本文記載這些 XAML 語言規則。 它也記錄了 WINDOWS Presentation Foundation (WPF) 實作定義之 XAML 處理器和 XAML 寫入器進行串行化的其他空格符處理。

空格元定義

與 XML 一致,XAML 中的空格符是空格符、換行符和索引標籤。這些值分別對應至 Unicode 值 0020、000A 和 0009。

空格元正規化

根據預設,當 XAML 處理器處理 XAML 檔案時,會發生下列空格元正規化:

  1. 東亞字元間的換行字元會遭到移除。 如需這個詞彙的定義,請參閱本主題稍後的<東亞字元>一節。

  2. 所有空格元(空格、換行字元、製表元)都會轉換成空格。

  3. 所有連續的空格會被刪除並取代為一個空格。

  4. 緊接在開始標記之後的空格會遭到刪除。

  5. 緊接在結束標記之前的空格會遭到刪除。

「預設」會對應到 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

空格符和文字 con 帳篷模式 ls

實際上,保留空格符只關心所有可能 con 帳篷模式 ls 的子集。 組成該子集的內容模型可以接受某種形式的單一 String 類型、專用 String 集合,或者 StringIListICollection<T> 集合中其他類型的混合。

WPF 中的空格符和文字 con 帳篷模式 ls

為了方便說明,本節的其餘部分將參考 WPF 所定義的特定類型。 本文所述的空格符處理功能與 .NET XAML 服務和 WPF 都相關。 若要查看執行中的行為,您可以使用某個 WPF XAML 標記進行實驗,並在物件圖形中檢視結果,然後再重新序列化為標記。

即使是可以接受字串的 con 帳篷模式 ls,這些 con 帳篷模式 ls 中的預設行為是,任何保留的空格符都不會被視為重大。 例如, ListBox 採用 IList,但不會保留空格符(例如每個 ListBoxItem之間的換行符),也不會轉譯。 如果您嘗試使用換行字元做為 ListBoxItem 項目之字串間的分隔符號,則完全無法運作;以換行字元分隔的字串會視為一個字串和一個項目。

那些將空格符視為重大的集合通常是流程檔模型的一部分。 支援空白保留行為的主要集合是 InlineCollection。 這個集合類別是以 宣告; WhitespaceSignificantCollectionAttribute當找到這個屬性時,XAML 處理器會將集合內的空格符視為重要。 所表示集合內的 WhitespaceSignificantCollectionAttribute 和空格符組合xml:space="preserve"是保留和轉譯所有空格符。 和空格符的組合xml:space="default"WhitespaceSignificantCollectionAttribute會導致先前所述的初始空格正規化,這會在特定位置留下一個空格,並保留和轉譯這些空格。 您可以自行決定要使用哪一種行為,而且您應該選擇性地使用 xml:space 來允許您想要的行為。

此外,在流程檔模型中表示換行符的特定內嵌項目,應該刻意不要在空格符大量集合中引進額外的空間。 例如, LineBreak 元素的用途與 <HTML 中的 BR/> 標記相同,而且為了在標記中具有可讀性,通常會 LineBreak 由撰寫的換行字元分隔任何後續文字。 該換行字元不應該正規化為下一行的前置空格。 若要啟用該行為,元素的 LineBreak 類別定義會套用 TrimSurroundingWhitespaceAttribute,然後由 XAML 處理器解譯,表示周圍 LineBreak 一律會修剪空格符。

另請參閱