WPF masquer MenuItem sur ContextMenu en fonction de la propriété de l'objet
-
20-08-2019 - |
Question
Je dois afficher / masquer un élément de menu par programmation, quel serait le meilleur moyen de le faire?
La solution
Eh bien, pour ajouter un MenuItem, vous avez besoin de quelque chose du genre:
var menuItem = new MenuItem() { Header = "Menu Name", Name = "Identifier", IsCheckable = true, IsChecked = visible };
menuItem.Click += new RoutedEventHandler(contextMenu_onClick);
int position = contextMenu.Items.Add(menuItem);
(mais vous avez probablement déjà cela).
Vous aurez besoin d'un moyen de lier l'élément de menu à la propriété - mais sans voir votre application, je ne peux pas vraiment vous suggérer le meilleur moyen. Il y a la propriété Tag qui stocke un objet; la propriété Uid qui stocke une chaîne; la propriété Name qui stocke également une chaîne.
Alors que:
menuItem.Visibility = Visibility.Visible;
et
menuItem.Visibility = Visibility.Collapsed;
doit basculer la visibilité de l'élément.
MODIFIER: L'utilisation de Réduit masque l'élément de menu et ne réserve pas d'espace dans le menu - vous ne voulez pas vraiment d'espaces vides dans un menu contextuel. (merci à Botz3000 pour cela)
Ensuite, dans votre code où la valeur de la propriété est modifiée, vous trouverez l'élément de menu que vous souhaitez afficher / masquer à l'aide du lien que j'ai décrit ci-dessus. Une fois que vous avez l'élément, vous pouvez changer sa valeur:
menuItem.Visibility = menuItem.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
Autres conseils
Êtes-vous sûr de vouloir masquer le MenuItem
? Il est plus courant de le désactiver, à l'aide de la structure de commande de WPF:
<MenuItem Header="_MenuName" Command="{x:Static local:MyCommands.SomeCommand}" />
...
<!-- In the menu item or any of its ancestors: -->
<SomeControl.CommandBindings>
<CommandBinding Command="{x:Static local:MyCommands.SomeCommand}" Executed="Save_Executed" CanExecute="Save_CanExecture" />
</SomeControl.CommandBindings>
WPF utilisera le bool
résultat de Save_CanExecute
pour déterminer si la commande <=> peut actuellement être exécutée et activer / désactiver le <=> en conséquence.