wpf富文本框检测超链接

编程


大家好,我开始在 WPF richtextbox 上工作,它似乎没有像 windows richtextbox 中那样自动检测 url 等功能。 当我们将数据粘贴到 Richtextbox (wpf) 中时,我需要帮助来检测超链接。我已经找到了一些代码块,这些代码块可以很好地处理键入的单词,例如我键入 www.google.com 以及当我在“m”之后按空格或输入键时“www.google.com”它将回溯并检查之前的空格或输入并检测超链接并使其成为超链接。

我使用以下代码来处理

[^]

它在大多数情况下工作正常,但我的问题是它在遍历每个字符后转到链接,并且当我有大量数据时,这不是更好的解决方案。 它也不适用于多个段落。

我尝试了另一个选项直接跳转到链接词并检测它并使用以下函数使其成为超链接

这里的 match 是一个匹配集合,其中包含 url 的所有匹配
在这里我使用了以下正则表达式值
“(?<=\w{1})?(((ht|f)tp(s?))\://)?(www.[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|博物馆|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&amp;%\$#\=~_\-]+))*" GetPositionAtOffset(match.index, LogicalDirection.Forward) 明白重点
但我收到以下错误:

1)超链接不能存在于其他的边界中(可以在catch块中捕获,所以不是一个大问题)

当我们在其中粘贴文本时,任何人都可以帮助我检测网址吗?

2)错误代码0x80131623(可以在谷歌搜索时找到详细信息)对我来说真的很有挑战性。

(对于语法或英语错误我真的很抱歉)
谢谢

解决方案2

也许这里有一些帮助……

自动检测 RichTextBox 中的超链接 – 第一部分[^]
自动检测 RichTextBox 中的超链接 – 第二部分[^]

*编辑*或者也许不是…看起来您需要正则表达式帮助,而不是检测 URL 的方法…:)

解决方案1

我认为您只需要确保 richtextbox 的 detectorurl 属性设置为 true 即可。

看下面的链接

http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.detecturls.aspx[^]

希望这有帮助。


阿杰

解决方案3

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

Bing 提供了以下解决方案…

————————————————– —————————-

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

C#
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);
        }
    }
}

然后,您可以在 WPF 应用程序中的任何 RichTextBox 控件上使用此方法。 例如,如果您有一个名为 myRichTextBox 的 RichTextBox 控件,则可以像这样调用 MakeUrlsClickable 扩展方法:

C#
myRichTextBox.MakeUrlsClickable();

————————————————– —————————-

这个答案让我 80% 找到了解决方案。 除了该代码之外,您还必须在 XAML 代码中正确添加一个 setter,并在该 setter 后面添加一些代码。

所以,在摆弄了 Bing 的代码之后,这就是我最终实现的……

————————————————– —————————-

在 XAML 代码中:

XAML
<RichTextBox>
    <RichTextBox.Resources>
        <Style TargetType="Hyperlink">
            <Setter Property="Cursor" Value="Hand" />
            <EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" />
        </Style>
    </RichTextBox.Resources>
</RichTextBox>

后面的代码中:

C#
private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e)
        {
            var hyperlink = (Hyperlink)sender;
            Process.Start(new ProcessStartInfo(hyperlink.NavigateUri.ToString())
            {
                UseShellExecute = true,
            });
            e.Handled = true;
        }

RichTextBox 控件的扩展:

C#
namespace RichTextBoxExtensions
{
    public static class RichTextBoxExtensions
    {
        /// <summary>
        /// Scan the content of a RichTextBox control and make any https URLs
        /// clickable.  The initial version of this method was written by Bing Chat,
        /// and then tidied up by me and Intellicode.
        /// </summary>
        /// <param name="self"></param>
        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.Cast<Match>())
                    {
                        TextPointer start = pointer.GetPositionAtOffset(match.Index);
                        TextPointer end = start.GetPositionAtOffset(match.Length);
                        Hyperlink hyperlink = new(start, end)
                        {
                            NavigateUri = new Uri(match.Value)
                        };
                    }
                }
                pointer = pointer.GetNextContextPosition(LogicalDirection.Forward);
            }
        }
}

如果您有一个名为 myRichTextBox 的 RichTextBox 控件,则可以像这样调用 MakeUrlsClickable 扩展方法:

C#
myRichTextBox.MakeUrlsClickable();

コメント

タイトルとURLをコピーしました