DockPanelSuite 是 Winform 中优秀的布局控件,但是这次使用过程中却出了个问题。
我遇到的问题是这样的,主窗体是通过 ShowDialog
显示的,子窗体的停靠状态为 DockState.Document
,主窗体关闭时,并未真正 Close
,仅是 Hide
。
然后问题来了
问题1:在主窗体 Load
事件中直接 Show
子窗体,关闭主窗体后再次打开,报错 创建窗口句柄时出错。
这个问题临时处理,改为不在
Load
事件中默认打开子窗体。
问题2:打开子窗体后关闭主窗体,再次打开主窗体(注意:子窗体并未关闭),这时候,子窗体内的所有控件不显示。这个问题困扰了我很久,一直找不到解决方案,后来再跟同事说起这个 bug 的时候忽然就想到了。
首先,子窗体中控件不显示,但是关闭子窗体后再打开,控件是正常显示的。于是我就想到,是不是要在主窗体显示完毕后再打开子窗体,就不会有这个问题了呢?
我先将显示子窗体的方法,从Load
事件中移动到Shown
事件中,结果第一个问题解决了,第二个问题依然存在。然后我想到的是,在关闭主窗体时,移除子窗体。因为主窗体显示后,点击按钮打开子窗体,是没有问题的,那么我就想模拟出这个流程。结果,失败了。问题依旧存在。
我确定,只有在
State = DockState.Document
时才会有这个 bug,我就在关闭主窗体时,将子窗体的State
属性改成了DockState.DockLeft
,事实证明有效果,子窗体控件显示正常,虽然布局有点问题,但最主要的问题解决了,一切就好办了。最后,我在主窗体关闭时,将子窗体的State
设成了DockState.Hidden
。至此 BUG 完美解决。