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); }
    }
}
¿Fue útil?

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top