簡體   English   中英

Keydown 事件觸發兩次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM