2010-05-13 127 views
9

是否可以在WPF文本框中选择多个文本部分?例如,对于包含字符串THIS IS A TEST一个文本框,我希望能够以突出THIS,然后按住Ctrl键并突出TEST没有取消选择THIS如何在WPF文本框中选择多个文本片段?

有关是我的目标在视觉线索,请参阅this文章了解Firefox的功能。

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

回答

13

WPF的TextBox和RichTextBox的类不直接支持多项选择,但与WPF的大部分地区这是非常容易定制其现有的RichTextBox来获得这种能力。

的步骤是:

  • 从RichTextBox的
  • 创建类导出添加ObservableCollection<TextRange>类型的“AdditionalRanges”属性,该属性将包含除了当前TextSelection所有选定范围
  • 覆盖OnPreviewMouseLeftButtonDown:如果Ctrl键按下时,将当前TextSelection合并到您的“AdditionalRanges”属性中并清除选择,否则清除“AdditionalRanges”。
  • 在构造函数中,添加一个CollectionChanged处理程序使用TextRange.ApplyPropertyValue()使集合中添加的范围内出现加亮后并去除范围通常出现“AdditionalRanges”。

在您的实现我还建议你实现为了方便多了一些属性:

  • 的“AllRanges”属性,它结合了AdditionalRanges的TextSelection
  • 可绑定的“Te​​xt”属性
  • 一个可绑定的“SelectedText”属性

这些都是相当微不足道的实现。

最后说明:

  • 当更新AdditionalRanges或计算AllRanges,如果TextSelection重叠的现有AdditionalRange,具有组合的范围更换否则TextSelection添加到列表中。
  • 您可以添加TextChanged处理器知道什么时候更新了“文本”属性,以及PropertyChangedCallback知道什么时候更新的FlowDocument
2

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

干杯,亚历克斯