C# 通过单击任意位置/任何其他内容从文本框中删除焦点

C# 通过单击任意位置/任何其他内容从文本框中删除焦点,c#,.net,winforms,user-controls,C#,.net,Winforms,User Controls,当在表单中的任何其他位置单击时,是否有直接的方法来解除文本框的焦点,无论单击的对象本身是否可以接收焦点(例如工具栏按钮、工具栏和/或客户端区域空白等)?也就是说,去聚焦单击事件可能发生在对聚焦控件一无所知的各种其他控件上 这个问题与and非常相似,但答案不完整,因为它们没有提供任何关于何时执行操作的建议(即,在什么控制下执行什么事件) 我有一个表单(一个UserControl子类),在面板上有一个可拖动的小部件以及几个工具栏。可拖动小部件由PictureBoxes和Labels组成。双击小部件的

当在表单中的任何其他位置单击时,是否有直接的方法来解除
文本框的焦点,无论单击的对象本身是否可以接收焦点(例如工具栏按钮、工具栏和/或客户端区域空白等)?也就是说,去聚焦单击事件可能发生在对聚焦控件一无所知的各种其他控件上

这个问题与and非常相似,但答案不完整,因为它们没有提供任何关于何时执行操作的建议(即,在什么控制下执行什么事件)

我有一个表单(一个
UserControl
子类),在面板上有一个可拖动的小部件以及几个工具栏。可拖动小部件由
PictureBox
es和
Label
s组成。双击小部件的标签将标签替换为
文本框
,以允许用户重命名组件。其目的是在单击其他任何位置时,强制焦点离开
文本框
,以进行验证(就像用户按下了Enter键一样)

下面是对继承权的简要介绍:

UserControl +- ToolStripContainer +- ToolStripConainer.TopToolStripPanel | +- ToolStrip +- ToolStripContainer.RightToolStripPanel | +- ToolStrip +- ToolStripContainer.ContentPanel +- CompositorPanel (subclass of Panel to provide proper transparency) +- UserControl (draggable widget) +- PictureBox +- Label +- TextBox 用户控制 +-ToolStripContainer +-ToolStripConainer.TopToolStripPanel |+-ToolStrip +-ToolStripContainer.RightToolStripPanel |+-ToolStrip +-ToolStripContainer.ContentPanel +-复合面板(提供适当透明度的面板子类) +-用户控件(可拖动小部件) +-图片盒 +-标签 +-文本框 我可以将事件处理程序添加到表单上的各种其他组件,以强制聚焦文本框取消聚焦(即以编程方式将焦点移动到另一个元素),但这似乎很麻烦,需要不相关的元素才能知道当前聚焦的文本框


我尝试在最外层的类上覆盖
OnMouseDown
(根据提出的想法,包含所有内容的
UserControl
),但该方法从未被调用。

为了检测鼠标是否在文本框外的任何位置被单击,需要,或者,您可以通过在用户控件上放置计时器来尝试一个简单的破解:

public UserControl1() {
  InitializeComponent();
  mouseTimer.Interval = 16;
  mouseTimer.Tick += mouseTimer_Tick;
  mouseTimer.Enabled = true;
}

private void mouseTimer_Tick(object sender, EventArgs e) {
  if (this.ActiveControl != null && this.ActiveControl.Equals(textBox1)) {
    if (MouseButtons != MouseButtons.None) {
      if (!textBox1.ClientRectangle.Contains(textBox1.PointToClient(MousePosition))) {
        if (this.ParentForm != null) {
          this.ParentForm.ActiveControl = null;
        } else {
          this.ActiveControl = null;
        }
      }
    }
  }
}

“去聚焦”是错误的概念。你需要把焦点放在别的地方。控件正在失去焦点。我需要它失去焦点,无论下一个点击的东西是否可聚焦。这意味着我必须把注意力放在其他事情上,这一事实是无关紧要的;重要的问题是何时实现这一目标。我将试着把我的问题改写清楚。这种计时方法在我的情况下似乎是有用的。我对其进行了修改,使计时器仅在UserControl处于“编辑模式”(即文本框可见等)时运行。