如果ListBox使用数据绑定,我该如何在加载时正确地设置焦点?

6
我通常在Loaded事件处理程序中调用myControl.Focus(),但对于绑定到自定义对象列表的ListBox,这似乎不起作用。当我启动我的应用程序时,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上,但是我仍然需要按键盘DOWN一次才能使第0项具有键盘光标。换句话说,焦点或光标因某种原因在第0项上方1个刻度:

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

10

如果你想将焦点集中到列表框的第一个元素上,你需要将焦点设置为第一个 ListBoxItem 容器。例如:

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

不过,您仍然需要确保 ListBox 控件首先接收到其 Loaded 事件。还有许多其他有用的事件可用于处理列表框项的相关更新。请查看MSDN中的ItemContainerGenerator


1
它有效了!几乎...... 如果我使用"Keyboard.Focus(item);"而非FocusManager,它可以百分之百按照预期工作。这很奇怪,因为MSDN说FocusManager将设置逻辑焦点并尝试设置键盘焦点。那么,我应该学到的正确教训是始终应该使用Keyboard.Focus(item)吗? - PRINCESS FLUFF

2

FocusManager.SetFocusedElement方法可以给予逻辑焦点,但不会给予键盘焦点。您可以使用Keyboard.Focus方法来为一个元素提供键盘焦点。请参阅此页面了解更多有关WPF中焦点管理的详细信息。


我添加了Keyboard.Focus(ctrlCountries);但它不起作用。请注意,如果我添加一个按钮单击事件处理程序,仅使用焦点管理器设置焦点,则可以正常工作。 - PRINCESS FLUFF
1
换句话说,以下代码不会将焦点放在列表框的第一项上: private void onLoad(object sender, RoutedEventArgs e) { FocusManager.SetFocusedElement(this, ctrlCountries); Keyboard.Focus(ctrlCountries); } - PRINCESS FLUFF
1
在 ListBox 完全加载后执行(即当 ctrlCountries.Loaded 事件发生时)。 - Thomas Levesque
谢谢,现在好多了。但是光标仍然在ListBox的外面(即它的边框似乎有焦点),所以我必须按下DOWN键才能选择第一个列表框项目。 - PRINCESS FLUFF
我认为你可以尝试在之前设置逻辑焦点: var item = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromIndex(selectedIndex); FocusManager.SetFocusedElement(this, item); Keyboard.Focus(item); - MyOwnWay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接