2009-09-25 26 views
8

Estoy tratando de ejecutar comandos basados ​​en pulsaciones de teclas en Silverlight. Como entiendo, no puedes usar AccessKey o AcceleratorKey en Silverlight. También parece que la útil propiedad adjunta InputBindings tampoco es útil.Comandos de teclas rápidas para Silverlight en MVVM?

Empecé a buscar en otros lugares. Parecía que Prism era la forma de hacer que los comandos funcionaran en Silverlight, así que lo verifiqué. Sin embargo, solo tienen un controlador de Click, que ni siquiera es un punto de inicio útil para configurar los comandos de teclado.

¿Estoy perdiendo parte de Prism? ¿O hay una buena forma estándar de manejar teclas rápidas con MVVM Silverlight?

+0

Tengo mucha curiosidad por ver si hay una respuesta a esto. – Jeremiah

Respuesta

9

Parece que está buscando una forma MVVMish "sin código" para manejar el evento KeyUp/KeyPress/KeyDown.

Opción n. ° 1: prisma.
Lo ha mencionado solo envía con el comando Hacer clic. Sin embargo, puede agregar sus propios DP adjuntos para habilitar los comandos para cualquier evento que desee (como KeyUp/KeyDown/KeyPress).

Si está buscando una muestra de que Corey tiene una buena para ToggleButton. Controles/eventos no seleccionados.
http://www.85turns.com/2009/06/24/togglebutton-command-for-prism/

<ToggleButton x:Name="ToggleButton1" 
      customCommands:Checked.Command="{Binding CheckedCommand}" 
      customCommands:UnChecked.Command="{Binding UnCheckedCommand}" 
     Margin="8,8,0,8" Content="Check me" 
     /> 

Además, Erik Mork tiene un excelente video que le da una buena visión general sobre los comandos y cómo crear un comando especializado adjunto DP. http://development-guides.silverbaylabs.org/Video/Prism-Commands

Opción # 2: Mezcla Activadores
Los Expression Blend barcos SDK con disparadores y comportamientos que son muy acertadas a lo que intenta hacer.
Blend Examples naves proyecto CodePlex con un EventTrigger que puede usar:

<i:EventTrigger EventName="Click"> 
     <si:InvokeDataCommand Command="{Binding ShoppingCart.CheckOutCommand}"/> 
</i:EventTrigger> 

O bien, puede crear su propio disparador personalizado para eventos pulsación de tecla y hacer allí lo que usted desea. Aquí hay una muestra:
http://azurecoding.net/blogs/brownie/archive/2009/04/06/blend-behaviors-ftw.aspx

+0

Respondo la segunda respuesta de Justin. He creado un adjunto de comando KeyDown/KeyUp usando la Opción # 2 y manejo PageUp/PageDown y otras teclas de acceso rápido en mi aplicación SL. Funciona realmente bien. Paso el código clave a través del parámetro de comando, por lo que mi comando puede manejar los códigos de clave proprly. Es una buena idea crear una gran cantidad de estos comandos adjuntos. Son simples de escribir y fáciles de usar en cualquier lugar que los necesite. –

+0

En cuanto a la Opción n.º 1: el modelo de Prism funciona bien para eventos que no necesitan información adicional, pero se rompe si desea tener variaciones de ese mismo evento, como diferentes teclas en KeyDown. Su implementación depende de una sola propiedad adjunta por elemento, pero para manejar las teclas rápidas querrá múltiples propiedades adjuntas en el mismo elemento. La implementación del comportamiento de la propiedad adjunta no permite esto. Opción n. ° 2/Brian: lo ideal sería que no deseara que se especificaran las teclas rápidas en la vista, en lugar de en la implementación del comando? – RandomEngy

+0

Me gusta mucho esa muestra de comportamiento de mezcla. Ese es un tipo inteligente allí;) –

0

¿Quiere decir Ctrl + v o tal He visto el siguiente ejemplo en el MSDN site.

void Canvas_KeyUp(object sender, KeyEventArgs e) 
{ 
    //check for the specific 'v' key, then check modifiers 
    if (e.Key==Key.V) { 
     if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) { 
     //specific Ctrl+V action here 
     } 
    } // else ignore the keystroke 
} 
+0

Estoy buscando un patrón de comando MVVM. Ya sé cómo conectarlo en el código subyacente. – RandomEngy

0

El MVVM toolkit contiene una clase interesante CommandReference que le permite obligar a los comandos InputBindings modelo de vista. No estoy seguro de que funciona para Silverlight, pero usted puede darle una oportunidad ...

bien, como RandomEngy señaló, no hay InputBindings en Silverlight ...

Sin embargo, creo que se podría usar comportamientos adjuntos. Es una forma de "enlazar" un evento a un comando de ViewModel. Marlon Grech tiene a good implementation here

+1

No creo que Silverlight tenga InputBindings. – RandomEngy

+1

Tienes toda la razón, había olvidado este detalle ...Siempre me asombra cuando veo las limitaciones de Silverlight en comparación con WPF –

Cuestiones relacionadas