2010-01-19 8 views
23

Salutations, 1 ont un texte sur un DB et il est comme suit:lien hypertexte vers WPF WPF

carottes lorem ipsum, de soupe de tomate écologique. région Duis NISL, sollicitudin eu, et ac carquois, tempor sed sapien. veut les enfants sont assis en position verticale dans un pot sera toujours important. Duis doux, parfois comme Minneapolis, sans massa Tellus posuere nisi, feugiat Elit tempus les lacs et il n'y avait pas de football. Présent à titre de commodité. ** [ a href = 'http://somesite.com'] Certains sites [/ a] ** recommandé mais pas beaucoup conte de télévision de masse et une salade. Un bateau et Ipsum ou auteur haine

Ma question est la suivante: Comment peut afficher un Hyperlink sur un 1 TextBlock? 1 ne veulent pas utiliser un contrôle WebBrowser à cet effet. 1 ne veulent pas utiliser ce contrôle soit: http://www.codeproject.com/KB/WPF/htmltextblock.aspx également

Répondre

13

Vous pouvez utiliser Regex avec un convertisseur de valeur dans de telles situations.

utiliser ceci pour vos besoins (idée originale de here):

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

Cela correspond à tous les liens dans vos liens contenant la chaîne, et de faire 2 groupes nommés pour chaque match: link et text

maintenant vous pouvez parcourir tous les matchs. Chaque match vous donnera un

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 
    } 

Note: utiliser cette logique dans votre convertisseur de valeur personnalisée ConvertToHyperlinkedText.

+0

Ceci est une excellente réponse, je vous remercie Mihir –

+0

Vous êtes les bienvenus! [:)] – mg007

76

l'affichage est assez simple, la navigation est une autre question. XAML va comme ceci:

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

et le gestionnaire d'événements qui lance votre navigateur par défaut pour accéder au lien hypertexte serait:

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

Edit: vous avez à faire avec le texte de base de données « ll ont pour analyser le texte en quelque sorte. Une fois que vous connaissez les parties textuelles et une partie hyperlié, vous pouvez construire dynamiquement le contenu WPF dans le code:

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 que 1 1 ont écrit ce lien inclus dans un texte qui est stocké dans DB. 1 alors voudrais lire le texte et ajouter des liens hypertextes appropriés en cas de besoin –

+0

Merci de Stanislav très claire explication de l'hyperlien dans WPF –

+0

Merci, cela a fonctionné à merveille! – BVB

Questions connexes