2014-02-25 297 views
5

在Windows商店App,我有這個簡單的文本框keydown事件觸發兩次

<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

您確定您沒有多次不小心訂閱了該活動? –

+4

顯然它的錯誤根據這篇文章的回覆之一http://social.msdn.microsoft.com/Forums/windowsapps/en-US/734d6c7a-8da2-48c6-9b3d-fa868b4dfb1d/c-textbox-keydown-在地鐵應用程序中觸發兩次?forum = winappswithcsharp 我使用了KeyUp事件,現在它可以工作。 – Ric

+0

仍在使用e.Handled = true的Windows 10 Creators Update上的UWP TextBox中發生;爲我修好了。 –

回答

10

這應該只觸發一次事件,所以如果它發射兩次,我會檢查一些事情。

檢查您沒有處理父控件上的按鍵事件。這可能是一個面板或包含窗口。事件將通過視覺樹下降。例如,文本框上的按鍵在包含文本框的窗口上也是一個按鍵。

要停止這種情況發生,您可以將事件標記爲如下處理;

e.Handled = true; 

另一件要檢查的是,您沒有訂閱兩次事件。 XAML將做同樣的事情;

TextBoxUser.KeyDown + = TextBox_KeyDown

所以請你不要在你的代碼有這種落後。

您可以檢查發件人和e.OriginalSource屬性以查看從中觸發事件的位置。

+1

儘管您的解決方案是正確的,但我認爲KeyDown事件存在一個錯誤! – MAXE

+0

添加'e。處理= true;'在我的處理程序結束時做了訣竅。好奇這是爲什麼發生。我正在聽KeyUp,而不是KeyDown,但我認爲它是一樣的情況。由於某種原因,事件監聽器每次都收到兩次KeyUp事件。這是否是另一個答案中提到的事件中的錯誤? –

6

這是Windows RT.You一個已知的bug,可以通過檢查重點RepeatCount`

if (e.KeyStatus.RepeatCount == 1) 
{ 
    //Execute code 
} 
3

我終於明白了,有可能是在KeyDown事件一個錯誤處理。

當我設置,如@daniellepelley說,

e.Handled = true; 

事件仍然傳播:其他按鈕將攔截它,如果他們也應該不會。

在我的代碼中,我剛剛用KeyUp事件替換了KeyDown事件,並且一切正常(總是將Handled設置爲True值)!

+0

用KeyUp替代KeyDown也解決了我的問題! –