9

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

有关我的目标的视觉线索,请参阅这篇关于 Firefox 中的功能的文章。

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

4

2 回答 2

15

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

步骤是:

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

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

  • 将 TextSelection 与 AdditionalRanges 组合在一起的“AllRanges”属性
  • 可绑定的“文本”属性
  • 可绑定的“SelectedText”属性

这些实施起来都很简单。

最后注意事项:

  • 更新 AdditionalRanges 或计算 AllRanges 时,如果 TextSelection 与现有 AdditionalRange 重叠,则将其替换为组合范围,否则将 TextSelection 添加到列表中。
  • 您可以添加一个TextChanged处理程序以了解何时更新“文本”属性,并添加一个 PropertyChangedCallback 以了解何时更新 FlowDocument
于 2010-05-17T23:32:02.690 回答
2

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

干杯,亚历克斯

于 2010-05-17T13:50:34.650 回答