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

Windows Presentation Foundation Discussion :

afficher des messages texte avec hyperliens dans un carroussel


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut afficher des messages texte avec hyperliens dans un carroussel
    Salut à tous,

    Je souhaite afficher dans mon appli des conseils qui défilent pendant les chargements. Pour y parvenir, j'ai utilisé un usercontrol trouvé ici: http://www.codeproject.com/Articles/...ge-Transitions qui me permet de charger toutes les dix secondes (en utilisant un timer) un usercontrol contenant le texte que je souhaite afficher.

    Plusieurs questions liées entre elles:

    - Comment devrais-je stocker les différents conseils? J'ai commencé par un fichier xml, mais ça m'a semblé très compliqué en comparaison avec un fichier texte embarqué en tant que ressource. Pour le moment, je récupère la string du fichier texte via "monApplication.my.ressources.astuces" et je la splite avec un séparateur maison. je la stocke ensuite dans un tableau de string, et je fais un random pour afficher le texte. voilà le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim astuces() As String = Split(monApplication.My.Resources.astuces, "<%tipµ>", , CompareMethod.Text)
    Dim r As New Random()
    Dim rInt As Integer = r.[Next](0, astuces.Length - 1)
     
    displaytext (astuces(rInt))
    - La méthode ci-dessus fonctionne bien avec un label pour l'affichage, sauf pour charger des liens hypertexte que je souhaite inclure. Je me suis donc tourné vers la richtextBox comme solution d'affichage. J'ai converti mon fichier de ressources texte en rtf et j'ai ajouté manuellement les liens. Évidemment, lorsque je conserve ma méthode "split", je récupère le rtf brut.
    Si je le charge dans la richtextbox correctement, j'ai toutes les astuces à la suite alors que je ne souhaite en avoir qu'une, aléatoirement (et pas la précédente si possible). J'ai aussi essayé d'envoyer une string avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myFlowDoc.Blocks.Add(New Paragraph(New Run(astuces(rInt))))
    genre
    Ceci est mon astuce, et c'est une très bonne astuce!
    <Hyperlink NavigateUri="http://www.google.fr" RequestNavigate="Hyperlink_RequestNavigate">En savoir plus</Hyperlink>
    mais le texte est littéralement affiché sans que le lien n'apparaisse.

    - Dernière question: j'ai embarqué dans mon application le navigateur chromium via le wrapper .net Awesomium. Vu que je peux afficher du web, j'aimerais en profiter et charger dans mon appli ma page web sans passer par le navigateur par défaut. Disons que ce serait du bonus mais je précise le besoin au cas où ça appellerait une solution différente.

  2. #2
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Tu peux aussi passer par un TextBlock.

    Il contient une collection d'Inlines, dans laquelle tu peux utiliser des Hyperlinks pour afficher les liens.

    Run c'est pour afficher du texte brut.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut
    Merci pour cette réponse. Comme je n'ai pas le temps de me remettre là dessus tout de suite, je laisse le sujet ouvert. Je viendrai le clore avec un retour dès que je reprends le problème.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut
    Je cherche, idéalement, un moyen de charger mon texte directement dans le textblock avec les balises sans pour autant avoir à préciser où sont les inlines. Par exemple, je mets dans mon fichier source la string suivante (en une ligne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     This <Span FontWeight="Bold">is</Span> a
                            <Span Background="Silver" Foreground="Maroon">TextBlock</Span>
                            with <Span TextDecorations="Underline">several</Span>
                            <Span FontStyle="Italic">Span</Span> elements,
                            <Span Foreground="Blue">
                                    using a <Bold>variety</Bold> of <Italic>styles</Italic>
                            </Span>.
    Nom : textblock_inline_span.png
Affichages : 346
Taille : 15,2 Ko
    et je l'affiche via, dans mon code, quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textblock.text = maVariableContenantLeTexteEtLesInlines
    J'ai essayé, mais évidemment, ça m'affiche le texte littéralement. Je voudrais éviter de passer par un regex pour identifier les inlines et les reconstruire le texte. Est-ce qu'il y a moyen d'y parvenir?

    merci!

  5. #5
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Héhé voici un petit secret de ninja mais ça reste entre nous

    Tu peux faire de la génération à la volée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string rawText = "This <Span FontWeight=\"Bold\">is</Span> a <Span Background=\"Silver\" Foreground=\"Maroon\">TextBlock</Span> with <Span TextDecorations=\"Underline\">several</Span> <Span FontStyle=\"Italic\">Span</Span> elements, <Span Foreground=\"Blue\"> using a <Bold>variety</Bold> of <Italic>styles</Italic></Span>.";
     
    string xaml = "<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + rawText + "</TextBlock>";
     
    TextBlock tb = (TextBlock)System.Windows.Markup.XamlReader.Parse(xaml);
     
    output.Inlines.Clear();
    output.Inlines.AddRange(tb.Inlines.ToList());
    Bienvenue dans la matrice.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut
    Haha fantastique!

    Que c'est beau quand ça marche :-)

    Merci Mickael!

  7. #7
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut
    Tout marche au poil excepté les liens hypertexte. Lorsque j'essaie d'en charger un, VS me lève deux exceptions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "Impossible d'établir une liaison avec la méthode cible, car sa signature ou sa transparence de sécurité n'est pas compatible avec celle du type délégué." (System.ArgumentException)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Échec de la création d'un 'RequestNavigate' à partir du texte 'Hyperlink_RequestNavigate'." (System.Xaml.XamlObjectWriterException)
    J'ai créé une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     Sub Hyperlink_RequestNavigate(sender As Object, e As RequestNavigateEventArgs)
            Process.Start(New ProcessStartInfo(e.Uri.AbsoluteUri))
            e.Handled = True
        End Sub
    Le code qui charge le xaml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Dim rawText As String = tips(rInt)
            Dim xaml As String = "<TextBlock xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" >" & rawText & "</TextBlock>"
            ' Cet appel est requis par le concepteur.
            'Dim tb as textblock plus haut dans le code
    tb = DirectCast(System.Windows.Markup.XamlReader.Parse(xaml), TextBlock) 
            txtblk.Inlines.Clear()
            txtblk.Inlines.AddRange(tb.Inlines.ToList())
    Et la déclaration du textblock "en dur" dans mon xaml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <TextBlock  x:Name="txtblk" Margin="92,0,79,0" FontSize="12" Foreground="#FF3F3F3F" Background="{x:Null}"  TextWrapping="Wrap"  ScrollViewer.VerticalScrollBarVisibility="Disabled" ></TextBlock>
    Seuls les textes avec url ne passent pas. Tous les inlines de type "spans" sont interprétés correctement

    Un exemple des textes que je charge (les double quotes n'ont pas besoin d'escape lorsque je charge le texte depuis une ressource.)
    Ce logiciel est vraiment bien.<Hyperlink RequestNavigate="Hyperlink_RequestNavigate" NavigateUri="https://www.google.com">Consultez notre guide pour en savoir plus.</Hyperlink>

  8. #8
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Normal, il ne sait pas à quoi correspondent les gestionnaires et AFAIK on ne peut lui donner de contexte.

    Donc tu peux faire :

    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
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        // string rawText = "This <Span FontWeight=\"Bold\">is</Span> a <Span Background=\"Silver\" Foreground=\"Maroon\">TextBlock</Span> with <Span TextDecorations=\"Underline\">several</Span> <Span FontStyle=\"Italic\">Span</Span> elements, <Span Foreground=\"Blue\"> using a <Bold>variety</Bold> of <Italic>styles</Italic></Span>.";
        string rawText = "Ce logiciel est vraiment bien.<Hyperlink NavigateUri=\"https://www.google.com\">Consultez notre guide pour en savoir plus.</Hyperlink>";
     
        string xaml = "<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + rawText + "</TextBlock>";
     
        TextBlock tb = (TextBlock)System.Windows.Markup.XamlReader.Parse(xaml);
     
        output.Inlines.Clear();
        output.Inlines.AddRange(tb.Inlines.ToList());
     
        foreach (Hyperlink hl in output.Inlines.Where(i => i is Hyperlink))
        {
            hl.RequestNavigate += Hyperlink_RequestNavigate;
        }
    }
     
    private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
    {
        MessageBox.Show("To " + e.Uri);
    }
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut
    Merci, tout fonctionne correctement maintenant. :-)

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

Discussions similaires

  1. Afficher des messages de la commande system dans un edit text
    Par junkie1986 dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 07/05/2012, 12h12
  2. Réponses: 2
    Dernier message: 09/04/2010, 09h39
  3. afficher des messages en couleur dans la console
    Par taha1 dans le forum Langage
    Réponses: 4
    Dernier message: 30/06/2009, 10h57
  4. Réponses: 5
    Dernier message: 07/06/2006, 12h11

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