¿Cómo puedo alternar la visibilidad del menú principal con la tecla Alt en WPF?
-
10-07-2019 - |
Pregunta
Me gustaría que el menú principal de mi aplicación WPF se comportara como el menú principal en IE8:
- no es visible cuando se inicia la aplicación
- presionar y soltar Alt lo hace visible
- presionar y soltar Alt nuevamente lo vuelve invisible nuevamente
- repetir hasta aburrirse
¿Cómo puedo hacer esto? ¿Tiene que ser código?
Agregado en respuesta a las respuestas enviadas, porque todavía tengo problemas:
Mi código subyacente de Shell ahora se ve así:
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); }
}
}
Solución
Puede usar el evento PreviewKeyDown
en la ventana. Para detectar la clave Alt , deberá verificar la propiedad SystemKey
de KeyEventArgs
, en lugar de la propiedad Key que normalmente usa para la mayoría otras teclas.
Puede usar este evento para establecer un valor bool
que se ha declarado como DependencyProperty
en el código de Windows que se encuentra detrás.
La propiedad Visibility
del menú se puede vincular a esta propiedad utilizando el BooleanToVisibilityConverter
.
<Menu
Visibility={Binding Path=IsMenuVisibile,
RelativeSource={RelativeSource AncestorType=Window},
Converter={StaticResource BooleanToVisibilityConverter}}
/>
Otros consejos
Intentaría analizar cómo manejar el evento PreviewKeyDown
en su ventana. No estoy seguro de si presionar Alt activa este evento o no, pero si lo hace, entonces alternaría un bool
que está vinculado a la visibilidad del menú principal de la ventana.
Si PreviewKeyDown
no funciona, no estoy seguro de qué más probar. Podrías buscar los mensajes reales de Windows enviados a tu ventana, pero eso podría complicarse muy rápidamente.
Sería mejor usar GetKeyboardState
con VK_MENU
para manejar tanto Alt izquierdo como derecho, para imitar el comportamiento de IE / Windows Explorer (Vista +) que necesitará rastrear el elemento enfocado previamente para almacenar el foco, presione VK_MENU
mientras el elemento enfocado está dentro de su menú principal. También desea realizar este trabajo en PreviewKeyUp
(no hacia abajo).
Acabo de encontrarme con este problema. Intenté conectarme al evento PreviewKeyDown
, pero descubrí que no era confiable. En su lugar, encontré la clase InputManager
donde puede engancharse al EnterMenuMode
desde el código administrado. El gerente expone dos eventos, para entrar y salir. El truco es no contraer el menú, sino establecer la altura del contenedor en cero cuando se va a ocultar. Para mostrarlo, simplemente borre el valor local y tomará su altura anterior.
Desde mi control de usuario 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);
}