由於XAML是一種XML,在裏面寫段文字都經常會遇到問題。
* 空格
關於XAML中是如何處理空格的,MSDN上給出了詳細的描述:http://msdn.microsoft.com/en-us/library/cc189036%28v=VS.95%29.aspx#whitespace
摘重要的簡單說一下:
- 空格、回車、製表符都被當做空格。
- 連續的空格會被合併爲一個空格。
- <tag>後緊鄰的空格會被忽略。</tag>前緊鄰的空格會被忽略。換句話說,解析器對<tag>…</tag>中間的字符串做Trim。
如何保留空格
- 給元素加上屬性 xml:space="preserve"
設置了這個屬性之後,會保留元素中所有的空格,不會合並連續空格,也不會trim兩頭的空格。
這個方法有個不便,就是它會保留元素中所有的空格,哪怕這些空格是由代碼格式規整化後產生的。這就意味着,你不能用ctrl+E,F這樣的快捷鍵來整理代碼格式了,一旦不小心整理了,改回來都很麻煩。 -  
因爲XAML支持直接寫Unicode代碼,這串代碼代表一個non breaking space.
複雜的文本
帶有複雜格式的文本,建議使用RichTextBox。
因爲文本元素分爲block和inline兩種,TextBlock僅允許包含inline,所以用來展示少量的文本比較合適。
如果格式比較複雜,注意用好span,span與run的不同在於,span不會繼承父元素的格式,相當於重置格式,不受父元素格式的影響。
* 換行
在XAML中輸入回車會被當做一個空格,所有換行要用<LineBreak/>。
另外,兩個Run相鄰,如果是如下排列:
<Run>ab</Run>
<Run>cd</Run>
則顯示成:
ab
cd
會自動在兩個Run之間加上換行符。
如果要讓回車去掉,顯示成abcd,則應該寫在一行裏:
<Run>ab</Run><Run>cd</Run>
* Tab
首先,XAML中沒有tab,只能用連續的空格來代替。
需要注意,在將一個string賦值給RichTextBox的Xaml屬性時,會合並掉連續的空格,所有如果要保留tab(連續的空格),需要進行這樣一個workaround:
private const string TAB = " "; private const string TAB_PLACEHOLDER = "===TAB==="; textBox1.Text = richTextBox1.Xaml; string xaml = richTextBox1.Xaml; xaml = xaml.Replace(TAB, TAB_PLACEHOLDER); richTextBox2.Xaml = xaml; foreach (Block block in richTextBox2.Blocks) { foreach (Inline inline in ((Paragraph)block).Inlines) { ((Run)inline).Text = ((Run)inline).Text.Replace(TAB_PLACEHOLDER, TAB); } }
先用一個佔位符來代替四個空格,這樣在給richTextBox的xaml屬性賦值的時候就不會合並空格了。
然後再替換這個佔位符,賦完值替換的時候不會進行合併。
==================================================
XAML被XML規則綁定。例如XML對幾個特殊字符有特別意義,像&,<,>。如果你嘗試用這些值來設置一個元素的內容,你可能會出錯,因爲XAML解析器假設你正在試圖做某些事情,比如創建嵌套元素。你可以使用字符實體,例如<用<,>用>,&用&,"用" 特殊字符不是你運行XAML的一障礙,另外一個是空格處理。一個字符串前,後,字符串中的空格,TAB,回車鍵都會被忽視掉,只保留一個空格。你可以使用XML:space="preserve",保留任何空格,TAB,回車鍵。注意,這些規則只對XAML有用,如果你在代碼中設置內容,任何空格都會保留。
特殊字符和空格
下面的字符在 [XML]中被定義爲 空白(whitespace)字符:
空格 ( )Tab (	)
回車 (
)
換行 (
)