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); } }
- 如何在Java Android Studio中的新线程上启动进程? (要求相当于C#代码)
- 通过c#winform中的TabIndex获取元素的文本
- 如何使用tfs 2013与服务架构持续集成?
- 无法转换对象类型’System.String ‘以键入’System.String ‘
- 如何使用Linq对二维数组进行排序?
- CodeDomProvider.CompileAssemblyFromSource – 找不到Roslyn(csc.exe)
- 怎样恢复能在asp.net中使用c#下载文件 – >最好的方法(对于大文件也是如此)
- Xamarin.Forms无法安装包
- Action(arg)和Action.Invoke(arg)之间的区别