【问题标题】:Remove Focus from TextBox by Clicking Anywhere/Anything Else通过单击任何位置/任何其他内容从 TextBox 中删除焦点
【发布时间】:2016-11-02 13:53:45
【问题描述】:

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

这个问题与this onethis one 非常相似,但其中的答案并不完整,因为它们没有就何时执行操作(即什么事件在什么控件上)提供任何建议。

我有一个表单(UserControl 子类),面板上有可拖动的小部件以及几个工具栏。可拖动小部件由PictureBoxes 和Labels 组成。双击小部件的标签会将标签替换为TextBox,以允许用户重命名组件。目的是在单击 anywhere 时强制焦点离开TextBox,以进行验证(就像用户按下 Enter 键一样)。

以下是层次结构的简要说明:

用户控制 +- 工具条容器 +- ToolStripConainer.TopToolStripPanel | +- 工具条 +- ToolStripContainer.RightToolStripPanel | +- 工具条 +- ToolStripContainer.ContentPanel +- CompositorPanel(Panel 的子类以提供适当的透明度) +- UserControl(可拖动小部件) +- 图片框 +- 标签 +- 文本框

我可以将事件处理程序添加到表单上的各种其他组件,以强制聚焦的 TextBox 取消聚焦(即以编程方式将焦点移动到另一个元素),但这看起来很笨拙,并且需要不相关的元素来了解当前 -重点文本框。

我尝试在最外层的类上覆盖OnMouseDown(包含UserControl,基于here 提出的想法),但从未调用过该方法。

【问题讨论】:

  • “散焦”是错误的概念。您需要将焦点放在其他地方
  • 语义。控件失去焦点。无论下一个点击的东西是否可聚焦,我都需要它失去焦点。这意味着我必须把重点放在其他事情上,这一事实是无关紧要的。重要的问题是何时实现这一目标。我会尝试改写我的问题以明确这一点。

标签: c# .net winforms user-controls


【解决方案1】:

为了检测鼠标是否在文本框外的任何地方单击,需要mouse hook,或者您可以通过在 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 处于“编辑模式”时运行(即文本框可见等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2010-11-05
  • 2017-11-08
相关资源
最近更新 更多