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

发布于 2024-09-02 02:07:23 字数 376 浏览 7 评论 0原文

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

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

如果默认情况下无法实现此目的,我想知道 WPF 中是否有任何第三方控件可以实现此目的。

Is it possible to select multiple parts of text within a WPF textbox? For instance, for a textbox that contains the string THIS IS A TEST, I want to be able to highlight THIS, then hold Ctrl and highlight TEST without unselecting THIS.

For a visual clue about what I'm aiming at, see this article about the feature in Firefox.

If by default there is no way to accomplish this, I would like to know if there is any third-party control implemented in WPF that does.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

二货你真萌 2024-09-09 02:07:23

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

步骤如下:

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

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

  • TextSelection 与 ExtraRanges 组合在一起的“AllRanges”属性
  • 可绑定的“Te​​xt”属性
  • 可绑定的“SelectedText”属性

这些实现起来都很简单。

最后注意事项:

  • 更新AdditionalRanges 或计算AllRanges 时,如果TextSelection 与现有AdditionalRange 重叠,请将其替换为组合范围,否则将TextSelection 添加到列表中。
  • 您可以添加一个 TextChanged 处理程序来了解何时更新“Text”属性,并添加一个 PropertyChangedCallback 来了解何时更新 FlowDocument

WPF's TextBox and RichTextBox classes do not directly support multiselection, but as with most parts of WPF it's extremely easy to customize its existing RichTextBox to get this ability.

The steps are:

  • Create a class deriving from RichTextBox
  • Add an "AdditionalRanges" property of type ObservableCollection<TextRange> which will contain all selected ranges except the current TextSelection
  • Override OnPreviewMouseLeftButtonDown: If Ctrl is pressed, combine the current TextSelection into your "AdditionalRanges" property and clear Selection, otherwise clear "AdditionalRanges".
  • In the constructor, add a CollectionChanged handler to "AdditionalRanges" that uses TextRange.ApplyPropertyValue() to make added ranges in the collection appear hilighted and removed ranges appear normally.

In your implementation I also recommend you implement a few more properties for convenience:

  • An "AllRanges" property that combines the TextSelection with AdditionalRanges
  • A bindable "Text" property
  • A bindable "SelectedText" property

These are all quite trivial to implement.

Final notes:

  • When updating AdditionalRanges or computing AllRanges, if the TextSelection overlaps an existing AdditionalRange, replace it with a combined range otherwise add the TextSelection to the list.
  • You can add a TextChanged handler to know when to update the "Text" property, and a PropertyChangedCallback to know when to update the FlowDocument
羁拥 2024-09-09 02:07:23

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

干杯,亚历克斯

the standard WPF TextBox does not support such behaviour, unfortunately.
So the only way I see to get that functionality would be implementing your own text box control (maybe based on the standard text box ControlTemplate).

Cheers, Alex

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文