我有一个包含几个ComboBox和Buttons的UserControl。
在托管UserControl的窗口中,我需要在UserControl获得焦点时更新一些属性。
我的问题是,每次当用户控件内的焦点发生变化时,都会在托管窗口中获得一个GotFocus事件。
是否有某种最佳做法可以确保我只在托管窗口中获得一个GotFocused事件?我的意思是,如果我单步执行UserControl中的控件,焦点总是在UserControl中,所以我不想要GotFocused事件。
答案 0 :(得分:1)
这是我提出的解决方案:
首先,这篇文章是我的解决方案的关键:WPF UserControl detect LostFocus ignoring children。
Refer to active Window in WPF?。
使用这些帖子中的功能,我在UserControl中注册了LostFocus事件。
private void UserControl_LostFocus(object sender, RoutedEventArgs e)
{
var focused_element = FocusManager.GetFocusedElement(Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.IsActive));
var parent = (focused_element as FrameworkElement).TryFindParent<KeywordSelector>();
if (parent != this) userControlHasFocus=false;
}
然后......
private void UserControl_GotFocus(object sender, RoutedEventArgs e)
{
if (userControlHasFocus == true) e.Handled = true;
else userControlHasFocus = true;
}
这样我就可以跟踪焦点。 userControlHasFocus为false是默认值。当GotFocus()第一次发生时它是假的并且GotFocus事件没有停止冒泡。但userControlHasFocus设置为true,因为现在焦点位于UserControl内。
每当焦点移动到另一个控件时,LostFocus会检查新控件父是否为UserControl。如果没有,它会将userControlHasFocus重置为false。