1

假设我们有 RichTextBlock 的这种情况:

<RichTextBlock IsTextSelectionEnabled="True">
    <Paragraph>
        <Run Text="{Binding Description}" />
    </Paragraph>
</RichTextBlock>

是否可以检测内容中可能的超链接,以便当用户单击它们时,Web 浏览器应用程序将打开?

例如,假设该Description属性将包含以下字符串:

“欢迎来到 Stackoverflow。您可以在http://www.stackoverflow.com/guide找到快速指南。要跟踪您的问题,请访问http://www.stackoverflow.com/questions。祝您编码愉快!”

目前,这个确切的字符串绑定在 UI 上,但我希望能够以某种方式检测可能的链接并能够在点击它们时导航到它们,就像您可以使用网络浏览器一样。

设置为禁用的文本选择是我必须满足的要求之一,尽管这至少可以在某种程度上帮助复制粘贴链接。

任何建议都非常感谢!

4

1 回答 1

0

您需要解析整个 HTML 和地狱不 - 不要像有人建议的那样使用正则表达式(正则表达式无法解析 html) - 从 Nuget 管理器安装 HtmlAgilityPack (没关系,不是格式良好的 html 文档,HtmlAgilityPack 将做它的工作)。

随意挑选和调整我的 XamlHtmlParser (目前并非一切都很好 - 它确实是早期的开发阶段,但您可以使用其中的几个类来解析超链接、换行符等。)来自我的开源波兰语 reddit-like 服务应用程序实现:https ://github.com/thefex/Wykop/tree/dev_windows81_api/Wykop.ApiProvider/XamlParser 。

如果您想为您的超链接“导航”,请在HyperLinkNodeParser类中添加适当的“NavigateUri”。

用法:

XamlHtmlParser htmlParser = new XamlHtmlParser(new DefaultHtmlNodeParserProvider());
RichTextBlock richTextBlock = ..;
var parsedHtmlBlocks = htmlParser.GetBlocksFromHtmlString(htmlLikeString);
richTextBlock.Blocks.Clear();

foreach (var parsedBlock in parsedHtmlBlocks)
   richTextBlock.Blocks.Add(parsedBlock);

顺便提一句。似乎无法绑定 - 必须使用代码隐藏。

于 2015-01-10T22:55:08.627 回答