我目前正在参与一个项目,我的任务是设计一个设计表面,让最终用户可以在运行时添加/删除/移动控件。
我遵循了这个教程"《托管 Windows 窗体设计器》by Tim Dawson", 已经几乎实现了我所需的所有功能。
我遵循了这个教程"《托管 Windows 窗体设计器》by Tim Dawson", 已经几乎实现了我所需的所有功能。
不想阅读教程的人的短篇小说:我实现了IDesignerHost
, IContainer
, ISelectionService
, IToolboxService
以及其他一些接口,来创建我的设计界面。我没有使用框架中已经存在的System.ComponentModel.Design.DesignSurface
,主要是因为我需要一个非常定制化的设计界面。
问题:
我希望允许用户从IToolboxService拖放新的控件到IDesignerHost/IContainer中。在本教程中,您可以在工具箱中单击一个控件,然后单击设计表面以添加该控件。我找到的内容:
- 有一个内置功能可以自动从
IToolboxService
拖放到System.ComponentModel.Design.DesignSurface
,但如果您从头实现IDesignerHost,则明显无法工作。 当您使用
Control.DoDragDrop(ToolboxItem)
方法启动拖放时:- 调用
IToolboxService.SerializeToolboxItem(ToolboxItem)
对项进行序列化 - 调用
IToolboxService.IsToolboxItem(object)
和
IToolboxService.IsSupported(object)
以评估是否可以允许将序列化的ToolboxItem删除在设计表面上 - 当您放下控件时:
IToolboxService.DeserializeToolboxItem(object serializedObject)
由设计表面调用以反序列化已删除的控件。
- 调用
调用
IToolboxService.SetCursor()
以了解是否定义了自定义光标,还是使用标准Windows光标。
问题:
我已经按照上述所有内容进行了实现,在"What i've found"中,但是拖放功能存在一些问题:- 我拖动时一切正常,但当悬停在设计表面上时,我的光标会在标准光标和"
DragDropEffects.Copy
"样式之间闪烁。 - 当我放下时,什么也不会发生,当我的光标离开设计表面(放下后),新的
Control
就会被创建并添加到我放下的位置。
是否有人尝试过我正在做的事情?如果是这样,你是如何处理的? 是否有任何指针/链接/好建议可以提供?
谢谢=)