在开发WPF应用程序时,经常会遇到需要处理文本显示空间不足的情况。为了解决这个问题,创建了一个名为TextBoxWithEllipsis的自定义文本框控件,它能够在文本超出可视区域时自动显示省略号。此外,该控件还允许用户自定义省略号的位置,包括左对齐、居中对齐或右对齐。
TextBoxWithEllipsis控件除了继承自TextBox的属性外,还增加了一些新的属性。以下是这些新增属性的详细描述:
下载中包含的演示应用程序是一个Visual Studio 2010 C# WPF项目,包含两个相关文件:
可以直接在“带省略号的文本框”控件中输入,或者在“源文本”字段中输入内容并点击按钮,以程序方式设置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
}
}