En mi aplicación, quiero permitir a los usuarios personalizar los atajos de teclado, al igual que en las opciones de teclado de Visual Studio. El usuario puede enfocar un cuadro de texto en blanco y luego escribir cualquier acceso directo que quiera asignar a un comando.¿Cómo leo el atajo de teclado personalizado del usuario en WPF?
Lo más cerca que he llegado a hacerlo funcionar es suscribiéndome al evento TextBox.PreviewKeyDown, configurándolo como manejado para evitar el ingreso de texto real en el cuadro de texto. Luego ignoro los eventos KeyDown asociados con las teclas modificadoras (¿hay alguna manera más clara de determinar si una clave es una tecla modificadora?).
// 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();
}
Los trabajos anteriores para cualquier acceso directo a partir de Ctrl + Shift y Ctrl, pero falla por cualquier atajo Alt. La tecla e. Siempre se establece en Key.System
cuando presiono un atajo que contiene Alt.
¿Cómo puedo grabar accesos directos alternativos del usuario? ¿Hay alguna manera mejor y más sólida de grabar accesos directos desde el usuario?
Tengo la sensación de que la tecla Alt es utilizada por WPF para intentar capturar un combo de tecla Alt para enfocar un control que está vinculado a una etiqueta con un atajo mnemónico (como Alt + F para el menú _File, o Alt + O para un botón _OK). Tal vez hay una manera de prevenir o anular eso? –