WPF UserControl检测到LostFocus忽略子项 [英] WPF UserControl detect LostFocus ignoring children

查看:480
本文介绍了WPF UserControl检测到LostFocus忽略子项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个UserControl帽子包含几个元素(ListBoxes,Buttons)和一个弹出式的组合框和按钮。

我试图在用户控制失去焦点,但每当在UserControl中的焦点发生变化,Lost(Keyboard)Focus事件触发。

但是我不想知道孩子何时失去焦点到UserControl的另一个孩子,但我想知道,当键盘焦点移动到一个元素之外的用户控件,它的弹出。

有没有一种方法来检测,而不检查LostFocus的每一个元素?

解决方案

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

UserControl1.cs

  public partial class UserControl1:UserControl 
{
public UserControl1 ()
{
InitializeComponent();
}

公共事件RoutedEventHandler LostFocusIgnoreChildren;
private void UserControl_LostFocus(object sender,RoutedEventArgs e)
{
var focused_element = FocusManager.GetFocusedElement(Application.Current.Windows.OfType< Window>()。SingleOrDefault(x => x 。活跃));
var parent =(focused_element作为FrameworkElement).TryFindParent< UserControl1>();
if(parent == null&& LostFocusIgnoreChildren!= null)
LostFocusIgnoreChildren(this,e);




$ b

VisualTreeHelper扩展

$ pre $ public $ {
$ public $ {


public static T TryFindParent< T>(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< T>(parentObject);


$ b $ public static DependencyObject GetParentObject(this DependencyObject child)
{
if(child == null)return null;
ContentElement contentElement = child作为ContentElement;
if(contentElement!= null)
{
DependencyObject parent = ContentOperations.GetParent(contentElement);
if(parent!= null)返回父项;
FrameworkContentElement fce = contentElement作为FrameworkContentElement;
返回fce!= null? fce.Parent:null;
}
FrameworkElement frameworkElement = child作为FrameworkElement;
if(frameworkElement!= null)
{
DependencyObject parent = frameworkElement.Parent;
if(parent!= null)返回父项;
}
返回VisualTreeHelper.GetParent(child);
}
}


I have a UserControl hat contains several elements (ListBoxes, Buttons) and a Popup with ComboBoxes and Buttons.

I tried lost focus on the user contorl, but whenever the focus inside the UserControl changes, the Lost(Keyboard)Focus event fires.

But I don't want to know when a child loses focus to another child of the UserControl, but I want to know, when the keyboard focus moves to an element outside the UserControl and it's Popup.

Is there a way to detect that, without checking the LostFocus of every single element?

解决方案

Does this solution suit you? I've created new event, called LostFocusIgnoreChildren in the UserControl, which fires only if new focused element is not a child of this 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<Window>().SingleOrDefault(x => x.IsActive));
            var parent = (focused_element as FrameworkElement).TryFindParent<UserControl1>();
            if (parent == null && LostFocusIgnoreChildren != null)
                LostFocusIgnoreChildren(this, e);
        }
    }

VisualTreeHelper extensions

 public static class VisualTreeHelperExt
    {
        public static T TryFindParent<T>(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<T>(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);
        }
    }

这篇关于WPF UserControl检测到LostFocus忽略子项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆