【问题标题】:Keydown Event fires twiceKeydown 事件触发两次
【发布时间】:2014-02-25 11:32:21
【问题描述】:

在 Windows 商店应用程序中,我有这个简单的文本框

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

而这个函数的输出是:


洛杉矶
洛杉矶

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

【问题讨论】:

  • 您确定您没有不小心多次订阅该活动?
  • 显然这是一个错误,根据这篇文章social.msdn.microsoft.com/Forums/windowsapps/en-US/… 的回复之一,我使用了 KeyUp 事件,现在它可以工作了。
  • 在 Windows 10 Creators Update 上的 UWP TextBox 中仍然发生,使用 e.Handled = true;为我修好了。

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


【解决方案1】:

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

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

要阻止这种情况发生,您可以将事件标记为如下处理;

e.Handled = true;

要检查的另一件事是您没有订阅该事件两次。 XAML 将执行相同的操作;

TextBoxUser.KeyDown += TextBox_KeyDown

所以检查你的代码中没有这个。

您可以检查 sender 和 e.OriginalSource 属性以查看从何处触发事件。

【讨论】:

  • 虽然你的解决方案是对的,但我认为KeyDown事件有bug!
  • 在我的处理程序末尾添加 e.Handled = true; 就可以了。好奇为什么会这样。我在听 KeyUp,而不是 KeyDown,但我认为情况相同。由于某种原因,事件侦听器两次获得每个 KeyUp 事件。这真的是另一个答案中提到的事件中的错误吗?
  • 像魅力一样工作,非常感谢!在我们在 Keyup/down 事件的开头添加条件以检查 e.handled 是否为 true 后工作!
【解决方案2】:

这是 Windows RT 中的一个已知错误。您可以通过检查 Key RepeatCount 来处理它`

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

【讨论】:

  • 此错误是否同时修复?以 w10 1803 为目标时,我无法再重现此内容。
【解决方案3】:

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

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

e.Handled = true;

事件仍在传播:其他按钮会拦截它,即使它们不应该这样做。

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

【讨论】:

  • 用 KeyUp 替换 KeyDown 也解决了我的问题!
【解决方案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;
}

【讨论】:

  • 欢迎来到 Stack Overflow!我们有一个指南How to write a good answer。如果你能改进你的答案,那就太好了。谢谢!
【解决方案5】:

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

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

// do something

)};

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

对我来说只有这个解决方案运作良好 谢谢

【讨论】:

  • 如何将其应用于 C#/UWP?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多