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

时间:2010-05-13 05:35:47

标签: c# wpf textbox textselection

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

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

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

2 个答案:

答案 0 :(得分:14)

WPF的TextBox和RichTextBox类不直接支持多选,但与WPF的大多数部分一样,定制现有的RichTextBox以获得此功能非常容易。

步骤如下:

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

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

  • 将TextSelection与AdditionalRanges结合起来的“AllRanges”属性
  • 可绑定的“文字”属性
  • 可绑定的“SelectedText”属性

这些都非常容易实现。

最后的说明:

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

答案 1 :(得分:2)

遗憾的是,标准WPF TextBox不支持此类行为。 所以我看到获得该功能的唯一方法是实现自己的文本框控件(可能基于标准文本框ControlTemplate)。

干杯,亚历克斯