Поместите это в ваш ListBox.Resources
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
</Style>
И это в коде позади
protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
{
ListBoxItem item = (ListBoxItem)sender;
item.IsSelected = true;
}
Вы также можете использовать следующий код, который не использует код позадиоднако он сохраняет выбранный ListBoxItem до тех пор, пока у него есть фокус KeyBoard.Как только фокус исчезает, элемент становится невыбранным
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
EDIT
Поскольку Silverlight не имеет EventSetters, вы можете использовать событие Loaded объекта ListBox и добавить следующее вваш код:
private void ResultListBox_Loaded(object sender, RoutedEventArgs e)
{
ListBox list = (ListBox)sender;
list.GotFocus += ResultListBox_GotFocus;
}
void ResultListBox_GotFocus(object sender, RoutedEventArgs e)
{
var item = FindAncester<ListBoxItem>((DependencyObject)e.OriginalSource);
if (item != null) item.IsSelected = true;
}
T FindAncester<T>(DependencyObject current)
where T : DependencyObject
{
current = VisualTreeHelper.GetParent(current);
while (current != null)
{
if (current is T)
{
return (T)current;
}
current = VisualTreeHelper.GetParent(current);
};
return null;
}
Это захватывает событие Focus для ListBox, принимает элемент управления, который вызвал событие focus, и перемещается вверх по визуальному дереву, чтобы найти объекты ListBoxItem
, и устанавливает его Выбранное значение равнымправда.