Ajouter un lien hypertexte vers textlock wpf

salutations, J'ai du texte dans une db et il est comme suit:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tellus nisl, venenatis et pharetra ac, tempor sed sapien. Entier peilentesque blandit velit, in tempus urna semper sit amet. Duis mollis, libero ut consectetur interdum, massa tellus posuere nisi, eu aliquette elit lacus nec erat. Praesent un commodo quam. **[un href= http://somesite.com ']site[/a]**Suspendisse à nisi sit amet massa molestie gravida feugiat ac sem. Phasellus ac mauris ipsum, vel auctor odio

ma question Est: Comment puis-je afficher un Hyperlink dans un TextBlock ? Je ne veux pas utiliser un contrôle webBrowser dans ce but. Je ne veux pas utiliser ce contrôle non plus: http://www.codeproject.com/KB/WPF/htmltextblock.aspx also

28
demandé sur Dave Clemmer 2010-01-19 13:56:30

2 réponses

vous pouvez utiliser Regex avec un convertisseur de valeurs dans une telle situation.

utilisez ceci pour vos besoins (idée originale de ici ):

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

cela va correspondre à tous les liens dans votre chaîne contenant des liens, et faire 2 groupes nommés pour chaque match: link et text

Maintenant vous pouvez itérer à travers toutes les correspondances. 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: utilisez cette logique dans votre convertisseur de valeurs personnalisé ConvertToHyperlinkedText .

15
répondu mg007 2017-05-23 11:47:23

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 le navigateur par défaut pour naviguer vers votre hyperlien serait:

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

Edit: pour le faire avec le texte que vous avez obtenu de la base de données, vous devrez analyser le texte d'une manière ou d'une autre. Une fois que vous connaissez les parties textuelles et les parties hyperliées, vous pouvez construire dynamiquement le contenu de textlock 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");
80
répondu Stanislav Kniazev 2010-01-19 13:42:38