Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文本框不会失去焦点_C#_Winforms_Textbox_Drawing - Fatal编程技术网

C# 文本框不会失去焦点

C# 文本框不会失去焦点,c#,winforms,textbox,drawing,C#,Winforms,Textbox,Drawing,我有一个覆盖整个屏幕的表单。我有一个文本框,它通常是隐藏的,但当用户单击、拖动鼠标然后离开时会出现。之后,用户可以在文本框中输入任何值。一旦输入,理想情况下用户应该能够在文本框外单击,然后恢复正常服务 我所说的正常服务是指表单应该开始获取所有事件。到目前为止,我所做的是在TextBox的按键事件上;按Escape键时,我已将焦点设置为主窗体,如下所示: this.Focus(); //where this is mainform. 但这似乎不起作用,因为Textbox仍然不断接收所有的键。我有

我有一个覆盖整个屏幕的表单。我有一个
文本框
,它通常是隐藏的,但当用户单击、拖动鼠标然后离开时会出现。之后,用户可以在文本框中输入任何值。一旦输入,理想情况下用户应该能够在文本框外单击,然后恢复正常服务

我所说的正常服务是指表单应该开始获取所有事件。到目前为止,我所做的是在TextBox的按键事件上;按Escape键时,我已将焦点设置为主窗体,如下所示:

this.Focus(); //where this is mainform.
但这似乎不起作用,因为
Textbox
仍然不断接收所有的键。我有一个
KeyDown
事件处理程序,用于
Form
Textbox
,并且我已经检查了所有
KeyDown
事件是否传递到Textbox。我还有一个
TextBox
Leave事件处理程序,它从未被调用过

TextBox
是表单上的唯一控件,主表单用于绘制形状(如果有必要)


那么,当用户在文本框外单击时,如何使其失去焦点。

如果它像在VB中一样工作,我记得,请尝试将表单属性
KeyPreview
设置为false,以便所有键只传递给表单上的焦点控件。

如果将表单属性设置为true,您的表单有第一次机会处理您所做的任何击键操作。如果它是您想要处理的内容,如上面的注释中的转义,请在表单的KeyDownEvent中处理它,并将其标记为已处理,以便您的文本框不会看到它

从上面的Msdn页面:

当此属性设置为true时,表单将接收所有按键、按键向下和按键向上事件。表单的事件处理程序完成对击键的处理后,击键将被分配给具有焦点的控件


我想在11年的时候这没用,但是现在


很好。但是,如果您打算使用Tab循环控件,则可以使用合适的TabIndex聚焦标签。

默认情况下,KeyPreview为False,这意味着父项(即mainform)不会预览键。我尝试将其设置为True,但也不起作用。这里回答了这个问题:[[1]:按照@mmorel1的链接,你需要有另一个控件,该控件的visible=true,但超出表单边界。例如Textbox1.Left=-20;@Jeremy Thompson:在这种情况下,焦点将转移到该文本框,我的主表单将停止接收键。例如,在mainform上的Escape按钮上,我隐藏表单。这是不可能的。你知道怎么做吗那个
this.ActiveControl = null;