【问题标题】:textbox not losing focus文本框不会失去焦点
【发布时间】:2011-08-30 05:54:49
【问题描述】:

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

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

this.Focus(); //where this is mainform.

但这似乎不起作用,因为Textbox 仍然继续接收所有密钥。我对Form 和Textbox 都有一个KeyDown 事件处理程序,并且我检查了所有KeyDown 事件是否都传递到了TextBox。我还有一个 TextBox Leave 事件处理程序,它永远不会被调用。

TextBox 是窗体上的唯一控件,主窗体用于绘制形状(如果重要的话)。

那么,当用户点击它之外时,我怎样才能使这个TextBox 失去焦点。

【问题讨论】:

  • 关注@mmorel1 的链接,您需要有另一个可见=true 但超出表单范围的控件。例如 Textbox1.Left=-20;
  • @Jeremy Thompson:在这种情况下,焦点将转移到该文本框,我的主窗体将停止接收密钥。例如,在主窗体上的 Escape 按钮上,我隐藏了窗体。那是不可能的。知道该怎么做吗?

标签: c# winforms textbox drawing


【解决方案1】:

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

【讨论】:

  • 默认情况下,KeyPreview 是 False,这意味着 Keys 不被父级即 mainform 预览。我尝试将其设置为 True,但这也不起作用。
【解决方案2】:

如果您将表单KeyPreview 属性设置为true,您的表单将首先有机会处理您所做的任何击键。如果它是您想要处理的事情,即如上面评论中的转义,请在表单的 KeyDownEvent 中处理它并将其标记为已处理,这样您的文本框就不会看到它。

从上面的 Msdn 页面:

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

【讨论】:

    【解决方案3】:

    我想早在 11 年这行不通,但现在

    this.ActiveControl = null;
    

    工作正常。但是,如果您打算使用 Tab 来循环控件,则可以使用合适的 TabIndex 聚焦标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多