通过再次单击来散焦TextBox

时间:2014-05-23 16:05:45

标签: c# winforms textbox focus

我正在制作一个设置表单,用户可以在其中为应用程序分配自定义热键。有一个TextBox,用鼠标点击它,它会聚焦并等待一个按键然后散焦(通过聚焦另一个标签):

private void txtKey_KeyDown(object sender, KeyEventArgs e)
{
    e.SuppressKeyPress = true;
}

private void txtKey_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    TextBox textBox = (TextBox)sender;
    textBox.Text = e.KeyCode.ToString();
    label1.Focus();
}

有没有办法让聚焦的TextBox散焦(并取消关键辅助过程),可以通过鼠标再次点击它,或者点击它周围的GroupBox?我无法弄清楚如何在点击时检查TextBox是否已经被聚焦(因为在点击时,它会在我测试它是否集中之前得到集中)。当然我可以添加一个按钮"取消"在TextBox旁边,但那不是我想要的。

GroupBox没有Click事件,因此我无法通过单击它周围的GroupBox来对TextBox进行散焦。或者我可以以某种方式?

3 个答案:

答案 0 :(得分:0)

您可以使用

设置/删除焦点
Keyboard.Focus = null;

您还可以注册以下活动:

public event MouseButtonEventHandler PreviewMouseLeftButtonDown

每次单击TextBox时都会触发此事件,因此您可以根据需要设置Focus。

对于Winforms,也有一种方法。我不熟练,但这里有一种方式: 创建一个位于窗口外的textBox(例如命名为textBoxFocus)。将其大小设置为1,1并将其移至-10,-10。然后您可以注册Click事件并写入

textBoxFocus.Focus();

这有点迂回,但应该达到你想要的效果。

答案 1 :(得分:0)

感谢private_meta让我走向正确的方向(在评论中)!我使用click事件设置标志,在设置标志之前,测试是否设置了标志。所以第一次点击找不到标志,但第二次会找到。并且在文本框Enter-event(在Click-event之前触发)中清除标志。现在每个其他点击焦点和其他所有defocuses文本框,正如我想要的那样。

private void txtKey_Enter(object sender, EventArgs e)
{
    TextBox textBox = (TextBox)sender;
    textBox.Tag = null;
}

private void txtKey_Click(object sender, EventArgs e)
{
    TextBox textBox = (TextBox)sender;
    if (textBox.Tag != null) label1.Focus();
    textBox.Tag = "clicked";
}

答案 2 :(得分:0)

其中一个简单的方法是,你可以在这里使用bool标志。 算法:

By default, the bool value is 0;
If(Textbox Selected && flag = 0)
    Do your task; and flag = 1;

我希望我能满足您的查询,您可以遵循此算法。