代码之家  ›  专栏  ›  技术社区  ›  luvieere

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

  •  9
  • luvieere  · 技术社区  · 15 年前

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

    关于我的目标的视觉线索,见 this 关于火狐功能的文章。

    如果在默认情况下无法实现这一点,我想知道在WPF中是否有实现这一点的第三方控制。

    2 回复  |  直到 15 年前
        1
  •  14
  •   Ray Burns    15 年前

    wpf的textbox和richtextbox类不直接支持多重选择,但是和wpf的大多数部分一样,定制现有的richtextbox来获得这种能力非常容易。

    步骤如下:

    • 创建从richtextbox派生的类
    • 添加类型为的“AdditionalRanges”属性 ObservableCollection<TextRange> 它将包含除当前文本选择之外的所有选定范围
    • 重写 OnPreviewMouseLeftButtonDown :如果按下ctrl,则将当前文本选择合并到“AdditionalRanges”属性中并清除选择,否则清除“AdditionalRanges”。
    • 在构造函数中,添加 CollectionChanged 处理程序到使用 TextRange.ApplyPropertyValue() 要使集合中添加的范围显示为隐藏,删除的范围显示为正常。

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

    • “AllRanges”属性,它将文本选择与其他范围组合在一起。
    • 可绑定的“文本”属性
    • 可绑定的“selectedText”属性

    这些都是很容易实现的。

    最后注:

    • 更新AdditionalRanges或计算AllRanges时,如果文本选择与现有的AdditionalRange重叠,请将其替换为组合范围,否则将文本选择添加到列表中。
    • 您可以添加 TextChanged 处理程序知道何时更新“文本”属性,以及属性changedcallback知道何时更新流程文档
        2
  •  2
  •   alexander.biskop    15 年前

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

    干杯,亚历克斯

    推荐文章