自定义文本框控件:带省略号的TextBoxWithEllipsis

在开发WPF应用程序时,经常会遇到需要处理文本显示空间不足的情况。为了解决这个问题,创建了一个名为TextBoxWithEllipsis的自定义文本框控件,它能够在文本超出可视区域时自动显示省略号。此外,该控件还允许用户自定义省略号的位置,包括左对齐、居中对齐或右对齐。

TextBoxWithEllipsis 属性

TextBoxWithEllipsis控件除了继承自TextBox的属性外,还增加了一些新的属性。以下是这些新增属性的详细描述:

  • LongText: 表示未截断的原始文本。当这个文本不适合在可视区域内显示时,Text属性会自动设置为这个文本的截断版本,但会加上省略号。可以交替设置Text或LongText属性。但是,当获取Text属性时,将得到(可能)被截断的版本。获取LongText属性总是得到未截断的版本。
  • IsEllipsisEnabled: 一个布尔值,用于启用或禁用省略号。当启用时,如果LongText被截断以适应可视区域,将显示省略号(Unicode字符0x2026)。否则,控件的行为就像一个常规的TextBox。
  • UseLongTextForToolTip: 当设置为true时,这个布尔值会导致ToolTip属性在LongText不适合时自动切换为LongText(当它不适合时)和null(当它适合时)。这与IsEllipsisEnabled属性独立。当设置为false时,ToolTip属性保持不变。
  • EllipsisPlacement: 一个枚举,指定省略号应该出现的位置(左对齐、居中对齐或右对齐)。
  • FudgePix: 表示在确定LongText的哪个子字符串适合时需要“调整”的像素数。添加了这个属性,因为注意到在应用省略号之前,控件并没有完全使用所有可用的空间来显示文本。默认值是3,这在计算机/显示器/显卡上似乎使用了每一个可用的像素。使其可调,以防在其他地方情况不同。

演示应用程序

下载中包含的演示应用程序是一个Visual Studio 2010 C# WPF项目,包含两个相关文件:

  • TextBoxWithEllipsis.cs - TextBoxWithEllipsis类的实现。可以简单地将这个文件复制到自己的项目中,尽管可能需要更改命名空间。
  • MainWindow.xaml - 可调整大小的WPF窗口,如上所示,用于测试和演示TextBoxWithEllipsis控件。

可以直接在“带省略号的文本框”控件中输入,或者在“源文本”字段中输入内容并点击按钮,以程序方式设置TextBoxWithEllipsis的Text属性。复选框和单选按钮连接到TextBoxWithEllipsis控件的相应属性。

当控件调整大小时,它会自动调整它显示的文本。如果控件足够长以容纳所有文本(在演示应用程序中,控件随窗口调整大小),省略号会消失。

每当TextBoxWithEllipsis获得焦点时,省略号会暂时禁用,以便用户可以编辑、选择或滚动完整文本。这种行为内置于控件中。

实现

代码假设如果TextBox.ViewportWidth + FudgePix < TextBox.ExtentWidth,文本不适合并且需要省略号。测试是在LayoutUpdated事件处理程序中进行的。如果文本不适合,将执行二分(或折半)搜索,通过将Text属性的长度设置为上一次已知适合的长度和上一次已知太长的长度之间的一半。更改Text属性会再次引发LayoutUpdated事件,导致逻辑迭代,直到找到适合的LongText的最大长度子字符串。

OnTextChanged()方法被重写,以防止在Text属性内部更改时(例如,在LayoutUpdated处理程序中)引发TextChanged事件。外部设置Text和在控件中键入/粘贴会如预期引发事件。

代码示例

以下是TextBoxWithEllipsis控件的简化代码示例:

public class TextBoxWithEllipsis : TextBox { public static readonly DependencyProperty LongTextProperty = DependencyProperty.Register( "LongText", typeof(string), typeof(TextBoxWithEllipsis), new PropertyMetadata(string.Empty)); public string LongText { get { return (string)GetValue(LongTextProperty); } set { SetValue(LongTextProperty, value); } } public bool IsEllipsisEnabled { get; set; } public bool UseLongTextForToolTip { get; set; } public EllipsisPlacement EllipsisPlacement { get; set; } public int FudgePix { get; set; } public TextBoxWithEllipsis() { this.IsEllipsisEnabled = true; this.UseLongTextForToolTip = true; this.EllipsisPlacement = EllipsisPlacement.Right; this.FudgePix = 3; this.LayoutUpdated += new EventHandler(TextBoxWithEllipsis_LayoutUpdated); } void TextBoxWithEllipsis_LayoutUpdated(object sender, EventArgs e) { // Implementation of the ellipsis logic } protected override void OnTextChanged(TextChangedEventArgs e) { base.OnTextChanged(e); // Prevent the TextChanged event from being raised when the Text property is changed internally } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485