2010-01-19 28 views
23

Pozdrowienia, 1 mieć jakiś tekst na DB i to w sposób następujący:Dodaj hiperłącze do WPF WPF

marchewki lorem ipsum, ekologiczne zupę pomidorową. Duis regionu nisl, sollicitudin UE, a ac kołczan, tempor sed sapiens. chce dzieci siedzieć prosto w garnku zawsze będzie ważne. Duis miękkie, czasami jak Minneapolis-wolny, Massa Tellus Zapytanie Nisi, feugiat elit Tempus jezior i nie było piłki nożnej. Obecny jako udogodnienie. ** [ a href = 'http://somesite.com'] Niektóre site [/ a] ** zalecane, ale nie dużo masa opowiadanie telewizyjnych i sałatki. Łódka, a Ipsum lub nienawiść autor

Moje pytanie brzmi: W jaki sposób można wyświetlić Hyperlink na 1 TextBlock? 1 nie chcę użyć formantu WebBrowser do tego celu. 1 nie chcesz korzystać z tej kontroli albo: http://www.codeproject.com/KB/WPF/htmltextblock.aspx również

Odpowiedz

13

Można użyć wyrażenia regularnego z konwerterem wartości w takich sytuacjach.

użycie tego dla własnych potrzeb (oryginalny pomysł z here):

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

ta pasuje do wszystkich linków w ciąg zawierający linki i zrobić 2 o nazwie grupy na każdym meczu: link i text

teraz możesz iterację wszystkich meczów. Każdy mecz daje

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 
    } 

Uwaga: Użyj tej logiki w konwerterze wartości zwyczaj ConvertToHyperlinkedText.

+0

Jest to świetna odpowiedź, dziękuję Mihir –

+0

Jesteś mile widziany! [:)] – mg007

76

wyświetlanie jest dość prosty, nawigacja jest inna kwestia. XAML idzie tak:

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

i obsługi zdarzeń, który uruchamia domyślną przeglądarkę, aby przejść do hiperłącza będzie:

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

Edit: masz zrobić to z tekstu z bazy danych będziesz musiał analizować tekst jakoś. Gdy wiesz, części tekstowe i hiperłącza część, można zbudować WPF zawartość dynamicznie w kodzie:

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 jako 1 1 nie pisał ten link zawarte w jakiś tekst, który jest przechowywany w DB. 1 następnie chciałby przeczytać tekst i dodać odpowiednie linki, gdy są potrzebne –

+0

Stanislav Dzięki bardzo jasne wyjaśnienie hiperłącza w WPF –

+0

Dzięki, to działało wspaniale! – BVB