【问题标题】:WPF Dynamic HyperLinks RichTextboxWPF 动态超链接 RichTextbox
【发布时间】:2016-01-16 04:01:45
【问题描述】:

从 2006 年到现在,我已经看到了几篇关于如何向 RichTextBox 添加超链接的各种形式的帖子,但对于我想要的来说,它们似乎都过于复杂。我正在创建一个桌面聊天客户端,我接收作为字符串的输入,现在这些字符串中可能有一些 url,我需要这些 url 是可点击的。从我收集的信息来看,这意味着它们需要是 HyperLink 对象。

在 RichTextBox 中导航并用超链接替换 ​​url 似乎是一项不小的壮举。有没有人对此有一个相对简单的解决方案?

在我的网络客户端中,它是一个简单的单线

value = value.replace(/(http:\/\/[^\s]+)/gi, '<a href="$1" target="_blank">$1</a>');

从没想过我会看到 C# 真正让事情变得更难的那一天。

【问题讨论】:

  • 为了清楚起见,你关心的RichTextBox是用户输入的来源吗?或者您是否担心 RichTextBox 将成为显示完整对话的部分?还是两者兼而有之?
  • @Rowbear 我最关心的是显示带有超链接的对话,让它们在输入富文本框中可点击将是一个额外的好处,但必然是一个要求。

标签: wpf dynamic hyperlink richtextbox


【解决方案1】:

如果你想在 WPF 中做相当于 value.replace(/(http:\/\/[^\s]+)/gi, '&lt;a href="$1" target="_blank"&gt;$1&lt;/a&gt;') 的操作:

<RichTextBox x:Name="MyRichTextBox" IsDocumentEnabled="True" IsReadOnly="True" />

而转换字符串的代码如下:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var htmlText = "Google's website is http://www.google.com";
        MyRichTextBox.Document = ConvertToFlowDocument(htmlText);
    }

    private FlowDocument ConvertToFlowDocument(string text)
    {
        var flowDocument = new FlowDocument();

        var regex = new Regex(@"(http:\/\/[^\s]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
        var matches = regex.Matches(text).Cast<Match>().Select(m => m.Value).ToList();

        var paragraph = new Paragraph();
        flowDocument.Blocks.Add(paragraph);

        foreach (var segment in regex.Split(text))
        {
            if (matches.Contains(segment))
            {
                var hyperlink = new Hyperlink(new Run(segment))
                {
                    NavigateUri = new Uri(segment),
                };
                hyperlink.RequestNavigate += (sender, args) => Process.Start(segment);

                paragraph.Inlines.Add(hyperlink);
            }
            else
            {
                paragraph.Inlines.Add(new Run(segment));
            }
        }

        return flowDocument;
    }
}

它使用您提供的相同正则表达式,如果您想正确识别具有正则表达式的 URL,则缺少该正则表达式。这个不识别 https 的,下面句子中的最后一个点将是 URL 的一部分:"This is a URL: http://www.google.com/."

代码所做的是根据正则表达式拆分文本,对其进行迭代并将正确的元素添加到动态构建的FlowDocument

点击Hyperlink 应该会打开您的默认浏览器。

结果:

也就是说,这仅适用于RichTextBox 的只读用法(如评论中的问题所示)。

【讨论】:

  • 我的网络客户端有一个单独的正则表达式,它执行 https,基本上完全相同,但使用 https 而不是 http。是的,这将是一个只读上下文,因为我只需要它在收到后可点击,而不是发送。我会试一试,谢谢你的回复,我会让你知道它是怎么回事:)
  • 您的解决方案还不够完美!我添加了一个参数来接受流文档,以便可以附加到 RichTextBox 中的现有流文档。非常感谢,我是 WPF 新手,绝对没有对 FlowDocuments 做过任何事情。 PS。我加了一个s?到我的正则表达式,所以它会识别 https,如果有人在 url 的末尾留下一个点,那是他们的错
猜你喜欢
  • 2020-07-20
  • 2013-05-06
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2014-11-15
  • 1970-01-01
相关资源
最近更新 更多