WindowsPhone中的ScrollableTextBlock

最近在研究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?我尝试过了不做除法也可以正常运行。


如果有朋友能够帮我解答一下我将非常感激!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章