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处于“编辑模式”(即文本框可见等)时运行。