将超链接添加到文本块 WPF

新手上路,请多包涵

我在数据库中有一些文本,如下所示:

Lorem ipsum dolor sit amet, consectetur adipiscing elit。 Duis tellus nisl, venenatis et pharetra ac, tempor sed sapien。 Integer pellentesque blandit velit, in tempus urna semper sit amet. Duis mollis, libero ut consectetur interdum, massa tellus posuere nisi, eu aliquet elit lacus ne erat. Praesent commodo quam。 [a href='http://somesite.example]some site[/a] Suspendisse at nisi sit amet massa molestie gravida feugiat ac sem。 Phasellus ac mauris ipsum,vel auctor odio

我的问题是:如何在 Hyperlink 中显示 TextBlock ?我不想为此目的使用 webBrowser 控件。我也不想使用此控件: https ://www.codeproject.com/Articles/33196/WPF-Html-supported-TextBlock

原文由 niao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 316
2 个回答

在这种情况下,您可以将 Regex 与值转换器一起使用。

根据您的要求使用它(来自 此处 的原始想法):

     private Regex regex =
        new Regex(@"\[a\s+href='(?<link>[^']+)'\](?<text>.*?)\[/a\]",
        RegexOptions.Compiled);

这将匹配包含链接的字符串中的所有链接,并为每个匹配创建 2 个命名组: linktext

现在您可以遍历所有匹配项。每场比赛都会给你一个

    foreach (Match match in regex.Matches(stringContainingLinks))
    {
        string link    = match.Groups["link"].Value;
        int link_start = match.Groups["link"].Index;
        int link_end   = match.Groups["link"].Index + link.Length;

        string text    = match.Groups["text"].Value;
        int text_start = match.Groups["text"].Index;
        int text_end   = match.Groups["text"].Index + text.Length;

        // do whatever you want with stringContainingLinks.
        // In particular, remove whole `match` ie [a href='...']...[/a]
        // and instead put HyperLink with `NavigateUri = link` and
        // `Inlines.Add(text)`
        // See the answer by Stanislav Kniazev for how to do this
    }

注意: 在您的自定义 ConvertToHyperlinkedText 值转换器中使用此逻辑。

原文由 mg007 发布,翻译遵循 CC BY-SA 3.0 许可协议

显示比较简单,导航是另一个问题。 XAML 是这样的:

 <TextBlock Name="TextBlockWithHyperlink">
    Some text
    <Hyperlink
        NavigateUri="http://somesite.example"
        RequestNavigate="Hyperlink_RequestNavigate">
        some site
    </Hyperlink>
    some more text
</TextBlock>

启动默认浏览器以导航到您的超链接的事件处理程序将是:

 private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) {
    System.Diagnostics.Process.Start(e.Uri.ToString());
}

要使用从数据库中获得的文本来完成此操作,您必须以某种方式解析文本。一旦知道了文本部分和超链接部分,就可以在代码中动态构建文本块内容:

 TextBlockWithHyperlink.Inlines.Clear();
TextBlockWithHyperlink.Inlines.Add("Some text ");
Hyperlink hyperLink = new Hyperlink() {
    NavigateUri = new Uri("http://somesite.example")
};
hyperLink.Inlines.Add("some site");
hyperLink.RequestNavigate += Hyperlink_RequestNavigate;
TextBlockWithHyperlink.Inlines.Add(hyperLink);
TextBlockWithHyperlink.Inlines.Add(" Some more text");

原文由 Stanislav Kniazev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题