Nella mia applicazione, voglio consentire agli utenti di personalizzare le scorciatoie da tastiera, proprio come è fatto nelle opzioni della tastiera di Visual Studio. L'utente può mettere a fuoco una casella di testo vuota e quindi digitare qualsiasi collegamento che desidera assegnare a un comando.Come si legge la scorciatoia da tastiera personalizzata dall'utente in WPF?
Il più vicino Sono venuto per farlo funzionare è mediante la sottoscrizione per l'evento TextBox.PreviewKeyDown, impostandola come gestito per impedire l'immissione di testo attuale nella casella di testo. Quindi ignoro gli eventi KeyDown associati ai tasti modificatori (esiste un modo più semplice per determinare se una chiave è un tasto modificatore?).
// Code-behind
private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
// The text box grabs all input
e.Handled = true;
if (e.Key == Key.LeftCtrl ||
e.Key == Key.RightCtrl ||
e.Key == Key.LeftAlt ||
e.Key == Key.RightAlt ||
e.Key == Key.LeftShift ||
e.Key == Key.RightShift)
return;
string shortcutText = "";
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
shortcutText += "Ctrl+";
if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
shortcutText += "Shift+";
if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
shortcutText += "Alt+";
_ShortcutTextBox.Text = shortcutText + e.Key.ToString();
}
I lavori di cui sopra per qualsiasi collegamento a partire da Ctrl e Ctrl + Maiusc, ma non riesce per qualsiasi scorciatoie Alt. L'e.Key è sempre impostato su Key.System
quando premo un collegamento contenente Alt.
Come posso registrare i tasti di scelta rapida Alt dall'utente? Esiste un modo migliore e più robusto per registrare le scorciatoie da parte dell'utente?
Ho la sensazione che il tasto Alt sia utilizzato da WPF per tentare di catturare una combinazione di tasti Alt per mettere a fuoco un controllo che è legato a un'etichetta con una scorciatoia mnemonica (come Alt + F per il menu _File o Alt + O per un pulsante _OK). Forse c'è un modo per prevenirlo o annullarlo? –