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?我嘗試過了不做除法也可以正常運行。


如果有朋友能夠幫我解答一下我將非常感激!

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