如何在WPF文本框中选择多个文本片段?
问题描述:
是否可以在WPF文本框中选择多个文本部分?例如,对于包含字符串THIS IS A TEST
一个文本框,我希望能够以突出THIS
,然后按住Ctrl键并突出TEST
没有取消选择THIS
。如何在WPF文本框中选择多个文本片段?
有关是我的目标在视觉线索,请参阅this文章了解Firefox的功能。
如果在默认情况下是没有办法做到这一点,我想知道是否有任何WPF,做实施的第三方控制。
答
WPF的TextBox和RichTextBox的类不直接支持多项选择,但与WPF的大部分地区这是非常容易定制其现有的RichTextBox来获得这种能力。
的步骤是:
- 从RichTextBox的
- 创建类导出添加
ObservableCollection<TextRange>
类型的“AdditionalRanges”属性,该属性将包含除了当前TextSelection所有选定范围 - 覆盖
OnPreviewMouseLeftButtonDown
:如果Ctrl键按下时,将当前TextSelection合并到您的“AdditionalRanges”属性中并清除选择,否则清除“AdditionalRanges”。 - 在构造函数中,添加一个
CollectionChanged
处理程序使用TextRange.ApplyPropertyValue()
使集合中添加的范围内出现加亮后并去除范围通常出现“AdditionalRanges”。
在您的实现我还建议你实现为了方便多了一些属性:
- 的“AllRanges”属性,它结合了AdditionalRanges的TextSelection
- 可绑定的“Text”属性
- 一个可绑定的“SelectedText”属性
这些都是相当微不足道的实现。
最后说明:
- 当更新AdditionalRanges或计算AllRanges,如果TextSelection重叠的现有AdditionalRange,具有组合的范围更换否则TextSelection添加到列表中。
- 您可以添加
TextChanged
处理器知道什么时候更新了“文本”属性,以及PropertyChangedCallback知道什么时候更新的FlowDocument
答
不幸的是标准的WPF TextBox不支持这种行为。 所以我看到获得该功能的唯一方法是实现自己的文本框控件(可能基于标准文本框ControlTemplate)。
干杯,亚历克斯