如何设置列表框中项目的焦点?

12

我有一个定义好的下拉框,就像这样:

var listBox = new ListBox();
listBox.Items.Add(1);        
listBox.Items.Add(2);
listBox.Items.Add(3);

我希望能够直接将焦点设置到列表框中的一个项目。

如果我这样做:

listBox.SelectedIndex = 0;
listBox.Focus();

焦点设置在整个listBox上,所以如果我按向下箭头将选择移动到下面的项,我必须按两次箭头。第一次,焦点从整个listBox跳转到第一项,然后我才能再按箭头,最终选择才会下移。

我想直接将焦点设置在第一项上,这样我就不必按两次箭头了。


使用ListBox的SelectedValue属性 - Gayot Fow
可能是将焦点设置在ListBox项目上会破坏键盘导航的重复问题。 - user2819245
嗯,我尝试了 ((ListBoxItem) listBox.SelectedItem).Focus(); 但是不知道为什么没有效果,我还是需要点击两次。我想我只能通过模拟按键来解决它了。 - user3595338
你的代码中还有 listBox.focus(); 吗? - user2819245
3个回答

21
var listBoxItem =  
   (ListBoxItem)listBox
     .ItemContainerGenerator
       .ContainerFromItem(listBox.SelectedItem);

listBoxItem.Focus();

2
这是一个类似(如果不是完全相同)的问题:设置 ListBox 项的焦点会破坏键盘导航 以下是代码(我不熟悉 WPF,无法保证其有效性,但在我给出的主题中已被接受,因此应该有效):
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    listBox.Focus();
    listBox.SelectedIndex = 0;
    ((ListBoxItem)listBox.SelectedItem).Focus();
}

看起来好多了(只需从你的答案中删除WinForms内容) :) WindowLoaded可能不是做这个的正确时间,完全取决于列表框最初填充第一个项目的时间... - user2819245
不行,那样做没有效果。它似乎根本没有任何影响。(它仍然只选择整个列表框) - user3595338
@user3595338,请查看我在你的问题下面的最后一条评论。 - user2819245
1
Marcelo,从代码中删除listBox.Focus();。我刚刚才注意到这个问题。这很可能无法正常工作...(在WPF中,设置焦点是一个延迟操作。为了好玩,你可以把listbox.Focus放在方法的末尾并比较不同的行为... ;) ) - user2819245
1
如果通过 ItemsSource 属性绑定了项目,则此方法无效。在这种情况下,选择的项无法强制转换为 ListBoxItem,因此您必须使用 @Robin 的早期答案。 - Andrew Stephens
显示剩余3条评论

0

你不能在列表框项上使用 Focus() 方法。不过,你可以选择项目,这与你想要做的事情几乎是一样的。listbox.SelectedIndex = 0;


1
如果您能添加一些解释,那就太好了。 - Buggy

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