IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Remplacer du texte par un Hyperlink ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 66
    Par défaut Remplacer du texte par un Hyperlink ?
    Bonjour,

    Je possède un Textblock (WPF), auquel j'ajoute du texte via Inlines.Add();

    Mes textes sont des phrases facilement localisables avec des noms à insérer dedans. Exemple
    La personne #p1 joue au foot
    #p1 is playing football

    Du coup je met toute la phrase dans mon texte, et j'aimerais remplacer juste #p1 par un hyperlink contenant le nom de la personne.

    Y'a-t-il un moyen simple de faire ça ? Ou alors je dois découper le string en fonction de #p1, ajouter la première partie, mettre l'hyperlink puis mettre le reste du texte ? C'est un peu sale de faire ça comme ça et ça deviendrait vite incompréhensible avec plusieurs références à changer dedans.

    À moins que vous ayiez un moyen plus simple de localiser dans ce cas je suis preneur.

    (Je ne savais pas où placer ce post, plutot dans WPF ou dans C# ? ça concerne peu le WPF au final)

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Le plus simple serait de passer par du XAML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    string text = "La personne #p1 joue au foot";
    string link = "<HyperLink NavigateUri=\"blabla\">#1</HyperLink>";
    string xaml = string.Format("<Span>{0}</Span>").Replace("#1", link);
    ParserContext context = new ParserContext();
    context.XmlnsDictionary.Add(string.Empty, "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
    Span content = (Span)XamlReader.Parse(xaml, context);
    textBlock.Inlines.Add(content);
    (par contre attention, si le texte d'origine contient "<" ou ">" ça va pas marcher, il faudra les remplacer par "&lt;" et "&gt;")

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 66
    Par défaut
    Merci, je vais tester ça.

    EDIT:
    Il manque pas un truc dans ton code ? On ne se sert jamais de la variable text, faut le mettre à la place de {0} je suppose
    Idem dans le replace ça serait plutot #p1 ?

    En faisant comme ça avec ces modifs, j'obtiens bien une variable xaml de type:
    "<span>blablablabla<Hyperlink xxx>personne</Hyperlink></Span>"
    Mais au moment d'arriver sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Span content = (Span)System.Windows.Markup.XamlReader.Parse(xaml, context);
    j'ai une erreur :
    'Impossible de créer le type inconnu '{http://schemas.microsoft.com/winfx/2006/xaml/presentation}HyperLink'.' numéro de ligne '1' et position de ligne '8

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par PigKey6 Voir le message
    Il manque pas un truc dans ton code ? On ne se sert jamais de la variable text, faut le mettre à la place de {0} je suppose
    Idem dans le replace ça serait plutot #p1 ?
    Oups, oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string xaml = string.Format("<Span>{0}</Span>"; text).Replace("#p1", link);

    Citation Envoyé par PigKey6 Voir le message
    En faisant comme ça avec ces modifs, j'obtiens bien une variable xaml de type:
    "<span>blablablabla<Hyperlink xxx>personne</Hyperlink></Span>"
    Mais au moment d'arriver sur la ligne
    Span content = (Span)System.Windows.Markup.XamlReader.Parse(xaml, context);

    j'ai une erreur :
    'Impossible de créer le type inconnu '{http://schemas.microsoft.com/winfx/2006/xaml/presentation}HyperLink'.' numéro de ligne '1' et position de ligne '8
    Ah oui, en fait c'est Hyperlink, pas HyperLink (pas de majuscule sur le L). C'est un peu perturbant parce que les deux existent dans le framework

    Sinon, je sais pas si ça répond à ton besoin, mais tu peux regarder la propriété attachée TextBlockBehavior.RichText dans la librairie Dvp.NET

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock dvp:TextBlockBehavior.RichText="{Binding LeTexteRicheXaml}" />

    Je te l'avais pas proposé au début parce qu'il me semblait que ce n'était pas encore inclus dans la version actuelle, mais en fait si...

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 66
    Par défaut
    J'obtiens toujours une erreur :
    Il existe un caractère non valide dans l'encodage donné. Ligne 1, position 107.
    En fonction du texte à afficher je n'ai pas forcément remarqué de similitudes dans les positions

    ça arrive généralement dans la balise qui ferme Hyperlink ou juste après.

    ma variable xaml contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Span><Hyperlink Tag=\"119\" NavigateUri=\"afficher_personne_detail_liste\">XXX</Hyperlink> va à <Hyperlink Tag=\"11\" NavigateUri=\"afficher_ville_detail_liste\">Orleans</Hyperlink></Span>
    Je sais pas si ça change quelque chose mais j'ai pas mis {0} mais "+texte+" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string xaml = string.Format("<Span>" + texte + "</Span>");
    (Je fais les replace après)

    Voici mon code complet (je passe des tableaux pour faire plusieurs liens d'un coup):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public static Span GetXamlHyperlink(string texte, string[] texteAremplacer, string[] texteremplacement, string[] lien, int[] tags)
            {//le texte = texte du message
                //texte a remplacer = #j1, #t1 etc
                //texteremplacement = "José Machin" etc
                //lien = nom de la fonction
                string xaml = string.Format("<Span>" + texte + "</Span>");
                int i = 0;
                while(i<texteAremplacer.Length)
                {
                    string link = texteremplacement[i];
                    if (lien[i].Length > 0)
                    {//On met un lien que si le lien est bien renseigné
                        link = "<Hyperlink Tag=\"" + tags[i] + "\" NavigateUri=\"" + lien[i] + "\">" + texteremplacement[i] + "</Hyperlink>";
                    }
                xaml = xaml.Replace(texteAremplacer[i], link);
     
                i++;
                }
                ParserContext context = new ParserContext();
                context.XmlnsDictionary.Add(string.Empty, "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
                Span content = (Span)System.Windows.Markup.XamlReader.Parse(xaml, context);
     
                return content;
     
            }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par PigKey6 Voir le message
    Je sais pas si ça change quelque chose mais j'ai pas mis {0} mais "+texte+" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string xaml = string.Format("<Span>" + texte + "</Span>");
    ça revient au même, mais dans ce cas String.Format ne sert à rien...


    Sinon, j'ai testé ta fonction avec comme indiqué ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var link = GetXamlHyperlink("Bonjour #name", new[] { "#name" }, new[] { "Thomas" }, new[] { "http://www.google.fr" }, new[] { 42 });
    textBlock1.Inlines.Add(link);
    et j'ai pas d'erreur... donc le problème doit être ailleurs. Montre la StackTrace de ton exception

    EDIT: en fait c'est le caractère "à" qui ne passe pas. Si tu mets "&#224;" à la place, ça fonctionne. Mais c'est bizarre, il me semble que normalement on peut sans problème utiliser des caractères accentués

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer un texte par un formulaire
    Par robocop333 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/05/2008, 15h49
  2. [RegEx] Remplacer un texte par un include
    Par Oprichnik dans le forum Langage
    Réponses: 4
    Dernier message: 24/01/2008, 23h59
  3. [Tableaux] remplacer du texte par des images
    Par elti69 dans le forum Langage
    Réponses: 2
    Dernier message: 12/06/2007, 10h14
  4. Remplacer du texte par une image en css
    Par Seth77 dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 03/04/2006, 11h57
  5. Remplacer un texte par un autre
    Par Guillaume602 dans le forum C++
    Réponses: 3
    Dernier message: 24/11/2005, 00h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo