WPF UserControl检测忽略子项的LostFocus

我有一个UserControl帽子包含几个元素(ListBoxes,Buttons)和一个带有ComboBoxes和Buttons的Popup。

我尝试失去对用户控件的关注,但每当UserControl内的焦点发生变化时,Lost(Keyboard)Focus事件就会触发。

但我不想知道一个孩子何时失去对UserControl的另一个孩子的焦点,但我想知道,当键盘焦点移动到UserControl外部的元素并且它是Popup时。

有没有办法检测到这一点,而不检查每个元素的LostFocus?

这个解决方案适合你吗? 我在UserControl中创建了一个名为LostFocusIgnoreChildren新事件,仅当新的焦点元素不是此UserControl的子元素时才会触发。

UserControl1.cs

  public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } public event RoutedEventHandler LostFocusIgnoreChildren; private void UserControl_LostFocus(object sender, RoutedEventArgs e) { var focused_element = FocusManager.GetFocusedElement(Application.Current.Windows.OfType().SingleOrDefault(x => x.IsActive)); var parent = (focused_element as FrameworkElement).TryFindParent(); if (parent == null && LostFocusIgnoreChildren != null) LostFocusIgnoreChildren(this, e); } } 

VisualTreeHelper扩展

  public static class VisualTreeHelperExt { public static T TryFindParent(this DependencyObject child) where T : DependencyObject { DependencyObject parentObject = GetParentObject(child); if (parentObject == null) return null; T parent = parentObject as T; if (parent != null) { return parent; } else { return TryFindParent(parentObject); } } public static DependencyObject GetParentObject(this DependencyObject child) { if (child == null) return null; ContentElement contentElement = child as ContentElement; if (contentElement != null) { DependencyObject parent = ContentOperations.GetParent(contentElement); if (parent != null) return parent; FrameworkContentElement fce = contentElement as FrameworkContentElement; return fce != null ? fce.Parent : null; } FrameworkElement frameworkElement = child as FrameworkElement; if (frameworkElement != null) { DependencyObject parent = frameworkElement.Parent; if (parent != null) return parent; } return VisualTreeHelper.GetParent(child); } }