【发布时间】:2016-11-02 13:53:45
【问题描述】:
当点击表单中的任何其他位置时,是否有直接的方法使TextBox 失去焦点,无论被点击的东西本身是否可以接收焦点(例如工具栏按钮、工具栏和/或客户区空白空间等)?也就是说,失焦点击事件可能发生在其他各种对焦点控件一无所知的控件上。
这个问题与this one 和this 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