WPF nasconde MenuItem su ContextMenu in base alla proprietà dell'oggetto
-
20-08-2019 - |
Domanda
Devo mostrare / nascondere a livello di codice un MenuItem, quale sarebbe il modo migliore per farlo?
Soluzione
Bene, per aggiungere un MenuItem avrai bisogno di qualcosa del genere:
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);
(ma probabilmente hai già questo).
Avrai bisogno di un modo per legare la voce di menu alla proprietà, ma senza vedere la tua applicazione non posso davvero suggerire il modo migliore. C'è la proprietà Tag che memorizza un oggetto; la proprietà Uid che memorizza una stringa; la proprietà Name che memorizza anche una stringa.
Mentre:
menuItem.Visibility = Visibility.Visible;
e
menuItem.Visibility = Visibility.Collapsed;
dovrebbe attivare / disattivare la visibilità dell'elemento.
MODIFICA: L'uso di Collapsed nasconderà la voce di menu e non riserverà spazio nel menu - in realtà non vuoi spazi vuoti in un menu contestuale. (grazie a Botz3000 per questo)
Quindi, nel tuo codice in cui viene modificato il valore della proprietà, troverai la voce di menu che desideri mostrare / nascondere usando il collegamento che ho descritto sopra. Una volta che hai l'oggetto puoi cambiarne il valore:
menuItem.Visibility = menuItem.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
Altri suggerimenti
Sei sicuro di voler nascondere MenuItem
? È più comune disabilitarlo, usando il framework di comando di 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 utilizzerà il bool
risultato di Save_CanExecute
per determinare se il comando <=> può attualmente essere eseguito e abilitare / disabilitare <=> di conseguenza.