2009-08-23 15 views
6

Nell'applicazione WPF sto cercando di associare un comando per avviare una forma di strumento della calcolatrice in qualsiasi punto dell'applicazione utilizzando i tasti di scelta rapida, ho creato un comando ma non ho ottenuto come mappare comandi e tasti di scelta rapida per creare tasti di scelta rapida universali nella mia applicazione. Grazie in anticipo.Tasti di scelta rapida del livello applicazione in WPF

risposta

5

È possibile farlo in XAML - vedere l'esempio nella documentazione per la classe KeyBinding:

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

Aggiornamento: Sembra che non si può effettivamente associare una combinazione di tasti per un ViewModel utilizzando solo XAML se' usando MVVM: vedi qui Keybinding a RelayCommand.

+1

Vuoi dire XAML, piuttosto che MXML? Penso che MXML sia per Flex. – Andy

+1

Oops, si lo faccio! Troppe tecnologie nella mia testa! Risolto, grazie. – Grokys

7

Il CommandManager desidera utilizzare il controllo focalizzato come punto di partenza per il routing di tutti i collegamenti di input.

Ho scritto un comportamento che consente di associare facilmente i tasti di scelta rapida globali per qualsiasi controllo utilizzando RoutedCommand (standard WPF) e ICommand (stile MVVM).

WPF Behavior: Global Application Shortcut Keys

+0

Salve, il collegamento per il download non funziona. Potresti aggiornare questo con il link di lavoro? – Elangesh

3

In WPF, al fine di utilizzare le scorciatoie è necessario concentrarsi rispettivo controllore. Tuttavia con InputManager puoi acquisire tutti i tipi di input della tua applicazione. Qui non è necessario concentrarsi sul rispettivo controller.

Per prima cosa devi iscrivere l'evento.

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

Poi,

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) 
     { 

     } 
    } 

come non è possibile filtrare tutte le cose indesiderate e ottenere l'ingresso desiderato. Poiché si tratta di un'applicazione di acquisizione rapida, ho preso solo l'evento KeyDown e KeyUp.

È inoltre possibile ottenere tutti i dettagli del tasto premuto

keyEvent.Key.ToString() 
Problemi correlati