Keydown事件发生两次

Ric*_*Ric 6 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" /
Run Code Online (Sandbox Code Playgroud)

这有一个与之关联的KeyDown事件.

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

这个函数的输出是:


LA
LA

虽然我只按一下Enter键,但它会打印2次.任何原因或我做错了什么?

小智 12

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

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

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

e.Handled = true;
Run Code Online (Sandbox Code Playgroud)

要检查的另一件事是您没有订阅该事件两次.XAML将做同样的事情;

TextBoxUser.KeyDown + = TextBox_KeyDown

所以检查你的代码后面没有这个.

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


asi*_*tis 6

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

if (e.KeyStatus.RepeatCount == 1)
{
   //Execute code
}
Run Code Online (Sandbox Code Playgroud)