C# WPF UserControl检测丢失焦点忽略子项
我有一个UserControl帽子,它包含几个元素(列表框、按钮)和一个带有组合框和按钮的弹出窗口 我试图在用户控件上失去焦点,但每当用户控件内的焦点发生变化时,就会触发失去(键盘)焦点事件 但是我不想知道当一个孩子的焦点丢失到UserControl的另一个孩子的时候,但是我想知道,当键盘焦点移动到UserControl之外的元素时,它会弹出C# WPF UserControl检测丢失焦点忽略子项,c#,wpf,user-controls,focus,C#,Wpf,User Controls,Focus,我有一个UserControl帽子,它包含几个元素(列表框、按钮)和一个带有组合框和按钮的弹出窗口 我试图在用户控件上失去焦点,但每当用户控件内的焦点发生变化时,就会触发失去(键盘)焦点事件 但是我不想知道当一个孩子的焦点丢失到UserControl的另一个孩子的时候,但是我想知道,当键盘焦点移动到UserControl之外的元素时,它会弹出 有没有一种方法可以在不检查每个元素的失焦的情况下检测到这一点?这个解决方案适合您吗?我在UserControl中创建了一个名为LostFocusIgnor
有没有一种方法可以在不检查每个元素的失焦的情况下检测到这一点?这个解决方案适合您吗?我在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<Window>().SingleOrDefault(x => x.IsActive));
var parent = (focused_element as FrameworkElement).TryFindParent<UserControl1>();
if (parent == null && LostFocusIgnoreChildren != null)
LostFocusIgnoreChildren(this, e);
}
}
公共部分类UserControl1:UserControl
{
公共用户控制1()
{
初始化组件();
}
公共活动路线包括游客、游客、失物招领者和儿童;
私有void UserControl\u LostFocus(对象发送方,RoutedEventArgs e)
{
var focused_element=FocusManager.GetFocusedElement(Application.Current.Windows.OfType().SingleOrDefault(x=>x.IsActive));
var parent=(聚焦的_元素作为FrameworkElement).TryFindParent();
if(parent==null&&LostFocusIgnoreChildren!=null)
失心儿童(本,e);
}
}
VisualTreeHelper扩展
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);
}
}
公共静态类VisualTreeHelperText
{
公共静态T TryFindParent(此DependencyObject子对象)
其中T:DependencyObject
{
DependencyObject parentObject=GetParentObject(子对象);
if(parentObject==null)返回null;
T parent=parentObject作为T;
如果(父项!=null)
{
返回父母;
}
其他的
{
返回TryFindParent(parentObject);
}
}
公共静态DependencyObject GetParentObject(此DependencyObject子对象)
{
if(child==null)返回null;
ContentElement=子元素作为ContentElement;
if(contentElement!=null)
{
DependencyObject parent=ContentOperations.GetParent(contentElement);
如果(parent!=null)返回parent;
FrameworkContentElement fce=作为FrameworkContentElement的contentElement;
返回fce!=null?fce.父项:null;
}
FrameworkElement FrameworkElement=作为FrameworkElement的子级;
if(frameworkElement!=null)
{
DependencyObject父对象=frameworkElement.parent;
如果(parent!=null)返回parent;
}
返回VisualTreeHelper.GetParent(子级);
}
}
您能分享一些代码吗?这样就更容易纠正你所犯的任何错误或解决任何意想不到的问题。也许你应该看看.Control.Leave是Windows.Forms。”如果你确实需要创建一个新的WPF控件,最简单的方法是创建一个从UserControl派生的类(…),如果你想通过向控件添加现有元素来构建控件,那么从UserControl派生的类是一个合适的模型,类似于构建应用程序的方式。(如果要在控件中使用模板,请改为从控件派生。)“-Source:另一种检查给定控件的焦点是否丢失以支持其(递归)子控件的方法是使用。