2009-08-02 21 views
8

mi piacerebbe il menu principale nel mio WPF app per comportarsi come il menu principale in IE8:Come posso attivare la visibilità del menu principale utilizzando il tasto Alt in WPF?

  • non è visibile quando l'applicazione inizia
  • premendo e rilasciando Alt rende visibile
  • premuto rilasciando Alt ancora rende invisibile nuovo
  • ripetere fino annoiato

Come posso fare questo? Deve essere il codice?

Aggiunto in risposta alle risposte presentate, perché sto ancora problemi:

mio guscio code-behind ora assomiglia a questo:

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

Si vuole imitare Internet Explorer ...? –

+0

Cerco di mantenere le mie app coerenti con ciò che gli utenti si aspettano, quindi sì. :-) – serialhobbyist

+0

Potrebbe anche rendere conto del tasto F10 attivando lo stesso comportamento per coerenza. – genus

risposta

8

È possibile utilizzare l'evento PreviewKeyDown nella finestra. Per rilevare la chiave Alt è necessario verificare la proprietà SystemKey di KeyEventArgs, in contrasto con la proprietà Chiave che si utilizza normalmente per la maggior parte delle altre chiavi.

È possibile utilizzare questo evento per impostare un valore bool che è stato dichiarato come DependencyProperty nel codice di Windows.

La proprietà Visibility del menu può quindi essere associata a questa proprietà utilizzando BooleanToVisibilityConverter.

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

Non riesco a farlo funzionare. Ho aggiornato la domanda originale con il code-behind per DependencyProperty. È la prima volta che dichiaro il mio così ... Ho aggiunto il binding al Menu in Shell.xaml e l'errore che sto ottenendo è: Errore System.Windows.Data: 39: Errore percorso BindingExpression : Proprietà 'IsMenuVisibile' non trovata su 'object' '' Shell '(Name =' ')'. BindingExpression: Path = IsMenuVisibile; DataItem = 'Shell' (Name = ''); l'elemento target è 'Menu' (Name = 'uxMainMenu'); la proprietà target è "Visibility" (tipo "Visibility"). Qualche idea? – serialhobbyist

+0

Questo è l'errore di associazione standard che si ottiene quando non è possibile trovare la proprietà. Per risolvere il problema è necessario sostituire IsMenuVisible con IsMainMenuVisible nell'associazione. –

+0

Oh, sono un tale idiota! Effettuerò il login e lo risolverò. Grazie. E grazie per non aver sottolineato quanto sono folto. :-) – serialhobbyist

1

mi piacerebbe provare esaminando la gestione della PreviewKeyDown evento sulla tua finestra. Non sono sicuro che se si preme Alt si attiva o meno questo evento, ma se lo fa, quindi selezionerei uno bool che è associato alla visibilità del menu principale della finestra.

Se PreviewKeyDown non funziona, non sono sicuro di cos'altro provare. Potresti esaminare i veri messaggi di Windows inviati alla tua finestra, ma questo potrebbe diventare molto veloce.

+0

Grazie per il suggerimento. Vado con il suggerimento di Phil Price di PreviewKeyUp perché è più vicino a IE, ma per il resto sembra fattibile. – serialhobbyist

1

Sarebbe meglio usare GetKeyboardState con VK_MENU per gestire sia a destra ea sinistra Alt, per simulare il comportamento di IE/Esplora risorse di Windows (Vista +) è necessario monitorare l'elemento precedentemente focalizzata per memorizzare focus, su una stampa VK_MENU mentre l'elemento focalizzato si trova nel menu principale. Vuoi anche fare questo lavoro su PreviewKeyUp (non giù).

+0

Grazie. Al mo, non riesco nemmeno a capire le basi, quindi lascerò le cose WM per un po '! – serialhobbyist

1

Mi sono imbattuto in questo problema. Ho provato ad agganciare l'evento PreviewKeyDown, ma l'ho trovato inaffidabile. Invece ho trovato la classe InputManager in cui è possibile collegarsi allo EnterMenuMode dal codice gestito. Il gestore espone due eventi, per entrare e uscire. Il trucco è non chiudere il menu, ma impostare l'altezza del contenitore su zero quando deve essere nascosto. Per mostrarlo, cancella semplicemente il valore locale e prenderà la sua altezza precedente.

Dal mio controllo TopMenu utente:

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); 
} 
Problemi correlati