2010-01-19 1 views
23

Saluti, 1 hanno qualche testo su un DB ed è la seguente:Aggiungi collegamento ipertestuale a WPF WPF

carote Lorem ipsum, zuppa di pomodoro ecologica. Duis regione nisl, sollicitudin eu, e ac faretra, tempor sed sapiens. vuole i bambini seduti in posizione verticale in una pentola sarà sempre importante. Duis morbido, a volte come Minneapolis-libera, Massa Tellus Inchiesta Nisi, feugiat elit Tempus i laghi e non c'era il calcio. Presente come vantaggio. ** [ a href = 'http://somesite.com'] Alcuni sito [/ a] ** consigliato ma non un sacco di massa narrazione televisiva e un'insalata. Una barca, e Ipsum o odio autore

la mia domanda è: come si può visualizzare un Hyperlink su un 1 TextBlock? 1 non si vuole utilizzare un controllo WebBrowser a questo scopo. 1 non vogliono utilizzare questo controllo sia: http://www.codeproject.com/KB/WPF/htmltextblock.aspx anche

risposta

13

È possibile utilizzare Regex con un convertitore di valori in tali situazioni.

uso questo per le vostre esigenze (idea originale da here):

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

Questo corrisponderà tutti i link nella vostra stringa contenente link, e fare 2 gruppi denominati per ogni partita: link e text

ora è possibile scorrere tutte le partite. Ogni partita vi darà una

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 
    } 

Nota: uso questa logica nella vostra abitudine ConvertToHyperlinkedText convertitore di valori.

+0

Questa è una grande risposta, grazie Mihir –

+0

Sei il benvenuto! [:)] – mg007

76

visualizzazione è piuttosto semplice, la navigazione è un'altra questione. XAML è questa:

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

e il gestore di eventi che lancia il browser predefinito per navigare il collegamento ipertestuale sarebbe:

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

Edit: devi farlo con il testo dal database 'll deve analizzare il testo in qualche modo. Una volta che conosci le parti testuali e parte collegamento ipertestuale, è possibile costruire il contenuto WPF in modo dinamico nel codice:

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 come 1 1 hanno scritto questo link incluso in un testo che viene memorizzato nel DB. 1 poi vorrebbe leggere il testo e aggiungere collegamenti ipertestuali adeguati quando necessario –

+0

Stanislav Grazie molto chiara spiegazione del collegamento ipertestuale in WPF –

+0

Grazie, questo ha funzionato meravigliosamente! – BVB