带省略号的 WPF TextBox
WPF TextBox 控件的一个子类,当文本不适合显示时显示省略号。
引言
WPF TextBox
类没有内置选项来自动显示省略号,以表示文本被截断以适应可见区域。 由于我希望在我的一个项目中使用此功能,因此我创建了自己的 TextBox
子类,名为 TextBoxWithEllipsis
,它会在适当的时候显示省略号。 我还包括了将省略号放置在可见文本的左侧、右侧或中心的功能。
TextBoxWithEllipsis 属性
除了从 TextBox
继承的属性外,TextBoxWithEllipsis
还具有以下属性。 我没有费心将它们中的任何一个都设为依赖属性,因为我的目的不需要。
属性 | 描述 |
LongText |
底层,未截断的文本。 当它不适合在可见区域中时,Text 属性会自动设置为它的截断版本,但带有省略号。 您可以互换设置 Text 或 LongText 。 但是,当获取 Text 时,您将获得(可能)截断的版本。 获取 LongText 始终获取未截断的版本。 |
IsEllipsisEnabled |
一个 bool 值,用于启用和禁用省略号。 启用后,当 LongText 被截断以适合可见区域时,会显示省略号(Unicode 字符 0x2026)。 否则,该控件的行为类似于常规 TextBox 。 |
UseLongTextForToolTip |
当 true 时,此 bool 会导致 ToolTip 属性自动在 LongText (当它不适合时)和 null (当它适合时)之间切换。 这独立于 IsEllipsisEnabled 发生。 当为 false 时,ToolTip 保持不变。 |
EllipsisPlacement |
一个枚举,用于指定省略号应该出现的位置( 、Center 或 Right )。 |
FudgePix |
在确定 LongText 的哪个子字符串适合时要“微调”的像素数。 我添加这个是因为我注意到该控件在应用省略号之前并没有完全使用所有可用空间来显示文本。 默认值为 3,它似乎在我的计算机/显示器/显卡上使用了每个可用的像素。 我使其可调整,以防它在每个地方都不相同。 |
演示应用
下载中包含的演示应用程序是一个 Visual Studio 2010 C# WPF 项目,包含两个相关文件
- TextBoxWithEllipsis.cs -
TextBoxWithEllipsis
类的实现。 您可以简单地将此文件复制到您自己的项目中,但您可能想要更改命名空间。 - MainWindow.xaml - 可调整大小的 WPF 窗口,如上图所示,用于测试和演示
TextBoxWithEllipsis
控件。
您可以直接在“带有省略号的 TextBox”控件中键入,或者在“源文本”字段中输入一些内容并单击按钮来测试以编程方式设置 TextBoxWithEllipsis
的 Text
属性。 复选框和单选按钮已连接到 TextBoxWithEllipsis
控件的相应属性。
该控件会在调整大小时自动调整其显示的文本。 如果控件变得足够长以容纳所有文本,则省略号会消失(在演示应用程序中,控件会随窗口一起调整大小)。
每当 TextBoxWithEllipsis
获得焦点时,省略号会被暂时禁用,以便用户可以编辑、选择或滚动完整文本。 此行为已内置到控件中。
实现
代码假定如果 TextBox.ViewportWidth + FudgePix
< TextBox.ExtentWidth
,则文本不适合并且需要省略号。 该测试在 LayoutUpdated
事件处理程序中进行。 如果文本不适合,则通过将 Text
属性的长度设置为已知适合的最后一个长度和已知过长的最后一个长度之间的一半来执行二分(或二分)搜索。 更改 Text
属性会再次引发 LayoutUpdated
事件,从而导致逻辑迭代,直到找到适合的最大长度的 LongText
子字符串。
OnTextChanged()
方法被覆盖以防止在 Text
属性在内部更改时(例如,在 LayoutUpdated
处理程序中)引发 TextChanged
事件。 在外部设置 Text
并键入/粘贴到控件中会按预期引发该事件。