Установка фокуса на элемент ListBox нарушает навигацию клавиатуры - PullRequest
9 голосов
/ 08 февраля 2010

После программного выбора элемента ListBox необходимо нажать клавишу \ вверх два раза , чтобы переместить выделение. Есть предложения?

Вид:

<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 ]

13 голосов
/ 08 февраля 2010

Не устанавливайте фокус на ListBox ... установите фокус на выбранный ListBoxItem. Это решит проблему «требуется два нажатия клавиш»:

if (lbActions.SelectedItem != null)
    ((ListBoxItem)lbActions.SelectedItem).Focus();
else
    lbActions.Focus();

Если ваш ListBox содержит что-то кроме 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();
    }
1 голос
/ 20 сентября 2011

Вы можете легко сделать это и в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...