Pregunta

Tengo un lienzo dentro de una vista de desplazamiento. Adjunté un controlador de eventos keydown a la vista de desplazamiento. Para la mayoría de las teclas, el controlador se llama.

Sin embargo, para las teclas de flecha, no se llama al controlador. En su lugar, la vista de desplazamiento se desplaza en la dirección adecuada.

También adjunté un controlador de keyup a la vista de desplazamiento y el keyup se llama para las teclas de flecha.

¿Hay alguna manera de obtener el evento de la tecla de flecha hacia abajo aquí?

¿Fue útil?

Solución 2

Encontré este truco tonto para hacerlo funcionar. Configurar la vista de desplazamiento para que no sea una tabulación evita que se coman los eventos clave ... pero luego tuve otro cuadro de texto en la página en el que, de repente, SIEMPRE tenía el foco porque la vista de desplazamiento ya no. Así que lo arreglé dejando que un cuadro de texto invisible se enfocara.

scrollView.IsTabStop = false;

invisibleTextBox.Foreground = new SolidColorBrush(Colors.Transparent);
invisibleTextBox.Background = new SolidColorBrush(Colors.Transparent);
Canvas.SetZIndex(invisibleTextBox, -1000);
invisibleTextBox.KeyDown += new KeyEventHandler(HandleKeyDown);
invisibleTextBox.KeyUp += new KeyEventHandler(HandleKeyUp);

Editar: También tuve que mover el cuadro de texto fuera del lienzo porque a pesar de ser invisible, su contorno aún se mostraba.

Segunda edición: utilicé un cuadro de texto porque fue lo primero que encontré que podía capturar eventos de KeyDown. Sin embargo, un UserControl puede. Por lo tanto, probablemente sería mejor utilizar un UserControl en lugar de un cuadro de texto invisible. Puede llamar a Focus () en el UserControl si es necesario.

Otros consejos

Solo usa el evento KeyUp. Funciona como un encanto.

Esta es una respuesta posible, no he tenido la oportunidad de probar esto. Sin embargo, he tenido problemas similares en el pasado, cuando un control está consumiendo los eventos antes de poder llegar a ellos. Hay algunas cosas que puedes intentar:

  1. Use el evento PreviewKeyDown, creo que así se llama. Puede permitirle llegar al evento antes de que lo consuma el control.
  2. Intente la sugerencia de mblandfo, aunque si lo hace, es probable que deba envolver todo en un control de usuario para ocultar lo que está haciendo del resto de su código.
  3. Agregue un controlador de clave al objeto Canvas, es posible que pueda capturar el evento allí y " burbuja " A través de tu propio evento.

Excepto 1), todos estos cuentan como hacks, pero buena suerte, ¡espero que alguno de ellos funcione para ti!

" Usa el evento PreviewKeyDown, creo que así se llama. Es posible que le permita acceder al evento antes de que lo consuma el control. & Quot;

Esto funciona. Simplemente configura los argumentos del evento " Handled = true " y el ScrollViewer (o ListBox) no agarrará el evento después de que ya lo hayas manejado. Sin embargo, no tuve que usar la propiedad IsTabStop para ListBox; eso y no parece hacer nada de todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top