Share via


XAML 與空格

瞭解 XAML 所使用的空白字元處理規則。

空白字元處理

與 XML 一致,XAML 中的空白字元是空白、換行字元和索引標籤。這些值分別對應至 Unicode 值 0020、000A 和 0009。 預設情況下,當 XAML 處理器在 XAML 檔案中的元素之間發現任何內部文字時,就會發生這個空白字元正規化:

  • 東亞字元間的換行字元會遭到移除。
  • 所有空白字元 (空格、換行字元、定位字元) 都會轉換成空格。
  • 所有連續的空格會被刪除並取代為一個空格。
  • 緊接在開始標記之後的空格會遭到刪除。
  • 緊接在結束標記之前的空格會遭到刪除。
  • 東亞字元定義為一組 Unicode 字元範圍 U+20000 到 U+2FFFD 和 U+30000 到 U+3FFFD。 這個子集有時也稱為「CJK 表意字元」。 如需詳細資訊,請參閱http://www.unicode.org

「預設」會對應到 xml:space 屬性的預設值所表示的狀態。

內部文字中的空白字元及字串基本類型

上述正規化規則適用於 XAML 元素中的內部文字。 正規化後,XAML 處理器將任何內部文字轉換為適當的類型,如下所示:

  • 如果屬性的類型不是集合,但也不是直接的 Object 類型,則 XAML 處理器會嘗試使用其類型轉換器轉換為該類型。 此處失敗的轉換會導致 XAML 剖析錯誤。
  • 如果屬性的類型是集合,並且內部文字是連續的 (沒有中間元素標籤),則內部文字將解析為單一 String。 如果集合類型無法接受 String,這也會造成 XAML 剖析器錯誤。
  • 如果屬性的類型是 Object,則內部文字將被解析為單一 String。 如果存在中間元素標籤,則會導致 XAML 剖析器錯誤,因為物件類型意味著單一物件 (String 或其他物件)。
  • 如果屬性的類型是集合,且內部文字不連續,則將第一個子字串轉換為 String 並新增為集合項,將中間元素新增為集合項,最後將尾隨子字串 (如果有) 做為第三個 String 項目新增到集合中。

空白字元和文字內容模型

實際上,保留空白字元只是考量所有可能的內容模型子集。 此子集由內容模型組成,這些內容模型可以採用某種形式的單例 String 類型、專用 String 集合或 String 與清單、集合或字典中其他類型的混合。

即使是可接受字串的內容模型,這些內容模型中的預設行為也都是不會將任何保留的空白字元視為必要。

保留空白字元

在來源 XAML 中保留空白字元以供最終呈現的多種技術,不受 XAML 處理器空白字元正規化的影響。

xml:space="preserve":在需要保留空白字元的元素層級指定這個屬性。 請注意,這會保留所有空白字元,包括程式碼編輯器或設計介面可能會新增的空白,以將標記元素對齊為視覺化直覺式巢狀結構。 這些空白是否呈現又取決於包含元素的內容模型。 我們不建議您在xml:space="preserve"根層級指定,因為大多數物件模型並不認為空白具有重要意義。 比較好的做法是,只有當項目會呈現字串內的空白字元或本身是需要空白字元的集合時,才在項目層級特別設定這個屬性。

實體和不間斷空格:XAML 支援將任何 Unicode 實體放置在文字物件模型中。 您可以使用專用實體,例如不間斷空格 (採用 UTF-8 編碼)。 您也可以使用支援不分行空格字元的 RTF 文字控制項。 如果您使用實體來模擬配置特徵 (例如縮排),請務必小心,因為與一般配置工具相比,實體的執行階段輸出會根據更多因素而變化,例如面板和邊界的正確使用。