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 :

Click event en code behind


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 25
    Par défaut Click event en code behind
    Bonjour!

    J'ai un window1 avec un listbox personnalisé à l'aide d'un fichier resource dictionary (Template.xaml).
    La personnalisation me permet ainsi d'avoir un bouton dans chaque items.

    Mon soucis est que je voudrais déclencher un événement en cliquant dessus par "code behind" dans mon fichier Template.xaml.vb.
    Par exemple récupérer le selectedindex de ma listbox.

    Je vous donne mon code window1 :

    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
     
    <Window x:Class="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="836.583" Width="1040" WindowStyle="None" ResizeMode="NoResize" Left="0" Top="0">
     
        <Window.Resources>          
            <ResourceDictionary>
              <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/Templates.xaml"/>
              </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>               
        </Window.Resources>
     
        <Canvas Height="800" Name="Canvas1" Width="1024" >
    <ListBox ItemTemplate="{StaticResource listBoxJoueur}" ItemsSource="{Binding Tables[0]}" Canvas.Left="382.118" Canvas.Top="-2.75" Height="641.098" Name="LBox_Joueurs" Width="592.5" FontSize="15" />
        </Canvas>            
    </Window>
    mon code Resource :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="test" >
     
        <!-- LISTBOX JOUEURS -->
        <DataTemplate x:Key="listBoxJoueur">
                       <Border CornerRadius="4" 
                        BorderBrush="Navy" 
                        BorderThickness="1" 
                        Padding="1"
                        Margin="1"
                        MinWidth="350" Height="100"
                        x:Name="ItemBorder">
                <Border.Background>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                        <GradientStop Offset="0" Color="LightBlue"/>
                        <GradientStop Offset="1" Color="AliceBlue"/>
                    </LinearGradientBrush>
                </Border.Background>
                <StackPanel>
                   <DockPanel >
                    <Image Width="120" Height="90" Source="{Binding Photo}"/>
                    <TextBlock Text="        "/>
                        <TextBlock Text="{Binding NomJoueurs}" Foreground="RoyalBlue"  FontWeight="Bold" FontSize="15" />
                  <Button Content="fff" Height="50" Width="100" x:Name="_buttonDeleteGroupe" Click="TonEvent" />               
                    </DockPanel >
                   <DockPanel>
                    <TextBlock Text="        "/>
                        <TextBlock Text="{Binding Photo}" Foreground="RoyalBlue"  FontWeight="Bold" FontSize="15" />
                   </DockPanel>
    </StackPanel>
    </Border>
        </DataTemplate>
    </ResourceDictionary>
    Et mon Template.xaml.vb quand je clique sur mon bouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Class test
        Dim a As New JUKEBOX_WPF.Application
        Private Sub TonEvent(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            MsgBox("test", MsgBoxStyle.Critical)
     
          '  MsgBox("JOUEUR N° : " & LBox_Joueurs.SelectedIndex, MsgBoxStyle.Critical)
     
        End Sub
    End Class
    Evidement je n'arrive pas à obtenir l'accès à ma listbox ailleurs que dans Window1...

    Si quelqu'un peut m'aider car je ne trouve pas de solution!Même pas dans le livre de Mr Lebrun... ou alors qu'on me donne le numéro de la page

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    Une solution pour le faire est d'utiliser FindAncestor. Pour ton bouton, tu peux mettre dans la propriété Tag par exemple :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button ... Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=SelectedIndex}" />

    Pour faire simple, c'est un binding qui permet de remonter jusqu'au premier élément ListBox (cf. AncestorType) et d'en récupérer la propriété SelectedIndex (cf. Path).

    Ensuite dans ton évènement Click, tu pourras récupérer le "sender" qu'il faudra caster correctement pour récupérer la propriété Tag du Bouton.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    hello dans button de ton template tu peux mettre
    un truc dans ce style
    DataContext ="{Binding RelativeSource=
    "{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"

    ce qui fait que dans ton evenement tu peux reccup (excuse moi je met le code en c#)
    ListBox lb = ((Button)sender).DataContext as ListBox;

    j'ai pas verifier en code, mais en tout cas c'est un truc dans ce style

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    C'est de la synchro tout ça

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    en plus ma version est meilleurs

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 25
    Par défaut
    Merci les gars je vais essayer ce que vous me dite.

    Par contre je suis déçu car j'y voyais plus simple (genre juste une déclaration quelquonque à faire dans ma class test et si possible en passant par ma classe "test"?

    Juste une précision :
    Imaginons que j'ai un label sur mon window1, est-ce qu'avec votre solution je peux quand je clique sur le bouton de mon item que le contenu de mon item s'affiche dans le content de mon label ?

    Avant dans winform, si il y avait un label sur form1 et qu'on voulait y acceder par le clique d'un boutton sur form2, on utilisait dans la classe form2 form1.label.text=""

    Y a pas moyen de faire pareil en wpf??

    A +

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    oui mais la c'est plus simple tu peux binder le texte du label sur litemselect (et le texte de l'objet contenu) de la listebox ...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 25
    Par défaut
    Merci Ikeas!

    Y a pas moyen de faire pareil en wpf??
    oui mais la c'est plus simple
    Par contre si ça ne te dérange pas peux-tu m'indiquer la marche à suivre pour mon exemple précédent à savoir comment puis-je changer le content de mon label qui est dans window1 dans mon "Private Sub TonEvent" qui est dans ma classe test.(sans passer xaml)
    J'en aurais sans doute besoin plus tard que ce soit pour un label ou autre chose.

    Merci!

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    par contre je crois que ce n'est pas possible d'appeler un event defini dans la xaml qui n'est pas dans le code behind
    c'est a dire appeler le code xx d'une classe sans utiliser un wrapper.
    j'avais deja poster quelque chose dans ce sens et je crois que sur le blog de thomas y 'ptet quelque chose.
    par contre je vois pas pourquoi tu veux pas passer par xaml

    sinon dans une classe si tu veux intervenir sur un objet, il faut au moins le connaitre ...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 25
    Par défaut
    sinon dans une classe si tu veux intervenir sur un objet, il faut au moins le connaitre ...
    Je la connais ma classe, j'ai mon label sur mon window1.xaml, je peux changer son content dans ma classe window1 du window1.xaml.vb mais je voudrais (désolé d'insister...) pouvoir changer le content dans une autre classe (dans mon exemple la classe test de mon template.xaml.vb).

    Avant (en vb) quand j'avais un label sur le form1 je pouvais modifier le text dans la classe form1 en faisant label.text="fff" et si je devais le modifier dans une classe form2 je faisais form1.label.text=fff".

    Alors pourquoi je ne veux pas passer par xaml? Tout simplement parce que je débute et que s'est encore un peu obscure pour moi.
    En fait je suis en train depuis 2 mois de réencoder en wpf un programme (pour la qualité visuelle extraordinaire que cela procure) que j'avais fait en 15 jours en vb pure. Je perd un peu de temps et j'aimerais avancer en utilisant des anciennes techniques quitte à remodifier en xaml (que je m'approprie de + en +)

    Voilà pour l'explication.

    Merci d'avance!!

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    ecoute fait moi un tout petit exemple rapidos je regarderais ton code
    (eventuellement je te collerais meme le code en xaml on gagnera du temps eheheheh)
    tu me met le projet en piece jointe

    tu devrais quand meme en profiter pour passer a C#

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    J'ai l'impression que tu ferais mieux de mettre ton template dans les ressource de ton Window1. L'intérêt de le séparer est de pouvoir le réutiliser ailleurs. Mais là il dépend du conteneur dans lequel il est (ListBox) et maintenant d'un label de la Window1.

    Aussi moi je supprimerai le fichier Templates.xaml et code behind associé et je mettrai tout simplement le DataTemplate dansle fichier Window1 :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <Window.Resources>
     
        <!-- LISTBOX JOUEURS -->
      <DataTemplate x:Key="listBoxJoueur">
        <Border CornerRadius="4" 
                BorderBrush="Navy" 
                BorderThickness="1" 
                Padding="1"
                Margin="1"
                MinWidth="350" Height="100"
                x:Name="ItemBorder">
          <Border.Background>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
              <GradientStop Offset="0" Color="LightBlue"/>
              <GradientStop Offset="1" Color="AliceBlue"/>
            </LinearGradientBrush>
          </Border.Background>
          <StackPanel>
            <DockPanel >
              <Image Width="120" Height="90" Source="{Binding Photo}"/>
              <TextBlock Text="        "/>
              <TextBlock Text="{Binding NomJoueurs}" Foreground="RoyalBlue"  FontWeight="Bold" FontSize="15" />
              <Button Content="fff" Height="50" Width="100" x:Name="_buttonDeleteGroupe" Click="TonEvent" />
            </DockPanel >
            <DockPanel>
              <TextBlock Text="        "/>
              <TextBlock Text="{Binding Photo}" Foreground="RoyalBlue"  FontWeight="Bold" FontSize="15" />
            </DockPanel>
          </StackPanel>
        </Border>
      </DataTemplate>
     
    </Window.Resources>
     
    <Canvas Height="800" Name="Canvas1" Width="1024" >
     
      <ListBox ItemTemplate="{StaticResource listBoxJoueur}" 
                 ItemsSource="{Binding Tables[0]}" 
                 Canvas.Left="382.118" Canvas.Top="-2.75" 
                 Height="641.098" 
                 Name="LBox_Joueurs" 
                 Width="592.5" 
                 FontSize="15" />
     
    </Canvas>
    Après ton évènement ToEvent, tu l'auras dans Window1.xaml.vb. Du coup tu connaitra ton label de ta Window1.

    nb: Il est possible de s'en sortir avec ton fichier Resource Template.xaml, mais ça veut dire mettre en place un mécanisme trop lourd à mon sens.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 25
    Par défaut
    Salut!

    Bon je me suis remis à mon projet ce matin et je commence à obtenir quelque chose avec l'aide d'Ikeas :

    DataContext ="{Binding RelativeSource=
    "{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"
    C'est pas encore tout à fait ça mais il y a du mieux et je pense que ça vient de moi...

    J'ai aussi suivi le conseil de Binoo et mis mon data template de ma listbox dans window1 (du coup c'est un peu plus simple d'acceder aux controles.)

    Et pour finir, merci Ikeas de m'avoir convaincu... je vais tenter de passer à C# (enfin...!). ça sera plus simple au niveu de l'aide.

    Je pense que peux mettre le sujet en résolu!

    Merci les gars!!

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    merci pour ton merci

    y'a un truc de bien avec c# c'est que rien n'est masqué (en vb il ajoute souvent des trucs qu'on ne voit pas - je vais pas detailler ici -), je te conseil de voir avec (l'exelent) net reflector ce que ton code vb donne en c# pour comprendre c'est mieux.

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

Discussions similaires

  1. Déclarer un event depuis le code behind
    Par toss.net dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 22/06/2010, 12h21
  2. associer event frameset à code behind asp.net
    Par ouadie99 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 09/06/2008, 15h33
  3. Réponses: 4
    Dernier message: 29/12/2006, 16h54
  4. Réponses: 5
    Dernier message: 24/05/2005, 12h31
  5. [VB.NET] Création d'un tableau en code behind
    Par netr dans le forum ASP.NET
    Réponses: 6
    Dernier message: 11/05/2004, 10h02

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