Wpf 如果列表框使用数据绑定,如何在加载时正确设置其焦点?

Wpf 如果列表框使用数据绑定,如何在加载时正确设置其焦点?,wpf,data-binding,listbox,focus,Wpf,Data Binding,Listbox,Focus,我通常在加载的事件处理程序中调用myControl.Focus(),但这似乎不适用于数据绑定到自定义对象列表的ListBox。当我启动应用程序时,列表框的第一项被选中,但焦点在别处 我想这可能是因为焦点是在数据绑定项加载到它之前设置的。。。但是下面的代码显示确实存在项目,因为CtrliteMCount显示数字8 在这种情况下,如何设置初始焦点?通常设置初始焦点的正确位置是什么 private void onLoad(object sender, RoutedEventArgs e) {

我通常在加载的事件处理程序中调用
myControl.Focus()
,但这似乎不适用于数据绑定到自定义对象列表的
ListBox
。当我启动应用程序时,
列表框
的第一项被选中,但焦点在别处

我想这可能是因为焦点是在数据绑定项加载到它之前设置的。。。但是下面的代码显示确实存在项目,因为
CtrliteMCount
显示数字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);
        }

  }
编辑:我已将此代码移动到实际
列表框
本身的已加载事件中。它几乎可以工作了-现在的焦点是
列表框
,但我仍然需要按下键盘一次,然后项目#0才有键盘光标。换句话说,由于某种原因,焦点或光标位于项目#0上方1个槽口处:

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

FocusManager.SetFocusedElement方法提供逻辑焦点,但不提供键盘焦点。可以使用该方法为元素指定键盘焦点。查看有关WPF中焦点管理的更多详细信息。

如果要聚焦列表框中的第一个元素,必须将焦点设置为第一个ListBoxItem容器。例如:

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

但是,您仍然必须确保ListBox控件已首先收到其加载的事件。还有许多其他事件可用于处理与列表框项目相关的更新。看看MSDN中的键盘。

我添加了Keyboard.Focus(ctrlCountries);但它不起作用。请注意,如果我添加一个按钮单击事件处理程序,该处理程序单独使用焦点管理器设置焦点,它就会工作。换句话说,以下代码不会将焦点放在列表框的第一项上:private void onLoad(object sender,RoutedEventArgs e){FocusManager.SetFocusedElement(this,ctrlCountries);Keyboard.focus(ctrlCountries);}在列表框完全加载后(即当ctrlCountries.loaded事件发生时)执行此操作。谢谢,现在情况好多了。但是光标仍然位于列表框的外部(即,其边框似乎有焦点),所以我必须在选择第一个listbox项之前按下键。我想您也可以尝试在前面设置逻辑焦点:var item=(ListBoxItem)listbox.ItemContainerGenerator.ContainerFromIndex(selectedIndex);FocusManager.SetFocusedElement(this,item);Keyboard.focus(item);它可以工作!几乎……如果我使用它,它可以100%工作“Keyboard.Focus(item);”而不是FocusManager。这很奇怪,因为MSDN说FocusManager将设置逻辑焦点并尝试设置键盘焦点。我是否学到了正确的教训,即Keyboard.Focus(item)是我应该始终使用的?