如何在 WPF 文本框中选择多个文本段?

Posted

技术标签:

【中文标题】如何在 WPF 文本框中选择多个文本段?【英文标题】:How can I select multiple text segments in a WPF textbox? 【发布时间】:2011-02-18 22:58:44 【问题描述】:

是否可以在 WPF 文本框中选择多个文本部分?例如,对于包含字符串THIS IS A TEST 的文本框,我希望能够突出显示THIS,然后按住Ctrl 并突出显示TEST,而不取消选择THIS

有关我的目标的直观线索,请参阅this 关于 Firefox 中的功能的文章。

如果默认情况下没有办法做到这一点,我想知道是否有任何第三方控件在 WPF 中实现。

【问题讨论】:

【参考方案1】:

WPF 的 TextBox 和 RichTextBox 类不直接支持多选,但与 WPF 的大多数部分一样,自定义现有的 RichTextBox 来获得这种能力非常容易。

步骤如下:

创建一个派生自 RichTextBox 的类 添加ObservableCollection<TextRange> 类型的“AdditionalRanges”属性,它将包含除当前 TextSelection 之外的所有选定范围 覆盖OnPreviewMouseLeftButtonDown:如果按下 Ctrl,则将当前 TextSelection 合并到“AdditionalRanges”属性中并清除“Selection”,否则清除“AdditionalRanges”。 在构造函数中,将CollectionChanged 处理程序添加到“AdditionalRanges”,该处理程序使用TextRange.ApplyPropertyValue() 使集合中添加的范围显示为突出显示,而删除的范围正常显示。

在您的实现中,为了方便,我还建议您实现更多属性:

结合了 TextSelection 和 AdditionalRanges 的“AllRanges”属性 可绑定的“文本”属性 可绑定的“SelectedText”属性

这些实现起来都很简单。

最后的笔记:

更新 AdditionalRanges 或计算 AllRanges 时,如果 TextSelection 与现有 AdditionalRange 重叠,则将其替换为组合范围,否则将 TextSelection 添加到列表中。 您可以添加一个TextChanged 处理程序以了解何时更新“Text”属性,并添加一个 PropertyChangedCallback 以了解何时更新 FlowDocument

【讨论】:

【参考方案2】:

不幸的是,标准的 WPF 文本框不支持这种行为。 因此,我认为获得该功能的唯一方法是实现您自己的文本框控件(可能基于标准文本框 ControlTemplate)。

干杯,亚历克斯

【讨论】:

以上是关于如何在 WPF 文本框中选择多个文本段?的主要内容,如果未能解决你的问题,请参考以下文章

文本框中的 WPF 命令参数

如何在 WPF 文本框中仅接受整数 [重复]

winform文本框超出

动态地,在运行时,如何在 WPF 中更改文本框中某些单词的颜色?

在 wpf 文本框中开始一个新行

wpf 焦点定位到 文本框开头? 2:如何按Tab,让焦点不进入第3个文本框,意思是在前两个文本框中切换