2010-08-26 39 views
6

Actualmente utilizo el evento onKeyDown y un estado de if/else para crear atajos de teclado:Atajos de teclado

if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift && e.Key == Key.Tab) { 

} else if (e.Key == Key.Tab) { 

} ... 

Sin embargo, si tengo bastantes más atajos de teclado, esto se complica.

¿Hay una mejor implementación?

Respuesta

17

Usted debe mirar la implementación <CommandBindings> y <InputBindings>:

<Window.CommandBindings> 
    <CommandBinding Command="Settings" CanExecute="SettingsCanExecute" Executed="SettingsExecuted" /> 
</Window.CommandBindings> 

<Window.InputBindings> 
    <KeyBinding Command="Settings" Key="S" Modifiers="Alt" /> 
</Window.InputBindings> 

Su <Button> entonces se convierte en:

<Button Height="50" Width="50" Margin="50,5,0,0" Command="Settings" /> 

El método SettingsCanExecute determina cuándo se activa el botón y el método SettingsExecuted se llama cuando el botón se presiona o se golpea la combinación de teclas.

No necesita el controlador KeyDown.

Hay un full tutorial en Cambiar el código.

Puede encontrar más información en CommandBindings y InputBindings en MSDN.

+0

hmm ... cuando intenté '

+0

No estoy seguro de si me perdí algo en el tutorial. pero mirando el código de demostración de [John Smith en WPF: Entendiendo los comandos enrutados] (http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/) creo que necesito crear una propiedad en una clase luego referencia en el código ... [Snipplr Code Snipplet] (http://snipplr.com/view/39602/cwpf-routed-commands/) –

1

Documentando esta respuesta para otros, ya que hay una forma mucho más simple de hacer esto que rara vez se menciona, y no requiere tocar el XAML en absoluto.

Para vincular un atajo de teclado, en el constructor de Windows simplemente agregue un nuevo enlace de clave a la colección InputBindings. Como comando, pase su clase de comando arbitraria 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 de WindowCommand toma un delegado que ejecutará siempre que se invoque. Cuando construyo el nuevo WindowCommand para pasar con mi enlace, simplemente indico en mi inicializador, el método que quiero que WindowCommand ejecute.

Puede usar este patrón para crear sus propios atajos rápidos de teclado.

public YourWindow() //inside any WPF Window constructor 
{ 
    ... 
    //add this one statement to bind a new keyboard command shortcut 
    InputBindings.Add(new KeyBinding(//add a new key-binding, and pass in your command object instance which contains the Execute method which WPF will execute 
     new WindowCommand(this) 
     { 
     ExecuteDelegate = TogglePause //REPLACE TogglePause with your method delegate 
     }, new KeyGesture(Key.P, ModifierKeys.Control))); 
    ... 
} 

Crea una clase simple de WindowCommand que toma un delegado de ejecución para disparar cualquier método establecido en él.

+3

Una de las ideas centrales detrás de WPF era evitar tener que tocar el código detrás. El programa WPF/MVVM ideal tiene cerca de 0 líneas de código. Si bien funciona bien, no es una buena práctica. – Christopher

+0

Interesante. Tienes una referencia para eso? Nunca antes lo había visto impreso, pero si es cierto, sería bueno saberlo. ¡Gracias! –

+0

Cada uno de los ejemplos de aprendizaje de MVVM que conozco crea un modelo de visualización. Crea una instancia de ese modelo en el XAML. Y mantiene el código detrás tan barebones como sea humanamente posible. Todo lo que tiene que escribir en el código subyacente está vinculado a esa vista específica por definición. Y la arbitrariedad de la vista es un concepto fundamental en MVVM. También mi profesor de matemáticas solía decir "Los matemáticos son escritores perezosos: cuanto más escriben, más pueden cometer errores". Lo aplico a la programación completa. – Christopher

Cuestiones relacionadas