2010-01-19 131 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