Как я могу установить фокус на ListBox правильно на загрузке, если это использует привязку данных?

Я обычно звоню myControl.Focus() в Загруженном обработчике событий, но это, кажется, не работает на a 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();
}
6
задан Dave Clemmer 24 September 2011 в 18:03
поделиться

2 ответа

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

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

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

10
ответ дан 9 December 2019 в 20:43
поделиться

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

2
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: