禁用所有控件后,焦点矩形和文本框插入符将丢失,然后再次启用它们(vs2012 / .NET Framework v4.5)。
要重现此问题,只需创建一个WinForms应用程序项目,在表单中添加一个按钮和一个文本框,然后使用此代码在按钮单击事件中禁用和启用这两个控件:
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
textBox1.Enabled = false;
button1.Enabled = true;
textBox1.Enabled = true;
}
您可以按预期使用Tab / Shift + Tab在文本框和按钮之间循环,直到您按下按钮。
之后,焦点部分丢失(很奇怪)。您仍然可以使用Tab / Shift + Tab和箭头在控件之间进行交叉,然后按Enter键激活按钮,但不能键入文本框,也不能使用空格键按下按钮。文本框插入符号和按钮焦点矩形不再显示。将焦点更改为另一个应用程序然后返回到此表单将解决焦点问题。
如果您未禁用至少一个能够获得焦点的控件,则不会发生此问题。此外,通过禁用并再次启用表单来恢复焦点行为,如下所示:
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
textBox1.Enabled = false;
button1.Enabled = true;
textBox1.Enabled = true;
this.Enabled = false;
this.Enabled = true;
}
我试图在任务开始时禁用更复杂表单的所有控件,因此任务将在完成后再次启用所有控件,以防止用户在处理期间输入,但不锁定UI线程。我认为它与跨线程调用调用有关,但我发现即使所有代码都在UI线程上运行,也会出现此问题。
答案 0 :(得分:0)
可以通过调用Focus()方法来修复这种不受欢迎的行为:
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
textBox1.Enabled = false;
button1.Enabled = true;
textBox1.Enabled = true;
this.Focus();
}
调用Focus()后,ActiveControl不会更改,所以这对我来说效果很好。