Настройка фокуса на элементе 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();

если ваш список содержит что-то другое, чем ListBoxItems, Вы можете использовать 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>