Я обычно звоню 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();
}
Если вы хотите сфокусировать первый элемент в списке, вы должны установить фокус на первый контейнер ListBoxItem . Например:
if (myListBox.Items.Count > 0)
{
ListBoxItem item = (ListBoxItem)myListBox.ItemContainerGenerator.ContainerFromIndex(0);
FocusManager.SetFocusedElement(this /* focus scope region */, item);
}
Вы все равно должны убедиться, что элемент управления ListBox первым получил событие Loaded . Есть ряд других событий, которые полезны для обработки обновлений, связанных с элементами списка. Взгляните на ItemContainerGenerator в MSDN.
Метод FocusManager.SetFocusedElement
дает логический фокус, но не фокус клавиатуры. Вы можете использовать метод Keyboard.Focus
, чтобы передать элементу фокус клавиатуры. Посетите эту страницу для получения дополнительных сведений об управлении фокусом в WPF.