【发布时间】: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.SetFocusedElementmsdn.microsoft.com/en-us/library/…。您需要先调用FocusManager.GetFocusScope,然后在调用SetFocusedElement时使用返回的FocusScope。 -
这也行不通。我得到的最接近的是,如果我执行 FocusManager.SetFocusedElement(this, lvResults) ,我所要做的就是点击选项卡以使用箭头键。我现在想删除点击标签的需要。
-
我刚刚编写了一个快速示例应用程序,您的代码实际上运行良好。所以这里肯定有其他事情发生。如果您愿意,我可以为您提供我的示例应用程序。你用“干净的机器”试过了吗?
-
我很想看看样品。这可能是由于主题等原因。