Una forma es agregar sus teclas de acceso directo a los comandos en sí mismos InputGestures
. Los comandos se implementan comoRoutedCommands
.
Esto permite que las teclas de acceso directo funcionen incluso si no están conectadas a ningún control. Y dado que los elementos del menú comprenden los gestos del teclado, mostrarán automáticamente su tecla de acceso directo en el texto de los elementos del menú, si conecta ese comando a su elemento del menú.
Cree un atributo estático para contener un comando (preferiblemente como una propiedad en una clase estática que cree para los comandos, pero para un ejemplo simple, simplemente usando un atributo estático en window.cs):
public static RoutedCommand MyCommand = new RoutedCommand();
Agregue las teclas de acceso directo que deberían invocar el método:
MyCommand.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control));
Cree un enlace de comando que apunte a su método para ejecutar. Ponga esto en los enlaces de comando para el elemento de la interfaz de usuario bajo el cual debería funcionar (por ejemplo, la ventana) y el método:
<Window.CommandBindings>
<CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/>
</Window.CommandBindings>
private void MyCommandExecuted(object sender, ExecutedRoutedEventArgs e) { ... }
Executed
código para el comando terminará en el código subyacente (de la ventana o el control del usuario) en lugar del modelo de vista, en lugar de usar un comando habitual (ICommand
implementación personalizada ).Encontré que esto era exactamente lo que estaba buscando en relación con la vinculación de teclas en WPF:
Ver publicación de blog MVVM CommandReference y KeyBinding
fuente
Prueba este código ...
Primero cree un objeto RoutedComand
fuente
Depende de dónde quieras usarlos.
TextBoxBase
controles controlados ya implementan esos atajos. Si desea utilizar métodos abreviados de teclado personalizados, debe echar un vistazo a los comandos y los gestos de entrada. Aquí hay un pequeño tutorial de Switch on the Code : Tutorial de WPF : enlaces de comandos y comandos personalizadosfuente
Documentar esta respuesta para otros, ya que hay una manera mucho más simple de hacer esto que rara vez se menciona y que no requiere tocar el XAML.
Para vincular un atajo de teclado, en el constructor de Windows simplemente agregue un nuevo KeyBinding a la colección InputBindings. Como comando, pase su clase de comando arbitrario que implementa ICommand. Para el método de ejecución, simplemente implemente la lógica que necesite. En mi ejemplo a continuación, mi clase WindowCommand toma un delegado que se ejecutará cada vez que se invoque. Cuando construyo el nuevo WindowCommand para pasar con mi enlace, simplemente indico en mi inicializador, el método que quiero que ejecute el WindowCommand.
Puede usar este patrón para crear sus propios atajos rápidos de teclado.
Cree una clase WindowCommand simple que tome un delegado de ejecución para disparar cualquier método establecido en ella.
fuente
Tuve un problema similar y encontré que la respuesta de @ aliwa era la solución más útil y más elegante; sin embargo, necesitaba una combinación de teclas específica, Ctrl+ 1. Lamentablemente recibí el siguiente error:
Con un poco de búsqueda adicional, modifiqué la respuesta de @ aliwa a lo siguiente:
Encontré que esto funciona muy bien para cualquier combinación que necesitaba.
fuente
<UserControl.InputBindings> <KeyBinding Gesture="Enter" Command="{Binding someCommand}"/> </UserControl.InputBindings>
VB.NET:
Dentro del evento cargado :
No se necesita XAML.
fuente
Aunque las respuestas principales son correctas, personalmente me gusta trabajar con propiedades adjuntas para permitir que la solución se aplique a cualquiera
UIElement
, especialmente cuandoWindow
no conoce el elemento que debe enfocarse. En mi experiencia, a menudo veo una composición de varios modelos de vista y controles de usuario, donde la ventana a menudo no es más que el contenedor raíz.Retazo
Con esta propiedad adjunta puede definir un acceso directo de foco para cualquier UIElement. Registrará automáticamente el enlace de entrada en la ventana que contiene el elemento.
Uso (XAML)
Código fuente
La muestra completa, incluida la implementación de FocusElementCommand, está disponible como gist: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d
Descargo de responsabilidad: puede usar este código en todas partes y de forma gratuita. Tenga en cuenta que esta es una muestra que no es adecuada para un uso intensivo. Por ejemplo, no hay recolección de basura de elementos eliminados porque el comando tendrá una fuerte referencia al elemento.
fuente
Cómo asociar el comando con un
MenuItem
:fuente