检测 WPF RichTextBox 中的超链接

问题描述 投票:0回答:2

大家好,我想编写一些基本的支持来检测 WPF RichTextBox 控件中的超链接。我的计划是使用正则表达式来识别任何链接,然后手动将它们替换为真正的超链接对象。

但是,我遇到问题的部分是,一旦找到链接,就无法获取正确的文本指针等。例如,我可以将整个文档扁平化为文本字符串并查找链接,但是一旦我这样做了,如何才能获得指向需要 url 化的块的正确指针?

也许更好的方法是迭代文档中的块,假设 url 不会跨越多个块,但即便如此,我也没有使用 RichTextBox/FlowDocument 对象模型的经验,因此任何指针(双关语)都会有所帮助。谢谢!

c# wpf richtextbox
2个回答

0
投票

我已经断断续续地为这个问题苦苦挣扎了几个月。今天,我决定向 Bing Chat 询问如何做到这一点。我给 Bing 提供了以下指示:编写 C# 代码来扩展 WPF 应用程序中的 .net RichTextBox 控件,以便可以单击 URL。

Bing 提供了以下解决方案...


要使用 C# 扩展 WPF 应用程序中的 .NET RichTextBox 控件以使 URL 可单击,您可以使用 TextPointer 类来查找文本中 URL 的开始和结束位置。以下是如何为 RichTextBox 控件创建扩展方法的示例:

public static class RichTextBoxExtensions
{
    public static void MakeUrlsClickable(this RichTextBox self)
    {
        TextPointer pointer = self.Document.ContentStart;
        while (pointer != null)
        {
            if (pointer.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
            {
                string textRun = pointer.GetTextInRun(LogicalDirection.Forward);
                MatchCollection matches = Regex.Matches(textRun, @"(https?://[^\s]+)");
                foreach (Match match in matches)
                {
                    TextPointer start = pointer.GetPositionAtOffset(match.Index);
                    TextPointer end = start.GetPositionAtOffset(match.Length);
                    Hyperlink hyperlink = new Hyperlink(start, end);
                    hyperlink.NavigateUri = new Uri(match.Value);
                }
            }
            pointer = pointer.GetNextContextPosition(LogicalDirection.Forward);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.