如左图所示,我新做了一个可以停靠的窗体,并在窗体中添加了treeView控件。当我按住主窗体标题栏拖动窗体的时候,出现了一个错误!窗体里的TreeView不见了。请问各位大神这个问题怎么解决呢?很影响体验呀。
Bentley.MicroStation.WinForms命名空间下有一个IGuiDockable的接口,您的窗体类继承一下这个接口,这个接口有两个方法GetDockedExtent和WindowMoving。分别是在窗口被停靠和窗口移动及大小改变时别调用,可以在这两个方法里边控制一下窗体的行为。
老师您好,我知道您说的这个接口,在初始化这个窗口的时候,是不是要加上myForm.AttachAsGuiDockable(MSAddin.s_addin, "FormMain");的代码,我试了下,发现这个样式的窗体可以实现停靠,但是停靠的风格却不好看。。我希望它能拥有类似于主任务窗体类似的风格。而不是向下图这样光秃秃的。于是我使用了TopLevelForm,使用如下代码:
FrmMain myForm = new FrmMain();
WindowContent m_windowContent = WindowManager.GetForMicroStation().DockPanel(myForm, myForm.Name, myForm.Text, DockLocation.Right);
m_windowContent.CanAutoHide = true;
m_windowContent.CanDockHorizontally = false;
...
myForm.AttachAsTopLevelForm(MSAddin.s_addin, false);
myForm.Show();
成功实现了如主任务相同的停靠和样式。包括拖动时出现停靠按钮。但在拖动主窗体的过程中却会丢失内容。
请教老师,addins能完美实现我的这个需求吗?
您使用的是toolSetting窗体呀,toolSetting本身就是可以停靠的。不会出问题。但是很多情况下无法去使用toolSetting窗体,以为在我切换下一个命令的时候toolSetting窗体就会重置,我希望停靠的是一个topLevelForm这样就像microStation自身的主任务窗体一样,可以一直出现在停靠的位置。
TopLevelForm也行啊,用这个命令“csaddins demoform toplevel”
您的项目里面的topLevel使用的也是toolSetting窗体。
ACADKeyins.zip
试试这个窗体,程序加载后会直接调出窗体。我用的是 AttachAsGuiDockable。但是也是可以停靠的。我这个窗体只能停靠到上下。您可以参考一下改成可以停靠到左右。
很好的 WindowContent 这个动态库是Bentley.Windowing.dll
该问题的解决方法,已经找到了。使用WindowContent的窗体不需要将其AttchtoTopLevel()只要不加这句代码,窗体自然可以停靠,拖动也不会消失。
Answer Verified By: Yongan.Fu
感谢您的分享!WinForm和MicroStation密切配合方面确实缺乏资料。SDK中带有的大量例子还是主要用C++在编程,界面都是用的Bentley特有的.r写出来的。
符老师您客气了,当初也是看了您一步一步学习addin的博客,才得到的启发。原来,不只有topLevel,toolsetting,guiDockable,这些类型窗体。什么都不attach也算一种。