WP7中的使用轻量级的TextBlock控件来显示文本,但是TextBlock显示过长的文本时,会发生截断,过长的部分不显示
如果过长的字符串,可以分解为多个TextBlock来显示,在MSDN上也有相关的实现,但是这个效率很低,而且也不是适合所有的情况,有时还是会出现文本截断问题
http://blogs.msdn.com/b/priozersk/archive/2010/09/08/creating-scrollable-textblock-for-wp7.aspx
我用下面算法来分解字符串,然后生成多个TextBlock放在StackPanel,最后在放在ScrollViewer中
思路:
先设置一个最大长度MAX,然后用 tbList来存放分解出来的字符串
然后以此读取字符串中的每一行,
当所读取字符串长度小于MAX时,继续读取,直到所读取的字符串长度大于MAX
当所读取字符串长度大于MAX时,保存之前读取的字符串到 tbList,然后重新继续
当单行的长度大于MAX时,则按每MAX个字符一个字符串来分解(比如:当MAX=300, 当读取到一行的长度为420,则该行分解为300和120两个长度的字符串,不足)
表达不是很清楚,直接上代码吧
public List<string> ParstText(string text) { const int MAX = 300; var reader = new StringReader(text); var tblist = new List<string>(); string line; var builder = new StringBuilder(); while ((line = reader.ReadLine()) != null) { //如果总长度不超过MAX,则加入 if (line.Length + builder.Length < MAX) { builder.AppendLine(line); } else { //先加入 tblist.Add(builder.ToString().Trim()); builder = new StringBuilder(); //单行长度小于MAX,则Append if (line.Length < MAX) { builder.AppendLine(line); } //单行长度大于MAX,则 else { int times = line.Length / MAX; for (int j = 0; j < times; j++) { tblist.Add(line.Substring(j * MAX, MAX).Trim()); } builder.AppendLine(line.Substring(times * MAX)); } } } if (builder.Length > 0) tblist.Add(builder.ToString().Trim()); return tblist; }