我目前正在从事一个项目,我的职责是设计一个设计表面,最终用户可以在运行时添加/删除/移动控件。
我遵循了本教程“Hosting Windows Forms Designers, by Tim Dawson”,并且几乎实现了我需要的所有功能。
给那些不想阅读教程的人的短篇故事:我实现IDesignerHost
、IContainer
、ISelectionService
和IToolboxService
其他一些界面,以创建我的设计界面。我没有使用System.ComponentModel.Design.DesignSurface
已经在框架中的,主要是因为我需要一个真正定制的设计表面。
问题 :
Control
我想允许用户将新的从拖放IToolboxService
到IDesignerHost/IContainer
. 在本教程中,您Control
单击工具箱中的一个,单击设计表面以添加控件。
我发现了什么:
IToolboxService
有一个内置功能可以自动从to 拖放 ,System.ComponentModel.Design.DesignSurface
但如果您从无到有实现 IDesignerHost,它显然不起作用。当您使用该
Control.DoDragDrop(ToolboxItem)
方法时,启动拖放:IToolboxService.SerializeToolboxItem(ToolboxItem)
被调用来序列化项目IToolboxService.IsToolboxItem(object)
并被
IToolboxService.IsSupported(object)
调用以评估是否
可以允许将序列化的 ToolboxItem 拖放到设计图面上- 当您放置控件时:
IToolboxService.DeserializeToolboxItem(object serializedObject)
由设计图面调用以反序列化已放置的控件。
IToolboxService.SetCursor()
调用以了解您是定义自定义光标还是让标准窗口光标。
问题 :
我在“我发现了什么”中实现了上面提到的所有内容,但是拖放是错误的:
- 我拖动,一切都很好,但是当悬停在设计表面时,我的光标在标准光标和“
DragDropEffects.Copy
”样式之间闪烁了一下。 - 当我放下时,什么也没有发生,当我的光标离开设计表面时(在我放下之后),然后新
Control
的被创建并添加到我放下它的地方。
有没有人尝试过我正在做的事情,如果有,你是如何做到的?有没有人有任何指针/链接/好的建议?
谢谢你=)