Keydown事件发生两次

时间:2014-02-25 11:32:22

标签: c# xaml windows-runtime windows-store-apps

在Windows商店App上,我有这个简单的TextBox

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

它有一个与之关联的KeyDown事件。

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

此功能的输出为:

  


LA LA

虽然我只按一下Enter键,但它会打印2次。 这样做的原因还是我做错了什么?

5 个答案:

答案 0 :(得分:11)

这应该只触发一次事件,所以如果它发射两次,我会检查一些事情。

检查您是否正在处理父控件上的按键事件。这可以是面板或包含窗口。事件将通过可视树向下冒泡。例如,文本框上的按键也将是包含文本框的窗口上的按键。

要阻止这种情况发生,您可以按以下方式标记事件;

e.Handled = true;

要检查的另一件事是您没有订阅该事件两次。 XAML将与;

相同

TextBoxUser.KeyDown + = TextBox_KeyDown

因此,请检查您的代码中是否包含此内容。

您可以检查sender和e.OriginalSource属性,以查看触发事件的位置。

答案 1 :(得分:6)

这是Windows RT中的已知错误。您可以通过检查Key RepeatCount“

来处理它
if (e.KeyStatus.RepeatCount == 1)
{
   //Execute code
}

答案 2 :(得分:3)

我终于意识到KeyDown事件中可能存在错误

当我设定时,正如@daniellepelley所说,

e.Handled = true;

事件仍然传播:其他按钮会拦截它,如果他们不应该这样做。

在我的代码中,我刚用KeyUp事件替换了KeyDown事件,一切正常(始终将Handled设置为True值)!

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我在javascript中看到了此问题,其中keydown事件处理程序被触发了两次,并且能够通过使用.off()。on()来解决

$('.text_area').off().on('keydown', function (e) {

// do something

)};

它的作用是关闭额外的事件,并执行最新的keydown操作并为其执行处理程序

对我来说,这种解决方案效果很好 谢谢