通过再次单击文本框来散焦

本文关键字:文本 单击 | 更新日期: 2023-09-27 18:04:45

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

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的Click-event,所以我不能通过在TextBox周围单击GroupBox来使TextBox散焦。或者我可以吗?

通过再次单击文本框来散焦

可以使用

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

您还可以注册以下事件:

public event MouseButtonEventHandler PreviewMouseLeftButtonDown

当你每次点击文本框时,这个事件都会触发,因此你可以在那里设置焦点。

对于Winforms也有一种方法。我不是很精通,但这里有一个方法:创建一个文本框(例如命名为textBoxFocus),它位于你的窗口外。例如,将其大小设置为1,1,并将其移动到-10,-10。然后可以注册到Click事件并写入

textBoxFocus.Focus();

这是一个有点迂回的方法,但应该达到你想要的。

感谢private_meta给我正确的方向(在评论中)!我用click事件设置标志,在设置标志之前,测试是否设置了标志。所以第一次点击找不到旗帜,但第二次会。在文本框Enter-event(在Click-event之前触发)中清除标志。现在每次点击都会聚焦和散焦文本框,就像我想要的那样。

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";
}

一种简单的方法是,您可以在这里使用bool标志。算法:

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

我希望我能满足你的查询,你可以按照这个算法。