2016-12-01 50 views
0

禁用所有控件並重新啓用它們後,焦點矩形和文本框脫字符將丟失(vs2012/.NET Framework v4.5)。禁用所有控件後,WinForms窗體部分失去焦點

要重現此問題,只需創建一個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

沒關係,我發現只是調用this.Focus()後啓用控件修復問題。 –

回答

0

這意外的行爲,可以通過調用形式對焦()方法來固定:

private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    textBox1.Enabled = false; 

    button1.Enabled = true; 
    textBox1.Enabled = true; 

    this.Focus(); 
} 

的ACTIVECONTROL調用焦點()後不改變,那麼這個作品對我非常好。