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 :

Converter: créer des HyperLink pour remplir un TextBlock


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut Converter: créer des HyperLink pour remplir un TextBlock
    Bonjour,
    dans une fenêtre, j'ai un TextBlock bindé à une propriété de mon contexte. Cette propriété est une collection d'objet Person, et j'utilise un Converter pour afficher les noms et prénoms séparés par des ;
    Code C# : 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
     
    class CollectionToSingleItem : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
             object myitem = new object();
             List<Person> mypers = (List<Person>)value;
             if (mypers.Count > 0) 
             {
                 foreach (Person p in mypers)
                 {
                      myitem += p.FirstName + " " + p.Name + " ; ";
                 }
              }
              return myitem;              
        }
    }
    Ça fonctionne très bien.
    Ce que j'aimerais maintenant, c'est transformer les différents éléments Prénom/Nom en HyperLinks et les retourner dans myitem.
    Et là, je sèche...

    J'ai essayé ceci:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    List<Hyperlink> myhypers = new List<Hyperlink>();
    TextBlock tb = new TextBlock();
    foreach (Person p in mypers)
    {
        Run myrun = new Run(p.FirstName + " " + p.Name);
        Hyperlink lnk = new Hyperlink(myrun);
        lnk.NavigateUri = new Uri("http://www.google.fr"); //Juste pour test
        tb.Inlines.Add(lnk);
    }
    myitem = tb.Inlines;
    Mais rien ne s'affiche...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    Bon, j'ai décidé de faire autrement: au lieu d'effectuer la transformation dans le Converter, je la fais dans l'évènement TargetUpdated de mon TextBlock.
    Je récupère chaque nom dans un tableau de string et je crée les Hyperlink voulus:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string[] names = mytb.Text.Split(new char[] { ';' });
    foreach (string n in names)
    {
        Hyperlink mylink = new Hyperlink(new Run(n));
        mytb.Inlines.Add(mylink + " ; ");
    }
    Mais il m'affiche dans le TexBlock System.Windows.Documents.Hyperlink<br />

    Ce que je ne comprends pas avec ces Hyperlink, c'est qu'ils n'ont pas de propriété Text ou Content pour afficher le texte du lien...
    Et, en outre, il n'affiche qu'un seul System.Windows.Documents.Hyperlink alors que la collection Inlines contient bien plusieurs Hyperlinks !

    Comment faire ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    J'expose la solution, trouvée ailleurs:
    ici, cela ne marche pas car je binde la propriété Text du TextBlock avec une collection d'Inlines. La solution est de passer par un multibinding: un binding pour relier le Text, l'autre pour relier le TextBox lui-même et ainsi récupérer l'instance dans le Converter. Mon TextBlock se trouvant désormais dans un UserControl dont le DataContext est déjà une List<Person>, le 1er binding est défini sur ".".
    Enfin, pour mon cas précis, ce n'est pas ici sur la propriété Text mais sur IsEnabled qu'est mis en place le MultiBinding car, mon TextBlock se trouvant dans un DataTemplate, cela ne fonctionne pas avec la propriété Text:
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <TextBlock FontWeight="Bold" TextAlignment="Center" Name="tbName">
        <TextBlock.IsEnabled>
            <MultiBinding Converter="{StaticResource StringToLinkConverter}">
                <Binding Path="." />
                <Binding Path="." RelativeSource="{RelativeSource Self}"/>
            </MultiBinding>
        </TextBlock.IsEnabled>
    </TextBlock>

    Et le code du Converter:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Person p = (Person)value[0];
        TextBlock tb = value[1] as TextBlock;
     
        Run myrun = new Run(p.FirstName + " " + p.Name);
        Hyperlink lnk = new Hyperlink(myrun);
        lnk.NavigateUri = new Uri("http://www.google.com");
        lnk.Click += new RoutedEventHandler(Hyperlink_Click);
        tb.Inlines.Add(lnk);
     
        return null;
    }

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 005
    Points : 5 428
    Points
    5 428
    Par défaut
    Ca serait pas plus simple et plus clair d'utiliser un itemcontrol avec stackpanel horizontal, puis des textblock en guise d'itemtemplate?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    Ou si tu veux rester dans l'utilisation d'un seul textblock peut etre une attached property.
    Cet exemple colle plutôt pas mal avec ton besoin : http://vjsrinath.blogspot.fr/2011/08...ock-using.html

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    Merci pour le lien.
    Pour mon cas, je n'ai pas mis tout le Xaml, mais mon TextBlock n'est qu'un élément du DataTemplate d'une Listbox:
    Code XAML : 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
    26
    27
    28
    29
    <ListBox ItemsSource="{Binding}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="83" />
                                    <RowDefinition Height="Auto" />
                                </Grid.RowDefinitions>
                                <Image Width="70" Height="80" Source="{Binding Pictures, Converter={StaticResource CollToItemConverter}}" Stretch="Fill" />
                                <StackPanel Grid.Row="1">
                                    <TextBlock>
                                        <TextBlock.IsEnabled>
                                            <MultiBinding Converter="{StaticResource StringToLinkConverter}">
                                                <Binding Path="." />
                                                <Binding Path="." RelativeSource="{RelativeSource Self}"/>
                                            </MultiBinding>
                                        </TextBlock.IsEnabled>
                                    </TextBlock>
                                    <TextBlock Text="{Binding Path=Role}" />
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" Background="Transparent" />
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
    </ListBox>

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

Discussions similaires

  1. WinDev 9 : Créer des sons pour un piano
    Par jbidou88 dans le forum WinDev
    Réponses: 1
    Dernier message: 20/08/2007, 15h48
  2. Réponses: 2
    Dernier message: 09/02/2007, 19h47
  3. Réponses: 1
    Dernier message: 21/07/2006, 06h56
  4. Créer des bordures pour un JLabel
    Par theniaky dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/05/2006, 20h18
  5. Réponses: 2
    Dernier message: 04/08/2005, 20h00

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