2010-01-19 127 views
23

问候,1 有一个DB一些文本,其计算方法如下:添加超链接到WPF WPF

Lorem存有胡萝卜,生态番茄汤。 DUIS 区域nisl,sollicitudin欧盟和颤动交流,tempor SED SAPIEN。 希望孩子们坐直在一个锅里永远是重要的。 DUIS 软,有时作为明尼阿波利斯的自由,马萨得力士posuere暂准,feugiat ELIT坦帕斯 湖泊,也没有足球。本是为了方便。 ** [ A HREF = 'http://somesite.com' 一些网站[/ A] **推荐,但不是很多 质量的电视评书和沙拉。小船,和存有或恨笔者

我的问题是:如何可以显示在1 TextBlock一个Hyperlink? 1不想为此目的而使用WebBrowser控件。 1不想使用此控件之一:http://www.codeproject.com/KB/WPF/htmltextblock.aspx

回答

13

您可以使用正则表达式,在这种情况下的值转换器。

使用此为您的要求(从here最初的想法):

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值转换器。

+0

这是一个伟大的答案,谢谢米希尔 – 2010-01-28 07:22:57

+0

不客气! [:)] – mg007 2010-01-29 13:13:45

76

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

<TextBlock Name="TextBlockWithHyperlink"> 
    Some text 
    <Hyperlink 
     NavigateUri="http://somesite.com" 
     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()); 
} 

编辑:你有与数据库中的文本做你“会必须以某种方式分析文本。一旦你知道的文字部分和超链接的一部分,你可以动态地在代码开发WPF内容:

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

yes..but为1已经写了这个链接包含在存储在DB一些文本。 1,那么想读课文,并添加相应的超链接所需要的超链接 – 2010-01-19 11:35:19

+0

斯坦尼斯感谢解释得很清楚,当在WPF – 2011-02-22 04:50:20

+0

谢谢,这个工作奇妙! – BVB 2013-05-13 22:03:44