wpf - 如果 ListBox 使用数据绑定(bind),如何在加载时正确设置焦点?

标签 wpf data-binding listbox focus

我通常调用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/

相关文章:

winforms - 表单加载时停止触发组合框的 selectedIndexChanged 事件

c++ - 如何清除 wxListBox 中的所有选择(使用 wxLB_MULTIPLE)?

wpf - 使用带有 mvvm 的扩展 Toolkit Richtext 框来绑定(bind)彩色文本

jquery - Angular2如何获取所有选中的复选框

WPF 命令模式

javascript - 如何用 Angular 刷新图像

c# - 如何阻止用户在不禁用列表框中选择项目

javascript - 在 Jquery 中选择后如何获取列表框项目文本?

c# - 使用 ObjectAnimationUsingKeyFrames 切换可见性

wpf - 我可以使用 WPF 摇动用户桌面吗?