Wpf 在不使用RichTextBox控件的情况下高亮显示文本框中的文本

Wpf 在不使用RichTextBox控件的情况下高亮显示文本框中的文本,wpf,textbox,richtextbox,highlighting,Wpf,Textbox,Richtextbox,Highlighting,我有一个WPF文本框(不是RichTextBox),在这个文本框中,我想突出显示搜索结果(就像在web浏览器中) 例如,如果我搜索“abc”,所有出现的“abc”都应该突出显示(例如,带有一些红色背景或字体) 我想知道这在不使用RichTextBox控件的情况下是否可行,或者是否真的可行?此功能没有内置功能。此外,文本框仅支持整个文本的单一字体样式 如果文本应该是只读的,您可以使用流或固定文档并在运行元素中格式化文本。这是可能的,但是使用 RigTrimeBox < /C>更容易。因此,您可以考

我有一个WPF文本框(不是RichTextBox),在这个文本框中,我想突出显示搜索结果(就像在web浏览器中)

例如,如果我搜索“abc”,所有出现的“abc”都应该突出显示(例如,带有一些红色背景或字体)


我想知道这在不使用RichTextBox控件的情况下是否可行,或者是否真的可行?

此功能没有内置功能。此外,文本框仅支持整个文本的单一字体样式


如果文本应该是只读的,您可以使用流或固定文档并在运行元素中格式化文本。

这是可能的,但是使用<代码> RigTrimeBox < /C>更容易。因此,您可以考虑使用它,此外,您不能更改字体大小,只能更改颜色(背景和/或前景)和效果。

首先,您必须从
TextBox
派生自己的类,因为您将重写它的render方法。现在重写
OnRender()
方法,这里您将使用
DrawingContext.DrawText()
方法来绘制文本(将所有内容放置在
FormattedText
对象中,您必须调整其属性,使其与标准
TextBox
类似)

现在您拥有的是一个普通的
文本框
,其中除此之外还可以绘制文本。从这个出发点,您可以选择:

  • 完全覆盖
    TextBox
    文本绘图:将
    TextBox.Foreground
    属性设置为
    brushs.Transparent
    。用户将与“真实”文本交互,但他将看到您绘制的文本。请注意,要做到这一点,您必须准确模拟原始
    文本框中文本的绘制方式(例如,如果更改字体大小,则它们将不对齐)

  • 添加所需的突出显示功能,保持基本
    文本框
    文本绘制:计算要突出显示的文本的位置,然后绘制适当的背景

参考资料

这个(简化的!)算法源于,它最初设计用于扩展一个
文本框
,具有一些简单的编辑器功能。

谢谢你的回答!我尝试了第一种方法(完全覆盖文本绘图)-在TextWrapping发挥作用之前,它可以正常工作。。。我不知道如何计算突出显示的文本位置(另一种方法)。@Zsolt是的,这可能有点棘手,但您可以使用格式化文本(同样必须完全匹配文本框设置),其中要突出显示的文本的颜色/背景正确,其他所有内容都是透明的。