最近在研究RestAPI的時候出現了這樣一個情況,把得到的xml文件放入一個textblock的時候顯示不完全。到網上一查發現,sliverlight的textblock最多顯示2000像素高。索性在網上找找有沒有現成的控件,倒是被我找到一個:
ScrollableTextBlock (http://archive.msdn.microsoft.com/wp7controls/Release/ProjectReleases.aspx?ReleaseId=4951)
下載下來試用了一下,嗯,不錯。在英文狀態下非常棒,但是中文狀態不行。
然後就好好看了一下代碼,發現在MeasureString中有一行
string[] words = text.Split(' ');用以把一行字符串分割。我猜想這就是導致中文無法正常顯示的原因。此時我們可以把split的參數換成一個char數組:
string[] words = text.Split(new[] { '、', ',', '。', ';', '!', '?', '(', ')', '“', '”', '"', '-', ',', '.', ' ', '(', ')', '[', ']', });把能想到的中英文標點符號放進去。還有一點是要把下面的
sb.Append(" " + words[i]);換成之前的標點:
sb.Append(text[sb.Length] + words[i]);這樣就可以了。
整個MeasureString變成下面這樣:
private int MeasureString(string text, int desWidth)
{
int nWidth = 0;
int charactersFitted = 0;
StringBuilder sb = new StringBuilder();
//get original size
Size size = MeasureString(text);
if (size.Width > desWidth)
{
string[] words = text.Split(new[] { '、', ',', '。', ';', '!', '?', '(', ')', '“', '”', '"', '-', ',', '.', ' ', '(', ')', '[', ']', });
sb.Append(words[0]);
for (int i = 1; i < words.Length; i++)
{
sb.Append(text[sb.Length] + words[i]);
nWidth = (int)MeasureString(sb.ToString()).Width;
if (nWidth > desWidth)
{
sb.Remove(sb.Length - words[i].Length, words[i].Length);
break;
}
}
charactersFitted = sb.Length;
}
else
{
charactersFitted = text.Length;
}
return charactersFitted;
}
而關於這個控件的代碼,我還有一點問題:
1. 爲什麼作者在GetMaxTextSize中用來測量單個字符的" "可以在中文狀態下也顯示良好,而不用換成中文字符?
2.爲什麼在GetMaxTextSize中最後要除以2?我嘗試過了不做除法也可以正常運行。
如果有朋友能夠幫我解答一下我將非常感激!