如何找到我的WPF应用程序的重点?

时间:2012-03-30 00:12:14

标签: wpf focus lost-focus lostfocus

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

所以我在Xaml中向UserControl标记添加了一个Loaded事件处理程序,并且我调用了控件的Focus方法,我想在Loaded事件处理程序中获得初始焦点。这很有效,直到我升级了今天使用的Telerik控件库。现在,当我切换到“搜索”选项卡时,焦点不在我想要的字段中,但我无法分辨出哪个控件具有焦点。

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

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

2 个答案:

答案 0 :(得分:9)

尝试按标签键,看看它是否有助于您找到焦点对照。

您也可以按照此问答中的建议使用SnoopAny tips on debugging focus issues in 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事件。

答案 1 :(得分:7)

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

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