在Windows系统中,持续按住一个按键,相当于重复按下多次这个键。而且PreviewKeyDown, KeyDown 和 PreviewTextInput 事件也会重复的触发。
你可以通过KeyEventArgs.IsRepeat 属性判断事件是第一次发生,还是持续按住按键重复发生的。
加入我们在一个获得键盘输入焦点的TextBox 上持续按下“a”键,并获得了三次输入,那么我们获得的事件顺序如下:
-PreviewKeyDown, Key = A, IsRepeat = False
-KeyDown, Key = A, IsRepeat = False
-PreviewTextInput, Text = a
-(TextBox 显示一个“a”)
-PreviewKeyDown, Key = A, IsRepeat = True
-KeyDown, Key = A, IsRepeat = True
-PreviewTextInput, Text = a
-(TextBox 显示“aa”)
-PreviewKeyDown, Key = A, IsRepeat = True
-KeyDown, Key = A, IsRepeat = True
-PreviewTextInput, Text = a
-(TextBox 显示“aaa”)
-PreviewKeyUp, Key = A, IsRepeat = False
-KeyUp, Key = A, IsRepeat = False
如果想要防止这钟持续按下会多次触发事件的情况,可以在IsRepeat 属性为true的时候设置事件的Handled 属性为true。
例如,在XAM注册事件:
<TextBox HorizontalAlignment="Center" Width="150" Margin="10"
PreviewKeyDown="TextBox_PreviewKeyDown" />
然后事件处理函数代码中加上:
private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
e.Handled = e.IsRepeat;
}
原文地址:https://wpf.2000things.com/2012/08/30/636-keyboard-events-that-fire-when-a-key-is-held-down/