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

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

如果默认情况下没有办法完成此操作,则我想知道WPF中是否实现了任何第三方控件。

最佳答案

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

这些步骤是:

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

  • 在实现中,为了方便起见,我还建议您实现一些其他属性:
  • 一个“AllRanges”属性,将TextSelection与AdditionalRanges结合在一起
  • 可绑定(bind)的“文本”属性
  • 可绑定(bind)的“SelectedText”属性

  • 这些都是非常琐碎的实现。

    最后说明:
  • 在更新AdditionalRanges或计算AllRanges时,如果TextSelection与现有的AdditionalRange重叠,则将其替换为组合范围,否则将TextSelection添加到列表中。
  • 您可以添加TextChanged处理程序以了解何时更新“文本”属性,并添加PropertyChangedCallback以了解何时更新FlowDocument
  • 10-05 21:07
    查看更多