Come posso attivare la visibilità del menu principale usando il tasto Alt in WPF?
-
10-07-2019 - |
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); }
}
}
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);
}