【原译】自动省略功能的WPF文本框控件

免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!

原文链接地址:http://www.codeproject.com/KB/WPF/TextBoxWithEllipsis.aspx

介绍

WPF文本框控件类,不像TextBlock,他没有内置的选项,以便当文本内容超过可视区域的时候,显示省略号,我想让我正在做的一个项目能够拥有这个特性,可是,我在网上找不到一个比较简单的方法实现他,于是啊,我决定自己写个TextBox的继承类,必要的时候能够显示省略,我把这个类命名为TextBoxWithEllipsis.


TextBoxWithEllipsis属性列表

既然TextBoxWithEllipsis继承自TextBox,那么他就有了TextBox的所有属性,当然还得有一些其他的属性,我自己呢,只需要很简单的几个属性,所以就不多加其他的属性了。

LongText

保存原始的没有截短的文本,而Text属性则自动设置成他的截断版本,以省略号结尾,你也可以把这两个属性保存的内容互换,

随意。这里,当我读取Text属性的时候,我得到已经截短了的版本,而LongText则得到没有截断的版本。

IsEllipsisEnabled

 一个布尔值,使得省略这个功能启用或者关闭,当启用的时候,一个省略号(unicode编码是0x2026)将会显示在截断了

的LongText后面,其他的,和正常的TextBox控件无异。

UseLongTextForToolTip

这个bool属性为true的时候,当把鼠标放到截断了的文本框上面时,会通过tooltip的方式显示完整的文本内容。

示例程序

示例程序是一个vs2010 c# WPF工程,包含两个相关的类

TextBoxWithEllipsis.cs 这个实现了咱们这个类,你可以简单的把他拷贝到你自己的工程里,可能你得改改命名空间

MainWindow.xaml 自适应的WPF窗口,用来测试咱们这个控件

运行后,直接在“Source Text”文本框里输入文本,然后在下面设置一下选项,提示之类的。这个控件的位置大小会随着窗口的改变而改改变。并且,当你把焦点移动到我写的这个文本框的时候,省略功能会暂时取消,好让你编辑。

实现

代码假定TextBox.ViewportWidth <TextBox.ExtentWidth,文本放不下因此需要省略号,测试在LayoutUpdated事件句柄中进行,如果文本太长了,就进行二分搜索,设置Text属性的长度为上一次太短的和上一次太长的和的一半,Text属性的改变导致了LayoutUpdated的再一次调用,这样就一直重复知道找到了LongText合适的子串。

OnTextChanged()方法也被重载以防止当Text属性被内部改变(比如 LayoutUpdated方法)或从外部输入或者粘贴到这个控件的时候。TextChanged事件被触发,在重载的函数里,我们就把Text的值又赋值给LongText。然后就可以了

许可

此文章和包含的所有代码遵循MIT许可。

示例代码下载

著作权声明:本文由http://www.cnblogs.com/lazycoding翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

原文地址:https://www.cnblogs.com/lazycoding/p/2312366.html