WPF hide MenuItem no menu de contexto com base na propriedade do objeto
-
20-08-2019 - |
Pergunta
Eu preciso mostrar programaticamente / esconder um MenuItem, o que seria a melhor maneira de fazer isso?
Solução
Bem, para adicionar um MenuItem você vai precisar de algo ao longo destas linhas:
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);
(mas você provavelmente já tem isso).
Você vai precisar de alguma forma de amarrar o item de menu para a propriedade - mas sem ver o seu aplicativo eu realmente não posso sugerir o melhor caminho. Há a propriedade Tag que armazena um objeto; a propriedade UID que armazena uma string; a propriedade nome que também armazena uma string.
Enquanto:
menuItem.Visibility = Visibility.Visible;
e
menuItem.Visibility = Visibility.Collapsed;
deve alternar a visibilidade do item.
EDIT: Usando Collapsed vai esconder o item de menu e espaço não reserva no menu - você realmente não quer espaços em branco em um menu de contexto. (graças a Botz3000 para isso)
Então, em seu código onde o valor da propriedade é alterado você vai encontrar o item de menu que você deseja para exibir / ocultar utilizando a ligação que eu descrevi acima. Depois de ter o item que você pode mudá-lo de valor:
menuItem.Visibility = menuItem.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
Outras dicas
Você tem certeza que deseja ocultar o MenuItem
? É mais comum para desativá-lo, usando a estrutura de comando do 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 usará o resultado bool
de Save_CanExecute
para determinar se o comando do MenuItem
atualmente pode executar e ativar / desativar o MenuItem
em conformidade.