Bonjour,j'ai un bouton qui ouvre un menu contextuel, et je voudrais sur l'évènement click d'un menuItem du menucontextuel, pouvoir modifier les propriétés du bouton, tout ça dans le code behind.
Merci
Bonjour,j'ai un bouton qui ouvre un menu contextuel, et je voudrais sur l'évènement click d'un menuItem du menucontextuel, pouvoir modifier les propriétés du bouton, tout ça dans le code behind.
Merci
Quel est ton scénario d'utilisation ?
Sinon il suffit dans l'event-handler du click du menu contextuel d'utiliser ton bouton si tu lui as assigné un nom.
Mon scenario: je crée dynamiquement un controle (un bouton par exemple), et je voudrais par un click sur un item du menu contextuel, modifier les propriétés de ce controle ajouté en cours d'utilisation (changer la couleur du bouton par exemple).
Au moment où tu crées ton menu contextuel, tu peut peut-être assigner la propriété DataContext (ou Tag) de ton menu contextuel avec ton bouton :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ContextMenu ctMenu = new ContextMenu(); MenuItem mi = new MenuItem(); mi.Header = "Changer couleur"; mi.Tag = button; mi.Click += new RoutedEventHandler(miChangeCouleur_Click); ctMenu.Items.Add(mi);
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 private void miChangeCouleur_Click(object sender, RoutedEventArgs e) { Button btn = (Button)((MenuItem)sender).Tag; // travail sur le bouton }
Voilà le truc: j'ai défini mon menu contextuel dans les ressources (un dictionnaire de ressources plus précisément).
Ensuite toujours dans ce dictionnaire de ressources j'attribue ce contextMenu à tous les boutons à travers un style.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <ContextMenu x:Key="configCtxtMenu" x:Shared="false" > <MenuItem Click="subModif" Header="Modifier " /> <MenuItem Header="Supprimer" Click="subSuppr"/> </ContextMenu>
Je ne peux donc pas utiliser la propriété Tag du menuItem dans le code XAML, vu que les boutons en question ne sont pas encore créés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <Style TargetType="Button"> <Setter Property="ContextMenu" Value="{StaticResource configCtxtMenu}"/> </Style>
Mon idée était de pouvoir modifier n'importe lequel de ces boutons ajoutés en cours d'exécution. c'est pourquoi je voulais exploiter le sender de l'évènement click du menuItem. Seulement à partir de ce sender je n'arrive pas à remonter jusqu'au controle par rapport auquel le contextMenu est positionné.
J'espère que cette fois-ci ma préoccupation est un peu plus claire, j'ai souvent un peu de mal à me faire comprendre de prime abord![]()
Salut,
C'est peut être risqué, mais le PlacementTarger de ton ContextMenu ne serait-il pas ton bouton ?
@+
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 private void subModif(object sender, RoutedEventArgs e) { DependencyObject dObj = VisualTreeHelper.GetParent(sender as MenuItem); while (dObj.GetType() != typeof(ContextMenu) && dObj != null) dObj = VisualTreeHelper.GetParent(dObj); if (dObj != null) { ContextMenu cm = dObj as ContextMenu; if(cm.PlacementTarget != null && cm.PlacementTarget.GetType() == typeof(Button)) Button b = cm.PlacementTarget as Button; // traitement } }
J'ai essayé ton code thelpi et ça marche. Jusqu'ici y a aucun risque.
Merci pour le tuyau
Pas vraiment un risque, c'est juste que je n'étais pas sur que le PlacementTarget soit bien le bouton...
Pense au tag!
@+
Partager