在使用 KeyUp 捕获功能键时将焦点保留在列表视图上

本文关键字:焦点 保留 列表 视图 功能键 KeyUp | 更新日期: 2023-09-27 18:36:53

我有一个显示搜索结果列表的列表视图。为了使事情变得更容易,我想将 F8 绑定到搜索按钮,以便用户可以按键盘上的 F8 并执行搜索。

我正在做这样的事情:

private void UserControl_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.F8)
    {
        btnSearch.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
        lvResults.SelectedIndex = 0;
        lvResults.Focus();
    }
}

btnSearch 实际上设置索引和焦点本身。如果用户单击按钮(或按 Tab 键并点击空格键),则会设置焦点。如果我删除 selectedindex 并在此处聚焦,我会得到相同的行为(因此此代码实际上再次执行此操作,并且不需要)。

使用此代码,如果我按 F8,则会选择第一行,但焦点仍放在按 F8 时所在的文本框上。这是不可取的,因为用户希望能够点击向上/向下箭头来选择他们想要的结果。

注意:如果我将焦点设置为另一个控件(不是列表视图),它可以正常工作。此外,如果我尝试将所选项目强制转换为 ListViewItem,则会出现错误,因为在这种情况下它是 DataRowView。我还尝试删除 btnSearch 中的代码并直接调用它,这也具有相同的结果。

因此,它

正确地选择了该行,但是列表视图没有获得焦点,而如果我单击该按钮,它就会获得焦点。如果我将另一个控件设置为具有焦点,那行得通,只是不是这个列表视图。

在使用 KeyUp 捕获功能键时将焦点保留在列表视图上

这是一个测试项目的zip,其中你的代码工作得很好;这只是一个垃圾测试项目,当我试图帮助解决SO问题时,我会在其中进行测试,所以忽略项目中的其他内容。 http://sdrv.ms/LuNKQt

另外,我建议阅读:http://julmar.com/blog/mark/?p=52,它有很多关于WPF焦点的好信息。

最后,您可以使用Snoop(http://snoopwpf.codeplex.com/releases/view/73187)来尝试监视程序,并尝试准确查看正在发生的事情。