toolbartray menus icon desplegable contextual context wpf menu keyboard-shortcuts toggle visibility

menus - toolbartray wpf



¿Cómo puedo alternar la visibilidad del menú principal usando la tecla Alt en WPF? (4)

Me encontré con este problema yo mismo. Intenté conectarme al evento PreviewKeyDown , pero encontré que no era confiable. En su lugar, encontré la clase InputManager en la que puede enganchar el EnterMenuMode desde el código administrado. El administrador expone dos eventos, para ingresar y salir. El truco es no colapsar el menú, pero establecer su altura del contenedor a 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); }

Me gustaría que el menú principal en mi aplicación WPF se comporte como el menú principal en IE8:

  • no es visible cuando se inicia la aplicación
  • presionar y soltar Alt lo hace visible
  • al presionar y soltar Alt otra vez, vuelve a ser invisible
  • repetir hasta aburrir

¿Cómo puedo hacer esto? ¿Tiene que ser código?

Se agregó en respuesta a las respuestas enviadas, porque todavía tengo problemas:

Mi código subyacente de My 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); } } }


Puede usar el evento PreviewKeyDown en la ventana. Para detectar la tecla Alt , deberá verificar la propiedad SystemKey de KeyEventArgs , en contraposición a la propiedad Key que normalmente usa para la mayoría de las demás teclas.

Puede usar este evento para establecer un valor bool que haya sido declarado como DependencyProperty en el código de Windows detrás.

La propiedad Visibility del menú puede vincularse a esta propiedad usando BooleanToVisibilityConverter .

<Menu Visibility={Binding Path=IsMenuVisibile, RelativeSource={RelativeSource AncestorType=Window}, Converter={StaticResource BooleanToVisibilityConverter}} />


Sería mejor usar GetKeyboardState con VK_MENU para manejar tanto Alt izquierda como derecha, para imitar el comportamiento de IE / Windows Explorer (Vista +) necesitarás rastrear el elemento previamente enfocado para almacenar foco, en una prensa VK_MENU mientras VK_MENU elemento está dentro de su menú principal. También quiere hacer este trabajo en PreviewKeyUp (no hacia abajo).


PreviewKeyDown evento PreviewKeyDown en tu ventana. No estoy seguro si presionar Alt desencadena este evento o no, pero si lo hace, entonces alternaré 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ápido.