Как правильно установить фокус на ListBox при загрузке, если он использует привязку данных? - PullRequest
6 голосов
/ 17 февраля 2010

Я обычно вызываю myControl.Focus() в обработчике событий Loaded, но, похоже, это не работает для ListBox, который привязан к списку пользовательских объектов. Когда я запускаю свое приложение, первый элемент ListBox выбирается, но фокус находится в другом месте.

Я думал, что это может быть потому, что фокус устанавливается до того, как в него загружаются элементы с привязкой к данным ... но следующий код показывает, что действительно есть элементы, потому что ctrlItemsCount показывает число 8.

Как я могу установить начальный фокус в этой ситуации, и каково правильное место, чтобы обычно установить начальный фокус?

private void onLoad(object sender, RoutedEventArgs e) {
        if (ctrlCountries.Items.Count > 0) {
             ctrlItemsCount.Text = ctrlCountries.Items.Count;
             ctrlCountries.SelectedIndex = 0;
             FocusManager.SetFocusedElement(this, ctrlCountries);
        }

  }

РЕДАКТИРОВАТЬ: Я переместил этот код в загруженное событие для самого фактического ListBox. Это почти работает - теперь фокус на ListBox, но мне все еще нужно нажать клавишу ВНИЗ один раз, прежде чем у пункта № 0 появится курсор клавиатуры. Другими словами, фокус или курсор на 1 ступень выше элемента № 0 по некоторым причинам:

private void onCountriesLoaded(object sender, RoutedEventArgs e) {
    ctrlCountries.SelectedIndex = 0;
    FocusManager.SetFocusedElement(this, ctrlCountries);
    Keyboard.Focus();
}

Ответы [ 2 ]

10 голосов
/ 18 февраля 2010

Если вы хотите сфокусировать первый элемент в списке, вам нужно установить фокус на первый ListBoxItem контейнер. Например:

if (myListBox.Items.Count > 0)
{ 
   ListBoxItem item = (ListBoxItem)myListBox.ItemContainerGenerator.ContainerFromIndex(0);
   FocusManager.SetFocusedElement(this /* focus scope region */, item);
}

Вы все равно должны убедиться, что элемент управления ListBox впервые получил событие Loaded . Существует ряд других событий, которые полезны для обработки обновлений, связанных с элементом списка. Взгляните на ItemContainerGenerator в MSDN.

2 голосов
/ 17 февраля 2010

Метод FocusManager.SetFocusedElement дает логический фокус, но не фокус клавиатуры. Вы можете использовать метод Keyboard.Focus, чтобы придать фокус клавиатуре элементу. Посмотрите эту страницу , чтобы узнать больше об управлении фокусом в WPF.

...