首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态HyperLinks RichTextbox

动态HyperLinks RichTextbox
EN

Stack Overflow用户
提问于 2016-01-15 18:41:41
回答 1查看 945关注 0票数 0

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

在RichTextBox中导航并用HyperLinks替换urls似乎不是一项小壮举。有人有一个相对简单的解决方案吗?

在我的web客户机中,它是一个简单的一行

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-15 19:55:28

如果要在WPF中执行相当于value.replace(/(http:\/\/[^\s]+)/gi, '<a href="$1" target="_blank">$1</a>')的操作,请执行以下操作:

代码语言:javascript
复制
<RichTextBox x:Name="MyRichTextBox" IsDocumentEnabled="True" IsReadOnly="True" />

转换字符串的代码如下:

代码语言:javascript
复制
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的只读使用(如注释中的问题所示)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34817673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档