Como posso alternar a visibilidade do menu principal usando a tecla Alt em WPF?
-
10-07-2019 - |
Pergunta
Eu gostaria que o menu principal em meu aplicativo WPF para se comportar como o menu principal no IE8:
- não é visível quando o aplicativo é iniciado
- pressionar e soltar Alt torna visível
- pressionar e soltar Alt novamente o torna invisível novamente
- repeat até entediado
Como posso fazer isso? Tem que ser um código?
Adicionado em resposta às respostas apresentadas, porque eu ainda estou tendo problemas:
Meu Shell code-behind agora se parece com isso:
public partial class Shell : Window
{
public static readonly DependencyProperty IsMainMenuVisibleProperty;
static Shell()
{
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.DefaultValue = false;
IsMainMenuVisibleProperty = DependencyProperty.Register(
"IsMainMenuVisible", typeof(bool), typeof(Shell), metadata);
}
public Shell()
{
InitializeComponent();
this.PreviewKeyUp += new KeyEventHandler(Shell_PreviewKeyUp);
}
void Shell_PreviewKeyUp(object sender, KeyEventArgs e)
{
if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
{
if (IsMainMenuVisible == true)
IsMainMenuVisible = false;
else
IsMainMenuVisible = true;
}
}
public bool IsMainMenuVisible
{
get { return (bool)GetValue(IsMainMenuVisibleProperty); }
set { SetValue(IsMainMenuVisibleProperty, value); }
}
}
Solução
Você pode usar o evento PreviewKeyDown
na janela. Para detectar a Alt chave que você terá que verificar a propriedade SystemKey
do KeyEventArgs
, ao contrário da propriedade chave que você usa normalmente para a maioria das outras chaves.
Você pode usar esse evento para definir um valor bool
que foi declarada como um DependencyProperty
no de trás de código do Windows.
propriedade Visibility
do menu pode então ser ligado a essa propriedade usando o BooleanToVisibilityConverter
.
<Menu
Visibility={Binding Path=IsMenuVisibile,
RelativeSource={RelativeSource AncestorType=Window},
Converter={StaticResource BooleanToVisibilityConverter}}
/>
Outras dicas
Eu tentaria olhando para manipular o evento PreviewKeyDown
em sua janela. Eu não tenho certeza se pressionando Alt desencadeia este evento ou não, mas se isso acontecer, então eu alternar uma bool
que é obrigado a visibilidade do menu principal da janela.
Se PreviewKeyDown
não funcionar, eu não tenho certeza o que mais tentar. Você poderia olhar para obter as mensagens reais do Windows enviadas para a janela, mas isso pode ficar confuso muito rapidamente.
Seria melhor usar GetKeyboardState
com VK_MENU
para lidar com ambos esquerda e direita Alt , para imitar o comportamento do IE Windows Explorer / (Vista +) você vai precisar para controlar o elemento anteriormente focado para armazenamento de foco, em uma prensa VK_MENU
enquanto o elemento focalizado está dentro do seu menu principal. Você também quer estar fazendo este trabalho em PreviewKeyUp
(não para baixo).
Eu deparei com esse problema sozinho. Eu tentei ligar para o evento PreviewKeyDown
, mas achei que fosse confiável. Em vez disso eu encontrei a classe InputManager
onde você pode ligar para o EnterMenuMode
a partir do código gerenciado. O gerente expõe dois eventos, para entrar e sair. O truque é não fechar o menu, mas defini-lo da altura do recipiente a zero quando é para ser escondido. Para mostrá-lo, simplesmente limpar o valor local e vai levar sua altura anterior.
Do meu controle do usuário TopMenu
:
public TopMenu()
{
InitializeComponent();
InputManager.Current.EnterMenuMode += OnEnterMenuMode;
InputManager.Current.LeaveMenuMode += OnLeaveMenuMode;
Height = 0;
}
private void OnLeaveMenuMode(object sender, System.EventArgs e)
{
Height = 0;
}
private void OnEnterMenuMode(object sender, System.EventArgs e)
{
ClearValue(HeightProperty);
}