Fix Silverlight ListBox focus issue

Jan Holan       1. 7. 2013       Silverlight, Komponenty       8741 zobrazení

Při nastavování focusu se Silverlight ListBox kontrol defaultně chová tak, že je focus nastaven na první (případně poslední pří Shift+Tab) prvek. Tento “divný” stav je zobrazen na obrázku. Já bych toto chování označil spíše přímo jako bug než vlastnost, očekávané chování je samozřejmě nastavit focus na označený prvek v ListBoxu (tak jako ve WPF). Horší chování pak ještě nastává v případě, že ListBox je naplněn více prvky a je v něm tedy vertikální posuvník.

image

Nikde jsem nenašel řešení tohoto problému, které by mě uspokojilo, buď nebylo obecné, nebo nepočítalo právě s těmi více prvky a nezachovávalo nastavené posunutí posuvníku.

Moje řešení je nakonec docela jednoduché a spočívá v nastavení Focusu na Selected prvek (pokud se liší od fokusovaného) v metodě OnGotFocus ve třídě odvozené z ListBox kontrolu. Kód metody je následující:

public class FixedListBox : ListBox
{
    #region private member functions
    /// <summary>
    /// Overrides ListBox.OnGotFocus
    /// </summary>
    protected override void OnGotFocus(RoutedEventArgs e)
    {
        base.OnGotFocus(e);

        //Fix ListBox focus issue: ListBox by default focus on the first (or last) item in list and not the selected one.
        if (this.SelectedIndex != -1)
        {
            var focusedItem = e.OriginalSource as ListBoxItem;
            if (focusedItem != null && !focusedItem.IsSelected)
            {
                //Focus on the selected item
                ListBoxItem selectedItem = base.ItemContainerGenerator.ContainerFromIndex(this.SelectedIndex) as ListBoxItem;
                if (selectedItem != null)
                {
                    selectedItem.Focus();
                }
            }
        }
    }
    #endregion
}

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback