好的那么今天的主题就是 LinkLabel 例如说微博等程序中把文本自动替换为 Hyperlink 的一个 Text 显示器。
前些天看到的一个Silverlight的控件是基于SL2 的但是稍作改动就可以移植到Wp 叫做LinkLabel,现在的版本号是1.1
那么他的原理就是:
1:读取Text属性为string,通过正则表达式适配其中的链接项目。
2:把读取链接在字符串中的 Index,将链接之前的文字添加为TextBlock 放入WrapPanel,那么这里有个大问题待会会提到。
3:生成链接并扔到 WrapPanel 里面。继续处理后面的文字。
问题描述:
但是这个LinkLabel及其不适合中国人使用。因为他是针对英文单词适配的。将每个单词读取为一个 Word 添加到 WrapPanel,实现自动换行的概念。而 Hyperlink 更加是很难实现完美的自动换行,这就出现如果用汉字会无法换行,因为没有空格可以识别,也就是所有汉字都是一个单词,被当做单独的 Word 添加到 WrapPanel,即使加上 TextWrap 属性仍然会因为无法估计最好一行剩余空间,导致格式很凌乱。产生及其混乱的 UI。
解决方案设想:
我做了一个临时的不完美解决方案,稍作改动,将每个汉字生产了一个 TextBlock 添加到 WrapPanel 实现自动换行,但是仍然没有解决的 Hyperlink 的换行问题,而且这样不停的添加子 Template 可能对性能也会有很大的影响。前些天一直在研究性能问题,尚未作出有效的更改,先从解决这个遗留问题开始吧。当然发此文是我尚在寻求解决方案中,今天看 WP7Contib 项目 发现了很多有趣的项目。那么我有个想法就是做一个新的 AutoCutPanel,把添加进来后的子控件长度超过 Panel 的 LineBreakWidth属性的断产生n个(取决于它的长度是否大于 LineBreakWitdth)。
我不太爱画图,大概意思就是,例如这一行总共有12个字符空间,现在第一行只剩下3个字符的空间,那么我添加一个TextBlock,有18个字符,就把前3个截断,放入上一行,而接下来12个放入下一行,再接下来3个放入第三行。这样至少比每个字添加为控件节约空间。
Note:这个方案还有个问题,就是那么我做 Hyperlink 截断的时候,这些控件的 State 需要关联起来,这个具体实现我还没太明白,需要深入研究下。
DynamicTextBlock:
好那么就可以进入正题,这个遗留问题遗留了很久,知道我看到了这个 Dynamic TextBlock,那么事实上他就是给 TextBlock 加入了一个 Trimming 属性,就是我要的那部分。正好可以用在 WP 的silverlight 开发上,在我们真正实现 Silverlight 4之前,这种解决方案还是比较可取的。接下来我就要去阅读他的源代码了,晚上再来更新。
好的,那么阅读完毕它的代码之后,发现就跟我事先想过的一样,用一个循环控制,然后每次都用 Reduce 字符串里面的一个字符,再 MesureSize 然后再循环。当初我就为了寻求更优的解决方案,可是看来只有这个方式了,或许也还是有没有想到的地方,当然每次减少一个字符这里可能可以优化,但是这些小细节上的算法就还是算了吧,嘿嘿。
好的,那么下面开始根据 Toolkit 里面的 WrapPanel 修改源代码实现我自己的 AutoCutPanel 吧。