8

我的 WPF 应用程序中有一个搜索屏幕。屏幕实现为 TabControl 的 TabItem 中的 UserControl。当用户切换到“搜索”选项卡时,我希望焦点进入一个特定字段。

因此,我在 Xaml 中的 UserControl 标记中添加了一个 Loaded 事件处理程序,并调用了我希望在 Loaded 事件处理程序中获得初始焦点的控件的 Focus 方法。在我升级了我今天使用的 Telerik 控件库之前,这非常有效。现在,当我切换到“搜索”选项卡时,焦点不在我想要的字段中,但我不知道哪个控件具有焦点。

由于其他原因,我想要关注的领域已经有 GotFocus 和 LostFocus 事件处理程序。我记得在 Win Forms 中,LostFocus 事件处理程序参数告诉您哪个控件将获得焦点。所以我在我的 LostFocus 处理程序中放置了一个断点,并发现 WPF 中 LostFocus 事件处理程序的参数不包含该信息。

如果不将 GotFocus 处理程序放在我的 UserControl 中的每个控件上,我如何才能确定焦点的位置?

托尼

4

2 回答 2

9

尝试按Tab键,看看它是否可以帮助您找到焦点控件。

您还可以按照此 Q/A 中的建议使用Snoop :有关在 WPF 中调试焦点问题的任何提示?

对于初学者,Snoop 在状态栏中显示当前的焦点元素和当前的 FocusScope。

你可以让它向你展示所有 GotFocus 和 LostFocus 事件:

1. Run your app.
2. Run Snoop.
3. Choose your app in the dropdown.
4. Click the binoculars ("Snoop") button.
5. On the right pane, click the Events tab.
6. Click to bring down the dropdown.
7. Scroll down to the Keyboard section and check GotKeyboardFocus, LostKeyboardFocus, and optionally the PreviewXXX events.
8. Now do what you need to do to manipulate focus and watch the Snoop window.

同样,您可以以相同的方式跟踪 FocusManager 事件。

于 2012-03-30T01:08:52.093 回答
9

您可以尝试将断点放在LostKeyboardFocus附加事件而不是LostFocus事件上。它使用KeyboardFocusChangedEventArgs具有显示哪个元素具有焦点以及焦点在哪里的属性的类。

private void textBox1_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    textBox1.Text = ((FrameworkElement)e.NewFocus).Name ; 
}
于 2012-03-30T04:21:58.393 回答