当子元素失去焦点时,防止LostFocus被触发

bin*_*eol 6 c# wpf user-controls lostfocus

我有一个用户控件,有几个子元素,包括复选框和文本框.

我想在整个用户控件上丢失焦点时触发我的用户控件的LostFocus事件(例如,单击用户控件外部的按钮).

目前,当我在用户控件的子元素之间移动时,LostFocus事件也会触发,例如从一个文本框移动到另一个文本框.

Jen*_*cke -1

protected override void OnLostFocus(EventArgs args)
{
      if (!ContainsFocus)
      {
          // Only do something here
      }
}
Run Code Online (Sandbox Code Playgroud)

诀窍是检查 ContainsFocus

在构造函数中,您可能必须添加类似于以下内容的代码,以通过调用来捕获子控件失去的焦点(因为当它们失去焦点到其他地方时,您不会收到直接通知)

CaptureLostFocus(this);
Run Code Online (Sandbox Code Playgroud)

并实施:

void CaptureLostFocus(Control control)
{
      foreach(Control child in control.Controls)
      {
           child.LostFocus += (s, e) => OnLostFocus(e);
           CaptureLostFocus(control);
      }
}
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,WPF 中没有 ContainsFocus 可供检查 (4认同)