Keydown Event fires twice

2019-04-30 00:51发布

问题:

On a Windows store App, I have this simple TextBox

<TextBox Name="TextBoxUser" HorizontalAlignment="Right" Width="147" Margin="20,0,0,0" KeyDown="TextBox_KeyDown" /

That has a KeyDown Event associated with it.

        private async void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Enter)
        {
           Debug.WriteLine("LA");
        }
    }

And the output of this function is:


LA
LA

although I press Enter only once, it prints 2 times. Any reason for that or am I doing something wrong?

回答1:

This should only fire the event once, so if it is firing twice I would check a couple of things.

Check that you aren't handling the key down event on a parent control. This could be a panel or the containing window. Events will bubble down through the visual tree. For example a key down on a textbox will also be a keydown on the window containing the textbox.

To stop this happening you can mark the event as handled as below;

e.Handled = true;

The other thing to check is that you aren't subscribing to the event twice. The XAML will do the same as;

TextBoxUser.KeyDown += TextBox_KeyDown

so check that you don't have this in your code behind.

You can check the sender and e.OriginalSource property to see where the event is being fired from.



回答2:

This is a known bug in Windows RT.You can handle it by checking the Key RepeatCount `

if (e.KeyStatus.RepeatCount == 1)
{
   //Execute code
}


回答3:

I finally realized that there is probably a bug in the KeyDown event.

When I set, as @daniellepelley said,

e.Handled = true;

the event still propagates: other buttons will intercept it, also if they shouldn't.

In my code, I just replaced KeyDown event with KeyUp event and everything works fine (always setting Handled to True value)!



回答4:

void onKeyPressEvent(object sender, KeyEventArgs e)
{
  if(e.Handled)
  return;

  {
    //
    // the block of codes to be executed on the key press
    // should added here.
    //
  }
  e.Handled = true;
}