【问题标题】:Retaining focus on ListView when using KeyUp to capture function key使用 KeyUp 捕获功能键时保持对 ListView 的关注
【发布时间】:2012-06-14 11:35:25
【问题描述】:

我有一个显示搜索结果列表的 ListView。为了使事情更容易,我想将 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 实际上设置索引和焦点本身。如果用户点击按钮(或它的标签并点击空格),则设置焦点。如果我删除 selectedindex 并在此处聚焦,我会得到相同的行为(因此此代码实际上是再次执行此操作,并且不需要)。

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

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

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

【问题讨论】:

  • 您是否尝试过添加:e.Handled = true 以确保没有其他东西在按下键并尝试处理它。在我的脑海中,我认为文本框正在重新窃取焦点,因为它在您的用户控件处理程序触发后处理 F8 按键。
  • 尝试使用FocusManager.SetFocusedElement msdn.microsoft.com/en-us/library/…。您需要先调用FocusManager.GetFocusScope,然后在调用SetFocusedElement时使用返回的FocusScope
  • 这也行不通。我得到的最接近的是,如果我执行 FocusManager.SetFocusedElement(this, lvResults) ,我所要做的就是点击选项卡以使用箭头键。我现在想删除点击标签的需要。
  • 我刚刚编写了一个快速示例应用程序,您的代码实际上运行良好。所以这里肯定有其他事情发生。如果您愿意,我可以为您提供我的示例应用程序。你用“干净的机器”试过了吗?
  • 我很想看看样品。这可能是由于主题等原因。

标签: c# wpf listview focus


【解决方案1】:

这是一个测试项目的压缩包,您的代码在其中运行良好;这只是一个垃圾测试项目,当我试图帮助解决 SO 问题时,我会在其中进行测试,因此请忽略项目中的其他内容。 http://sdrv.ms/LuNKQt

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

最后,您可以使用 Snoop (http://snoopwpf.codeplex.com/releases/view/73187) 尝试监控程序并尝试查看到底发生了什么。

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 2011-06-05
    • 2016-10-15
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多