2009-08-23 30 views
6

En la aplicación WPF actualmente estoy intentando vincular un comando para iniciar una herramienta de calculadora en cualquier lugar de la aplicación usando teclas de método abreviado, he creado un comando pero no obtengo cómo asignar comandos y teclas de método abreviado para crear teclas de método abreviado universales en mi aplicación. Gracias de antemano.Teclas de acceso directo a nivel de aplicación en WPF

Respuesta

5

Usted puede hacer esto en XAML - véase el ejemplo en la documentación de la clase KeyBinding:

<Window.InputBindings> 
    <KeyBinding Command="ApplicationCommands.Open" 
       Gesture="CTRL+R" /> 
</Window.InputBindings> 

Actualización: Parece que en realidad no puede enlazar un KeyBinding a un modelo de vista XAML usando sólo si' re usando MVVM: mira aquí Keybinding a RelayCommand.

+1

¿Quiere decir XAML en lugar de MXML? Creo que MXML es para Flex. – Andy

+1

Vaya, sí, lo hago! ¡Demasiadas tecnologías en mi cabeza! Reparado, gracias. – Grokys

7

CommandManager quiere utilizar el control enfocado como punto de partida para enrutar todos los enlaces de entrada.

He escrito un Comportamiento que le permite vincular fácilmente teclas de atajo globales para cualquier control usando RoutedCommand (WPF estándar) e ICommand (estilo MVVM).

WPF Behavior: Global Application Shortcut Keys

+0

Hola, el enlace de descarga no funciona. ¿Podría actualizar esto con el enlace de trabajo? – Elangesh

3

En WPF con el fin de utilizar los atajos que hay que centrarse cada controlador. Sin embargo, con InputManager puede capturar todo tipo de entradas de su aplicación. Aquí no necesita tener foco en el controlador respectivo.

Primero tienes que subscribir el evento.

InputManager.Current.PreProcessInput -= Current_PreProcessInput; 
InputManager.Current.PreProcessInput += Current_PreProcessInput; 

Entonces,

private void Current_PreProcessInput(object sender, PreProcessInputEventArgs args) 
    { 
     try 
     { 
      if (args != null && args.StagingItem != null && args.StagingItem.Input != null) 
      { 
       InputEventArgs inputEvent = args.StagingItem.Input; 

       if (inputEvent is KeyboardEventArgs) 
       { 
        KeyboardEventArgs k = inputEvent as KeyboardEventArgs; 
        RoutedEvent r = k.RoutedEvent; 
        KeyEventArgs keyEvent = k as KeyEventArgs; 

        if (r == Keyboard.KeyDownEvent) 
        { 
        } 

        if (r == Keyboard.KeyUpEvent) 
        { 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

como no se puede filtrar todo el material no deseado y obtener la entrada requerida. Como se trata de una aplicación de captura de atajos, solo tomé el evento KeyDown y KeyUp.

También puede obtener todos los detalles de la tecla que se presiona

keyEvent.Key.ToString() 
Cuestiones relacionadas