【发布时间】:2011-04-21 09:44:22
【问题描述】:
我有一个带有选项卡控件的 MDI 应用程序。在某些机器上,打开新选项卡时出现“创建窗口句柄时出错”异常。这只发生在某些机器上,主要是慢速机器。 使用 .NET Framework 4.0。
过去几天我一直在调查这个问题,这让我发疯了!我在 MSDN 论坛上找到了以下内容 Hans Passant 的解决方案MSDN Forum 根据答案,它与处于最大化状态的活动 MDI 孩子有关。给定的解决方案是在显示新选项卡之前将活动子项设置为正常窗口状态,然后再将其恢复。此解决方案有效,但我真的不喜欢解决方法导致的闪烁。
堆栈跟踪如下:
创建窗口句柄时出错:
在 System.Windows.Forms.NativeWindow.WindowClass.Callback(IntPtr hWnd,Int32 消息, 在 System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) 在 System.Windows.Forms.Control.CreateHandle() 在 System.Windows.Forms.Form.CreateHandle() 在 System.Windows.Forms.Control.get_Handle() 在 System.Windows.Forms.Form.SetVisibleCore(布尔值) 在 System.Windows.Forms.Control.Show() 在 WinForms\Forms\Tabs\TabManager.cs 中的 Client.UI.WinForms.Controls.TabManager.OpenNewTab(BaseTab2 选项卡):第 82 行 在 WinForms\Forms\Tabs\TabManager.cs 中的 Client.UI.WinForms.Controls.TabManager.OpenTab(BaseTab2 选项卡):第 183 行 在 WinForms\Forms\MainForm.cs:line 4372 中的 Client.UI.WinForms.MainForm.buttonLicenses_Click(Object sender, EventArgs e)代码:
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);
}
}
更新:在Microsoft support找到这个
当以下两个条件都为真时,就会发生这种情况。
- MDI 子窗体包含一个作为其他控件父级的控件。
- MDI 子窗体上的父控件从 Layout 或 Resize 事件的事件处理程序中的 Controls 集合中删除一个子控件。
【问题讨论】:
-
所以基本上,您正在寻找Hans 在MSDN 线程中提出的解决方案的替代?一种避免闪烁的?
-
可以通过调用SuspendLayout/ResumeLayout避免闪烁吗?