在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次。 这样做的原因还是我做错了什么?
答案 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操作并为其执行处理程序
对我来说,这种解决方案效果很好 谢谢