發現一個.Net中動態載入控制項時關於焦點方面的Bug
來源:互聯網
上載者:User
動態|載入|控制項 今天寫一個系統架構的時候用到了動態載入,調試的時候發現程式經常會出現死結的情況,而且死結的時候還會開啟一個“WindowsFormsParkingWindow”後台進程,跑到網上查了半天關於WindowsFormsParkingWindow的資料,結果中文的一篇沒找到,蠅文的倒有幾篇,對著金山詞霸費了九牛二虎之力還沒看出個道道來。後來乾脆建立了一個項目,唯寫了幾行代碼,結果啟動並執行時候發現還是會有死縮的情況:
1、建立一個windows應用程式
2、添加一個UserControl,命名為UserControl1,
3、在UserControl1中添加一個控制項,隨便什麼控制項,只要是能獲得焦點的都行(Label、Panel等不行)
4、在UserControl1.cs中添加一個方法Test:
public void Test()
{
MessageBox.Show("This is a test!");
}
5、在Form1.cs中添加一個類級變數:private UserControl1 curObj;
6、在Form1中添加一個Panel,命名為Panel1
7、在Form1中添加一個菜單,並添加兩個功能表項目,命名為menuItemAdd和menuItemMsg;
8、在功能表項目menuItemAdd的click事件中添加代碼:
panel1.Controls.Clear();
curObj = new UserControl1();
panel1.Controls.Add(curObj);
9、在功能表項目menuItemMsg的click事件中添加代碼:
if (curObj != null)
curObj.Test();
運行程式,請依次點擊menuItemAdd、menuItemMsg、menuItemAdd、menuItemMsg;注意:在這些操作中間不要點擊其他地方,發現沒有,在第二個MessageBox對話方塊彈出之後程式死了,用Alt+Tab後發現有一個名為“WindowsFormsParkingWindow”的東西在列表中。
後來發現在第一次點擊menuItemMsg彈出對話方塊之後點一下UserControl1或者在Form1中添加一個可以獲得焦點的控制項以後程式都不會死,或者在 panel1.Controls.Add(curObj);後面加了一句curObj.Focus();之後問題也可以解決,我想應該是在第二次動態載入的時候由於先把Panel1中的對象銷毀了,表單的也就沒有焦點了,在第二次彈出對話方塊之後,系統找不到當前活動表單的焦點了,所以程式會死,而當我們滑鼠點擊一下或者在程式中置一下之後就不會有這樣的問題了。
想來想去,問題雖然解決了,總覺得雖然我在寫程式的時候的確應該在動態載入對象之後就設焦點,但就算我遺漏了,.Net再怎麼說也不應該什麼都不處理就讓系統死掉還弄個莫名其妙的WindowsFormsParkingWindow吧?至少應該幫我置一下或者拋出一個異常吧?我想這應該算是.Net的一個Bug吧,已經反饋給Microsoft了,見http://www.mscommunity.com/communitywish/ViewWish.aspx?WishID=25990,希望Microsoft下一個版本能夠改掉吧。