日期:2014-05-17  浏览次数:20876 次

WeifenLuo.WinFormsUI.Docking的窗体改变dock状态后,其句柄也变化了。为什么?
最近用了WeifenLuo.WinFormsUI.Docking的控件,界面相当好看。但带来一个问题:
一个子窗体A是基于WeifenLuo.WinFormsUI.Docking的,改变其dock状态后,窗体句柄也变化了,估计是在鼠标拖曳完成过程中重新show时生成了新的句柄。但因为我在子窗体A中内嵌了另外一个程序的窗体,当子窗体A的句柄变化时,另一个程序窗体因找不到原句柄而退出。

想了很多招也不能解决。包括:限制子窗体A不能改变dock状态(为fill状态),但双击其标题仍然可变为悬浮状态,句柄一样变了;也找不到鼠标拖曳改变dock状态的这个事件。

请各位帮我想想办法。谢谢。

------解决方案--------------------
因为改变DockState时候,它会调用 DockPanel.DockPaneFactory.CreateDockPane 方法在不同停靠位置创建不同的子窗口,所以窗口句柄会变。
你可以注册它的DockStateChanged事件,在停靠位置改变的时候,重新设置下你自己的窗体所记录的窗口句柄。

------解决方案--------------------
你reflect翻编译一下那个控件
为什么会handle改变,有可能是那个控件重新创建了

------解决方案--------------------
按照人家高层次的组件接口来编写你的程序,千万不要硬要按照人家内部低级的机制来编写你的程序。人家的组件随时可能重构(在2个月以后的下一个版本,或者在其它机器上,或者有你根本不理解的复杂内部机制),所以不要按照低级的机制设计你的程序。

你做的东西依赖于什么“窗口句柄”,这就是你的不对了。说明你的组件跟人家的平台“不适配”。