Wpf某个文本的Richtextbox位置

本文关键字:Richtextbox 位置 文本 Wpf | 更新日期: 2023-09-27 18:27:58

我正在编写一个带有标记的滚动条(如Visual Studio),我希望在为richtextbox查找(Ctrl+F)时能够放置标记。我的用户控件是一个带有contentPresenter的滚动查看器,然后在我的窗口中,我将内容放入contentPresenter中。

现在,我可以用这个代码找到我想要的所有模式。但现在,我想在我的滚动条上添加一个标记。

我的标记算法是基于我想要标记的元素的位置。所以我想从richtextbox的顶部或他的父母那里得到这个位置(在我的情况下,这是一个contentPresnter)。

一开始,我很难得到字符串的行,但我做不到,因为它是一个richtextbox,一行的字体大小可以是48,下一行可以是12。

解决方案

我最终想到了一个关于Furkle的想法。我使用RichTextBox.CaretPosition.GetCharacterRect(…)来获取Rect的Y和Height属性。

Wpf某个文本的Richtextbox位置

我认为有两种基本方法可以做到这一点:

  1. 创建一个扩展RichTextBox功能的自定义控件。这里有关于在MSDN上扩展WPF控件的文档:http://msdn.microsoft.com/en-us/library/cc295235.aspx

  2. 使用第二个单独的控件,大约是滚动条的宽度和整个RichTextBox的高度。为该控件提供一个透明的背景,并将其放置在比RichTextBox更高的z顺序中,您就可以在RichTextBox上方绘制。在我的想象中,这与您在#1中扩展RichTextBox的方式基本相同。不过,请记住两件事——你必须确保矩形和它们所在的控件不是HitTestVisible,否则你将无法使用滚动条。

也有可能这是一个我完全不知道的内置函数,但我以前从未遇到过。

为了获得像素位置,可以使用CaretPosition.GetCharacterRect()函数:https://social.msdn.microsoft.com/Forums/vstudio/en-US/af780cd9-a4d5-4ab0-850d-c1e98a0d0046/how-to-get-x-y-corordicates-of-caret-in-richtextbox-when-caret-is-at-the-end-of-the-wrapped-line?forum=wpf.在RichTextBox中查找匹配的短语时,您可以将插入符号设置在该位置,保存您找到的所有位置并存储这些位置,以便以后在绘制矩形时使用。