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 :

[Gridview] Menu Contextuel sur l'item


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut [Gridview] Menu Contextuel sur l'item
    Bonjour,

    Je cherche a mettre un menu contextuel sur chaque ligne de ma gridview.

    J'ai réussi a en mettre une su la listview mais ce n'est pas bon cela ne prend pas le datacontext contenant l'item cliqué.
    Sinon j'ai tenté d en mettre un sur les Grid des datatemplate des cellule mais ce n'est pas génial car si l'on clic entre les cellule ou sur une cellule vide, évidement le menu n'apparait pas ...

    Donc voila ma question est :

    Comment mettre un menu contextuel par item dans une gridview ? (de préférence en C#plutot que XAML car selon les droits de l'utilisateur je dois changer le contenu du menu).

    Merci

  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,

    Ça doit être possible d'assigner le ContextMenu sur le ListViewItem et de passer par un converter pour pouvoir le remplir via le code C#.

    Il faut donc ajouter au style du ListViewItem par défaut la propriété suivante :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    ContextMenu="{Binding Converter={StaticResource CtxtMenuConv}}"
    Soit :
    Code xml : 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
      <Window.Resources>
        <l:CtxtMenuConverter x:Key="CtxtMenuConv" />
     
        <Style x:Key="ListViewItemStyle1" TargetType="{x:Type ListViewItem}">
          <Setter Property="Background" Value="Transparent"/>
          <Setter Property="VerticalContentAlignment" Value="Center"/>
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border SnapsToDevicePixels="true" x:Name="Bd" 
                        Background="{TemplateBinding Background}" 
                        BorderBrush="{TemplateBinding BorderBrush}" 
                        BorderThickness="{TemplateBinding BorderThickness}" 
                        Padding="{TemplateBinding Padding}"
                        ContextMenu="{Binding Converter={StaticResource CtxtMenuConv}}">
                  <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                  <Trigger Property="IsSelected" Value="true">
                    <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                  </Trigger>
                  <MultiTrigger>
                    <MultiTrigger.Conditions>
                      <Condition Property="IsSelected" Value="true"/>
                      <Condition Property="Selector.IsSelectionActive" Value="false"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                  </MultiTrigger>
                  <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                  </Trigger>
                </ControlTemplate.Triggers>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
     
      </Window.Resources>
    Puis pour le ListView, il faut ajouter :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    ItemContainerStyle="{StaticResource ListViewItemStyle1}"
    Dans le Converter, on crée le Menu contextuel selon l'item et les droits utilisateurs :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
      public class CtxtMenuConverter : IValueConverter {
        public object Convert( object o, Type type, object parameter,
                              CultureInfo culture ) {
     
          // Il faut donc définir le ContextMenu selon l'Item cliqué et selon les droits utilisateurs.
     
          // Là c'est un Menu Contextuel basique...
          ContextMenu ctmenu = new ContextMenu();
     
          MenuItem mi1 = new MenuItem();
          mi1.Header = "Menu 1";
          MenuItem mi2 = new MenuItem();
          mi2.Header = "Menu 2";
          MenuItem mi3 = new MenuItem();
          mi3.Header = "Menu 3";
     
          ctmenu.Items.Add( mi1 );
          ctmenu.Items.Add( mi2 );
          ctmenu.Items.Add( mi3 );
     
          return ctmenu;
        }
     
        public object ConvertBack( object o, Type type, object parameter,
                                  CultureInfo culture ) {
          throw new NotSupportedException();
        }
      }
    Dans le converter, il faut caster l'objet o qui est l'item.

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    hummm ok mais comment je redirige les événements clic vers des méthodes de mon usercontrol ?

    Sinon j'ai peut etre trouvé une autre piste :

    Je m'abonne à l'événement PreviewRightMouseDown de mes listviewItem et je créer à la volé un ContextMenu.

    Sauf que je n'arrive pas a afficher ce menu.

  4. #4
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    C'est bon j'ai réussi

    voici le code pour ceux que ça intéresse :

    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
    //On s'abonne a l'événement           
     
    RecordListLeft.AddHandler(ListViewItem.PreviewMouseRightButtonDownEvent,
                    new RoutedEventHandler(ListViewItem_PreviewMouseRightButtonDown), true);
     
    //on crée le menu
            void ListViewItem_PreviewMouseRightButtonDown(object sender, RoutedEventArgs e)
            {
                ContextMenu menu = new ContextMenu();
                menu.DataContext = ((FrameworkElement)e.OriginalSource).DataContext;
                MenuItem edition = new MenuItem { Header = "Editer" };
                edition.Click += new RoutedEventHandler(edition_Click);
     
                menu.Items.Add(edition);
                menu.IsOpen = true;
            }
     
    //le datacontext contenant l'item est transféré :
            void edition_Click(object sender, RoutedEventArgs e)
            {
    ((FrameworkElement)e.OriginalSource).DataContext);
            }

  5. #5
    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
    Dans ton converter, tu peux appeler une fonction de ton UserControl qui a pour but de créer le menu Contextuel.

    Sinon ta deuxième solution est pas mal : pour l'afficher, il faut faire ainsi :
    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
        private void Bd_MouseRightButtonDown( object sender, MouseButtonEventArgs e ) {
          ContextMenu ctmenu = new ContextMenu();
     
          MenuItem mi1 = new MenuItem();
          mi1.Header = "Menu 1";
          MenuItem mi2 = new MenuItem();
          mi2.Header = "Menu 2";
          MenuItem mi3 = new MenuItem();
          mi3.Header = "Menu 3";
     
          ctmenu.Items.Add( mi1 );
          ctmenu.Items.Add( mi2 );
          ctmenu.Items.Add( mi3 );
     
          ( (Border)sender ).ContextMenu = ctmenu;
        }
    En ayant donc ajouter dans le style du ListViewItem
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    MouseRightButtonDown="Bd_MouseRightButtonDown"

    [Edit] Trop tard... C'est une solution aussi

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

Discussions similaires

  1. définir un menu contextuel sur les items d'un treeview
    Par maa dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 05/05/2008, 19h51
  2. Menu contextuelle sur une liste?
    Par _developpeur_ dans le forum Access
    Réponses: 2
    Dernier message: 24/01/2006, 14h33
  3. Afficher un menu contextuelle sur le click droit d'une image
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/01/2006, 12h19
  4. Menu contextuel sur CStatic
    Par benahpets dans le forum MFC
    Réponses: 8
    Dernier message: 05/07/2005, 10h27
  5. [VB6] menu contextuel sur clique droit souris
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 08/07/2003, 11h07

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