2009-08-02 14 views
8

Me gustaría que el menú principal en mi aplicación WPF a comportarse como el menú principal en IE8:¿Cómo puedo alternar la visibilidad del menú principal con la tecla Alt en WPF?

  • no es visible cuando se inicia la aplicación
  • presionar y soltar Alt hace visible
  • presionando y Alt liberando de nuevo lo hace invisible una vez más
  • repetir hasta aburrido

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

añadido en respuesta a las respuestas enviadas, porque todavía estoy teniendo problemas:

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

Usted quiere imitar Internet Explorer ...? –

+0

Intento mantener mis aplicaciones consistentes con lo que esperan los usuarios, así que sí. :-) – serialhobbyist

+0

También podría ser responsable de la tecla F10 que desencadena el mismo comportamiento por coherencia. – genus

Respuesta

8

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

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

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

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

No puedo hacer que esto funcione. He actualizado la pregunta original con el código subyacente para DependencyProperty. Es la primera vez que declaro la mía así que ... He agregado su enlace al Menú en Shell.xaml y el error que recibo es: System.Windows.Data Error: 39: Error de ruta de BindingExpression : La propiedad 'IsMenuVisibile' no se encuentra en 'object' '' Shell '(Name =' ')'. BindingExpression: Path = IsMenuVisibile; DataItem = 'Shell' (Nombre = ''); El elemento objetivo es 'Menú' (Name = 'uxMainMenu'); la propiedad de destino es 'Visibilidad' (tipo 'Visibilidad'). ¿Algunas ideas? – serialhobbyist

+0

Este es el error de enlace estándar que obtiene cuando no se puede encontrar la propiedad. Para solucionarlo, debe reemplazar IsMenuVisible con IsMainMenuVisible en su enlace. –

+0

¡Oh, soy un idiota! Voy a iniciar sesión y solucionarlo. Gracias. Y gracias por no señalar lo grueso que soy. :-) – serialhobbyist

1

que lo intentaría mirar en el manejo de la PreviewKeyDown evento en su 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.

+0

Gracias por la sugerencia. Voy con la sugerencia de Phil Price de PreviewKeyUp porque está más cerca de IE pero por lo demás parece factible. – serialhobbyist

1

Sería mejor utilizar GetKeyboardState con VK_MENU para manejar tanto la izquierda y la derecha Alt, para imitar el comportamiento del Explorador IE/Windows (Vista +) que necesita para realizar el seguimiento del elemento previamente enfocado para almacenar Enfoque, en una VK_MENU presione mientras el elemento enfocado se encuentra dentro de su menú principal. También desea hacer este trabajo en PreviewKeyUp (no hacia abajo).

+0

Gracias. ¡En el momento, ni siquiera puedo aprender lo básico, así que dejo cosas de WM por un tiempo! – serialhobbyist

1

Acabo de encontrarme con este problema. Intenté conectarme al evento PreviewKeyDown, pero me pareció poco confiable. En cambio, encontré la clase InputManager donde puede enganchar en el EnterMenuMode del 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 TopMenu usuario:

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); 
} 
Cuestiones relacionadas