Настройка фокуса на элементе ListBox прерывает навигацию клавиатуры
после выбора элемента списка программно необходимо нажать клавишу downup два раза для перемещения курсора. Есть предложения?
вид:
<ListBox Name="lbActions" Canvas.Left="10" Canvas.Top="10"
Width="260" Height="180">
<ListBoxItem Name="Open" IsSelected="true" Content="Open"></ListBoxItem>
<ListBoxItem Name="Enter" Content="Enter"></ListBoxItem>
<ListBoxItem Name="Print" Content="Print"></ListBoxItem>
</ListBox>
код:
public View()
{
lbActions.Focus();
lbActions.SelectedIndex = 0; //not helps
((ListBoxItem) lbActions.SelectedItem).Focus(); //not helps either
}
2 ответов
Не устанавливайте фокус на список... установите фокус на выбранный элемент ListBoxItem. Это позволит решить проблему" два удара клавиатуры требуется":
if (lbActions.SelectedItem != null)
((ListBoxItem)lbActions.SelectedItem).Focus();
else
lbActions.Focus();
если ваш список содержит что-то другое, чем ListBoxItem
s, Вы можете использовать lbActions.ItemContainerGenerator.ContainerFromIndex(lbActions.SelectedIndex)
получить автоматически сгенерированный ListBoxItem
.
если вы хотите, чтобы это произошло во время инициализация окна, вам нужно поместить код в Loaded
событие, а не в конструктор. Образец (XAML):
<Window ... Loaded="Window_Loaded">
...
</Window>
код (на основе примера в вашем вопросе):
private void Window_Loaded(object sender, RoutedEventArgs e)
{
lbActions.Focus();
lbActions.SelectedIndex = 0;
((ListBoxItem)lbActions.SelectedItem).Focus();
}
вы можете сделать это легко и в XAML. Обратите внимание, что это установит только логический фокус.
например:
<Grid FocusManager.FocusedElement="{Binding ElementName=itemlist, Path=SelectedItem}">
<ListBox x:Name="itemlist" SelectedIndex="1">
<ListBox.Items>
<ListBoxItem>One</ListBoxItem>
<ListBoxItem>Two</ListBoxItem>
<ListBoxItem>Three</ListBoxItem>
<ListBoxItem>Four</ListBoxItem>
<ListBoxItem>Five</ListBoxItem>
<ListBoxItem>Six</ListBoxItem>
</ListBox.Items>
</ListBox>
</Grid>