В моем приложении я хочу, чтобы пользователи настраивали быстрые клавиши, как это делалось в настройках клавиатуры Visual Studio. Пользователь может сфокусировать пустое текстовое поле, а затем ввести любой ярлык, который он хочет назначить команде.
Ближайшим я пришел, чтобы заставить его работать, подписавшись на событие TextBox.PreviewKeyDown, установив его как обработанный, чтобы предотвратить фактический ввод текста в текстовое поле. Затем я игнорирую события KeyDown, связанные с ключами-модификаторами (есть ли более чистый способ определить, является ли ключ ключ-модификатор?).
// 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();
}
Вышеуказанное работает для любого сочетания клавиш, начинающегося с Ctrl и Ctrl + Shift, но сбой для любых комбинаций клавиш Alt. E.Key всегда устанавливается на Key.System
, когда я нажимаю ярлык, содержащий Alt.
Как я могу записать быстрые клавиши Alt у пользователя? Есть ли лучший, более надежный способ записи ярлыков с пользователя?