最近在研究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?我尝试过了不做除法也可以正常运行。
如果有朋友能够帮我解答一下我将非常感激!