设计时拖放

Cle*_*man 5 c# design-time drag-and-drop

我目前正在开发一个项目,我的部分是设计一个Design Surface,最终用户可以在运行时添加/删除/移动控件.

我按照本教程"由Tim Dawson主持Windows窗体设计器",几乎已经实现了我需要的所有功能.

短篇小说对于那些谁不想读教程:我实现了IDesignerHost,IContainer,ISelectionService,IToolboxService和其他一些界面,创建我的设计图面.我没有使用System.ComponentModel.Design.DesignSurface已经在框架中,主要是因为我需要一个真正的自定义设计表面.

题 :

我想允许用户拖放新ControlIToolboxServiceIDesignerHost/IContainer.在本教程中,您可以Control在工具箱中单击,在设计图面上单击以添加控件.

我发现了什么:

  • 有一个内置的功能可以自动拖放 IToolboxService, System.ComponentModel.Design.DesignSurface但如果你从零开始实现IDesignerHost,它显然无法正常工作.
  • 使用该 Control.DoDragDrop(ToolboxItem) 方法时,要启动拖放操作:

    1. IToolboxService.SerializeToolboxItem(ToolboxItem) 被调用来序列化项目
    2. IToolboxService.IsToolboxItem(object)
      IToolboxService.IsSupported(object) 调用以评估是否
      允许在设计图面上对序列化的ToolboxItem进行droped
    3. 当您放下控件时:IToolboxService.DeserializeToolboxItem(object serializedObject)由设计表面调用以反序列化控件.
  • IToolboxService.SetCursor() 被调用以了解您是否定义了自定义光标,或者让标准窗口光标.

问题:

我实现了上面提到的所有内容,在"我发现了什么"中,但拖放是错误的:

  • 我拖动,一切都很好,但当悬停在设计表面时,我的光标在标准光标和" DragDropEffects.Copy"样式之间略微闪烁.
  • 当我放下时,没有任何反应,当我的光标离开设计表面时(在我放下之后),然后Control创建新的并添加到我丢弃它的地方.

有没有人试图做我正在做的事情,如果有的话,你是如何管理它的?有没有人有任何指针/链接/好建议?

谢谢=)

Ste*_*pel 3

有人有任何指针/链接/好的建议吗?

您的问题似乎已通过 Microsoft Connect 问题Mouse Events Consumed/Not Raising in 2.0 Designers得到解决。这个问题很容易理解,但显然从 .NET Framework 1.1 (2003) 到 2.0 (2006) 的升级意味着拖放行为的变化 - 鉴于您提到的文章源于 2003 年,这很可能是相关的。具体来说,您应该向前滚动到第 Issue 2部分,引文:

现在,在表单上拖动时,您会注意到不断闪烁。这部分是由 2.0 中新的拖放行为引起的。

我自己现在无法深入研究这个问题,但您也许还可以从设计器中的自定义拖放中找出一些东西,它解决了 Visual Studio 版本 2003 和 2005 之间有关拖放的行为变化;这很可能是相关的,并且已接受的答案之一实际上具体引用了上面的 Microsoft Connect 问题,而且它还提供了更多可能解决方案的提示。