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.
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
}