我正在制作一个设置表单,用户可以在其中为应用程序分配自定义热键。有一个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进行散焦。或者我可以以某种方式?
答案 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;
我希望我能满足您的查询,您可以遵循此算法。