我通常调用myControl.Focus()
在 Loaded 事件处理程序中,但这似乎不适用于 ListBox
这是数据绑定(bind)到自定义对象列表。当我启动我的应用程序时,ListBox
的第一项被选中,但焦点在其他地方。
我认为这可能是因为在将数据绑定(bind)项加载到其中之前设置了焦点...但是以下代码显示确实有项,因为 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 有键盘光标之前按一次键盘向下键。换句话说,由于某种原因,焦点或光标比项目 #0 高 1 个等级: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 中。
关于wpf - 如果 ListBox 使用数据绑定(bind),如何在加载时正确设置焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2283143/