WinRT KeyDown volán dvakrát pro klávesu Enter

WinUI XAML

8 years ago

Všiml jsem si zvláštního problému, ke kterému dochází při zpracování události KeyDown. Když uživatel stiskne klávesu 'Enter', tato událost je ve skutečnosti ve WinRT zpracována dvakrát (alespoň pro ovladací prvky TextBox a PasswordBox u kterých jsem si tohoto chování všiml). Podívejte se na následující příklad:

private void TextBox_KeyDown( object sender, KeyRoutedEventArgs e )
{
    if ( e.Key == VirtualKey.Enter )
    {
        Frame.Navigate( typeof( SomeOtherPage ) );
    }
}

Co se stane, když uživatel uvnitř textového pole, které má zaregistrovaný tento handler události KeyDown, stiskne 'Enter'? Jak jste očekávali, událost je zpracována a frame naviguje na stránku SomeOtherPage . Ale jakmile zpracování skončí, je metoda zavolána znovu s přesně stejnými argumenty! Kód metody je proveden znovu, takže frame podruhé načte shodnou stránku (a nyní tedy při pokusu o navigaci zpět je v navigačním zásobníku ještě původní instance). Toto chování je zřejmě spojeno pouze s klávesou 'Enter' a nevyskytuje se u jiných kláves. Řešení problému naštěstí je snadné:

private void TextBox_KeyDown( object sender, KeyRoutedEventArgs e )
{
    if ( e.Key == VirtualKey.Enter )
    {
        Frame.Navigate( typeof( SomeOtherPage ) );
        e.Handled = true;
    }
}

Nastavením vlastnosti KeyRoutedEventArgs ' Handled na true říkáme, aby se zpracování a "bublání" směrem XAML stromem nahoru ukončilo, ale to zároveň zabrání tomu, aby byla událost znovu zpracována na stejném ovládacím prvku. Problém jsem reportoval v aplikaci Windows Feedback v sekci Developer Platform. Pokud chcete vyřešení tohoto bugu podpořit, dejte mu hlas kliknutím sem :-) .