我有一個帶有選項卡控件的MDI應用程序。在某些機器上,當打開一個新選項卡時,出現「錯誤創建窗口句柄」異常。這隻發生在一些機器上,大多數是慢速機器。 使用.NET Framework 4.0。在.NET MDI應用程序中創建窗口句柄時出錯
我在過去的幾天裏一直在調查這個問題,它讓我瘋狂了!我在MSDN論壇上發現以下內容 Hans Passant在此MSDN Forum 的解決方案根據答案,它與處於最大化狀態的活動MDI子代有關。給出的解決方案是在顯示新選項卡之前將活動子窗口設置爲正常窗口狀態,然後再將其恢復。此解決方案的工作原理,但我真的不喜歡解決方法導致的閃爍。
堆棧跟蹤如下:
錯誤創建窗口句柄:
at System.Windows.Forms.NativeWindow.WindowClass.Callback(IntPtr hWnd, Int32 msg, at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) at System.Windows.Forms.Control.CreateHandle() at System.Windows.Forms.Form.CreateHandle() at System.Windows.Forms.Control.get_Handle() at System.Windows.Forms.Form.SetVisibleCore(Boolean value) at System.Windows.Forms.Control.Show() at Client.UI.WinForms.Controls.TabManager.OpenNewTab(BaseTab2 tab) in WinForms\Forms\Tabs\TabManager.cs:line 82 at Client.UI.WinForms.Controls.TabManager.OpenTab(BaseTab2 tab) in WinForms\Forms\Tabs\TabManager.cs:line 183 at Client.UI.WinForms.MainForm.buttonLicenses_Click(Object sender, EventArgs e) in WinForms\Forms\MainForm.cs:line 4372
代碼:
private void OpenNewTab(BaseTab2 tab)
{
tab.MdiParent = MainForm.Instance;
tab.WindowState = FormWindowState.Maximized;
tab.Show(); <----- [EXCEPTION THROWN HERE]
if (tab.Path != String.Empty)
{
RecentManager.Add(tab.Path);
RecentManager.SetOpen(tab.Path, true);
}
}
UPDATE:發現這在Microsoft support
可以發生這種情況時,這兩個以下條件屬實。
- MDI子窗體包含父母其他控件的控件。
- MDI子窗體上的父控件從Layout或Resize事件的事件處理程序中的Controls集合中刪除子控件。
所以基本上,你正在尋找一個*替代*解決方案漢斯建議在MSDN線程?一個避免閃爍? – 2011-04-21 11:07:18
你可以通過調用SuspendLayout/ResumeLayout來避免閃爍? – 2016-07-29 01:24:11