[英]Keydown Event fires twice
在 Windows 商店應用程序上,我有這個簡單的 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");
}
}
這個函數的輸出是:
洛杉磯
洛杉磯
雖然我只按一次 Enter,但它會打印 2 次。 有什么原因還是我做錯了什么?
這應該只觸發一次事件,所以如果它觸發兩次,我會檢查幾件事。
檢查您是否沒有處理父控件上的按鍵事件。 這可以是面板或包含窗口。 事件將通過視覺樹冒泡。 例如,文本框上的按鍵也將是包含文本框的窗口上的按鍵。
要阻止這種情況發生,您可以將事件標記為如下處理;
e.Handled = true;
要檢查的另一件事是您沒有兩次訂閱該事件。 XAML 將執行相同的操作;
TextBoxUser.KeyDown += TextBox_KeyDown
所以檢查你的代碼中沒有這個。
您可以檢查 sender 和 e.OriginalSource 屬性以查看從何處觸發事件。
這是 Windows RT 中的一個已知錯誤。您可以通過檢查 Key RepeatCount 來處理它
if (e.KeyStatus.RepeatCount == 1)
{
//Execute code
}
我終於意識到KeyDown 事件中可能存在錯誤。
當我設置時,正如@daniellepelley 所說,
e.Handled = true;
該事件仍在傳播:其他按鈕將攔截它,即使它們不應該。
在我的代碼中,我只是用 KeyUp 事件替換了 KeyDown 事件,一切正常(始終將 Handled 設置為 True 值)!
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;
}
這可能為時已晚,但e.preventDefault()
對我有用。 特別是在 React - TypeScript 中。
(e: KeyboardEvent) => {
e.preventDefault();
console.log(e);
};
我在 Xamarin.Android 中遇到了同樣的問題,其中按鍵事件觸發了兩次。
就我而言,這是因為 KeyDown 和 KeyUp 是兩個獨立的操作,它們都調用相同的事件。 我只回應如下一項操作:
private void KeyPress(object sender, View.KeyEventArgs e)
{
if (e.KeyCode == Keycode.Enter)
{
if (e.Event.Action == KeyEventActions.Down)
{
Event();
}
}
}
我在 javascript 中看到了這個問題,其中 keydown 事件處理程序被觸發了兩次,並且能夠通過使用 .off().on() 來修復
$('.text_area').off().on('keydown', function (e) {
// do something
)};
它的作用是,它關閉額外的事件並采取最新的 keydown 操作並為其執行處理程序
對我來說只有這個解決方案運作良好謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.