Domanda

Vorrei che il menu principale nella mia app WPF si comportasse come il menu principale in IE8:

  • non è visibile all'avvio dell'app
  • premendo e rilasciando Alt lo rende visibile
  • premendo e rilasciando di nuovo Alt lo rende di nuovo invisibile
  • ripeti fino a annoiarsi

Come posso farlo? Deve essere un codice?

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

Il code-behind di Shell ora appare così:

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); }
    }
}
È stato utile?

Soluzione

È possibile utilizzare l'evento PreviewKeyDown nella finestra. Per rilevare la chiave Alt dovrai controllare la proprietà SystemKey del KeyEventArgs , al contrario della proprietà Key che normalmente usi per la maggior parte altre chiavi.

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

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

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

Altri suggerimenti

Proverei a gestire l'evento PreviewKeyDown sulla tua finestra. Non sono sicuro se la pressione di Alt attiva o meno questo evento, ma se lo fa, allora selezionerei un bool che è legato alla visibilità del menu principale della finestra.

Se PreviewKeyDown non funziona, non sono sicuro di cos'altro provare. Potresti cercare di ottenere gli attuali messaggi di Windows inviati alla tua finestra, ma questo potrebbe diventare molto disordinato.

Sarebbe meglio usare GetKeyboardState con VK_MENU per gestire sia Alt sia a destra che a sinistra, per imitare il comportamento di IE / Windows Explorer (Vista +) dovrai tenere traccia l'elemento precedentemente focalizzato per memorizzare lo stato attivo, su una stampante VK_MENU mentre l'elemento focalizzato si trova nel menu principale. Vuoi anche fare questo lavoro su PreviewKeyUp (non verso il basso).

Mi sono appena imbattuto in questo problema. Ho provato a collegarmi all'evento PreviewKeyDown , ma l'ho trovato inaffidabile. Invece ho trovato la classe InputManager dove puoi agganciare EnterMenuMode dal codice gestito. Il gestore espone due eventi, per entrare e uscire. Il trucco è non comprimere 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 utente 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top