如何找出我的WPF应用程序中焦点的位置?

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

所以我给Xaml中的UserControl标签添加了一个Loaded事件处理程序,并且我调用了控件的Focus方法,我想要在Loaded事件处理程序中初始化焦点。 这很好,直到我升级了我今天使用的Telerik控制库。 现在,当我切换到搜索选项卡时,焦点不在我想要的字段中,但我无法确定哪个控件具有焦点。

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

没有把GotFocus处理程序放在UserControl中的每个控件上,我怎样才能确定焦点在哪里?

托尼


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

private void textBox1_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    textBox1.Text = ((FrameworkElement)e.NewFocus).Name ; 
}

尝试按下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事件。

链接地址: http://www.djcxy.com/p/59899.html

上一篇: How do I find out where the focus is going in my WPF application?

下一篇: ListBoxItem stealing Mouse clicks from ListBox