Pergunta

Eu tenho uma tela dentro de um scrollview. I anexa um manipulador de eventos keydown ao scrollview. Para a maioria das chaves, o manipulador é chamado.

No entanto, para as teclas de seta, o manipulador não são chamados. Em vez disso, o scrollview fica deslocado na direção apropriada.

Eu também anexado um manipulador de keyup ao scrollview eo keyup não são chamados para as teclas de seta.

Existe alguma maneira de obter a chave de seta para baixo evento aqui?

Foi útil?

Solução 2

Eu encontrei esse truque bobo para fazê-lo funcionar. Definir o scrollview para não ser um tabstop impede de comer os principais eventos .. mas então eu tive uma outra caixa de texto na página que todos foco súbita sempre teve porque o scrollview não mais. Então eu fixo que, deixando um foco de caixa de texto get invisível.

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

Edit:. Eu também tive que mover a caixa de texto para fora da tela, porque apesar de ser invisível, seu contorno ainda mostrou-se

2 Editar: eu usei uma caixa de texto, porque essa era a primeira coisa que eu achei que poderia capturar eventos KeyDown. No entanto, um UserControl pode. Por isso, provavelmente seria melhor prática para usar um UserControl em vez de uma caixa de texto invisível. Você pode chamar Focus () no UserControl, se necessário.

Outras dicas

Basta usar o evento KeyUp. Funciona como um encanto.

Esta é uma resposta possível - Eu não tive a oportunidade de testar isso. Eu tive problemas semelhantes no entanto passado, quando um controle está consumindo os eventos antes que você possa chegar a eles. Há algumas coisas que você pode ser capaz de tentar:

  1. Use o evento PreviewKeyDown, eu acho que é o que é chamado. Pode deixá-lo começar no evento antes de ser consumida pelo controle.
  2. Tente sugestão de mblandfo, embora se você fizer isso você provavelmente formiga para embrulhar a coisa toda em um controle de usuário para esconder o que está fazendo do resto do seu código.
  3. Adicionar um manipulador de chave para o objeto Canvas, você pode ser capaz de capturar o evento lá, e "bolha"-lo através de seu próprio evento.

exceto para 1) todos estes contam como hacks, realmente, mas boa sorte, espero que um deles funciona para você!

"Use o evento PreviewKeyDown, eu acho que é o que é chamado. Pode deixá-lo começar no evento antes de ser consumida pelo controle."

Isso funciona. Basta definir os argumentos do evento "Handled = true" e o ScrollViewer (ou ListBox) não vai pegar para o evento depois que você já lidou com isso. Eu não tinha necessidade de usar a propriedade IsTabStop para o ListBox embora; isso e ele não parece fazer qualquer coisa de qualquer maneira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top