none
DesignSurface设计器如何实现用鼠标点击左侧的自定义工具栏中的控件来创建指定的控件 RRS feed

  • 问题

  • 请大牛们耐心听我讲,我还会奉上源码,给大家分享我的解决方案,我给的源码项目,大家可以直接运行,跑起来玩一下后,大家再来帮我解决问题,会更有体会。。

    源码奉上:https://pan.baidu.com/s/1dFNGafZ,密码:xh3d,此为百度网盘下载链接。

    跑起来的效果如下:

    长话短说,首先为了便于问题的清晰描述,先给大家说一些细节,请大神耐心听我说,大家跑起来后,发现跟winform的Form窗体设计
    器很相似,鼠标拖动过程中显示一个虚线框

    鼠标释放后创建控件:

    或者点击左边的工具箱后再在Form窗体中点击会创建一个默认小大的控件:


    但是唯一不足之处,就是少了个左边的工具箱,用于自定义创建控件,其实自定义工具箱都好做,可以用一个ListBox里面
    放一系列的Label即可,点击不同的Label会创建不同类型的文本,然后据此来判断和创建不同类型的控件,但是这个不是重点,重要的
    是,我点击了自定义工具箱后,再在DesignSurface设计视图中绘制时,没用,就是说这个DesignSurface设计视图和它的根容器都无法
    挂接事件,当然也可能是我很菜,不知道,我查找了System.ComponentModel.Design和System.Windows.Forms.Design这两个命名空间中的内容,我基本都看过了,都没找到如何给DesignSurface设计器挂接事件,也可能是我遗漏了。现象就是你给他挂接了MouseMove,MouseDown及MouseUp等事件后,鼠标放到上面依旧没有反应。因此就实现不了我想要的操作。求各路路过的神仙大牛高手大虾大侠们给点提示,希望与大家一起在学习中共同进步。

    2017年11月10日 2:06

答案

  • Hi,

    感谢你的回复。 

    据我们分析,如果你想直接从左边的控件栏拖到你设计的tabControl1 里面设计的form上面,应该是没有办法做到。 

    设计时的form 是不会捕捉事件,所以move on的事件不会被捕捉到。 

    你可以在Tiny Form Designer form上面捕捉到事件。 

    捕捉设计时的form 事件,一般都是用service 来做,你可以看下面的文章,讲的比较详细。 我的理解可能不好,你当作参考。

    http://www.divelements.co.uk/net/articles/designers/hosting.asp

    我感觉作者的思想使用了C++的 回掉函数,首先得到你的service,然后从这service 中的到回掉函数。 这个回掉函数 我认为就我们要做的move on 事件。  也许我理解不对,只供参考。

    Best Regards,

    Hart

    注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年11月14日 6:35
    版主
  • Hi,

    关于这个问题,请参考这篇文档:

    Hosting Windows Forms Designers - 14 June 2003。

    这是项目的详细介绍,在这个文档的最底部有下载的源码,你可以直接下载,这个工程是使用的ToolboxService来实现控件拖拽的,而不是MouseMove事件。

    备注:关于你在英文论坛发的这个帖子:Problem in DesignSurface designer! 这个论坛是英文论坛,按照政策,在英文论坛讨论英文贴,在中文论坛讨论中文贴,所以如果有问题请在中文论坛发帖,避免在英文论坛讨论中文,谢谢合作。

    Regards,

    Stanly

    注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月17日 3:02

全部回复

  • 我的这个DesignSurface设计器项目,也是基于人家的代码基础上加以改进的,

    实现了如下功能:

    包含控件在运行态时,可以自由拖动,也可以8个方向都支持框选,选择部分控件进行上下左右移动,也可以使用键盘方向键进行移动,同时支持剪切,复制,粘贴和跨页粘贴,以上操作都支持一个或多个控件,也可以直接用鼠标拖拽进行移动。并且可以在属性网格中绑定自定义属性。还有边框对齐线和文本对齐线。

    2017年11月10日 2:09
  • Hi,

    感谢在MSDN论坛发帖。

    我这边发现一个也是用winform 来模拟VS设计器的功能,你可以下载下来,参考一下

    根据MSDN的规则,是不允许用第三方的产品,所以百度云,我是没有办法用的。

    你可以把代码上传到one drive上面。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.



    2017年11月10日 8:12
    版主
  • 哎,那只是一个winform项目啊。无语。https://pan.baidu.com/s/1dFNGafZ  这个链接是个下载链接啊,你放到浏览器上回车一下,就能下载我的这个项目了啊,我这个项目也是基于.net的啊,如果不是,我还来问什么问题啊
    2017年11月10日 8:40
  • Hi,

    我下载你的代码,在拖动button 控件的时候,button 会出现变扁,或者抖动,你是想在选中button的时候,出现虚框,但是在移动的过程中不出现变扁,或者抖动的情况吗?当鼠标移释放时,再出现这个button? 这我描述这个样子吗? 不知道我描述的对不对。

    针对这个情况,我认为可能是是在拖动button的时候,form界面应该是一直在重绘,你可以在移动的过程中让button 不显示出来,然后释放鼠标以后,在显示出来。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月13日 7:13
    版主
  • 首先,谢谢大神的解答!恩,你给的链接有些用。其实我就是想问,如何向winform中的.net设计器中一样,左边搞个工具箱,点击一个所选的控件来进行拖动创建。这样的话,就需要在右边的这个设计器中挂接MouseMove等事件,这样才能处理这些问题,但是我挂接了事件,用鼠标在上面拖动时,竟然都没触发相应的事件,不知道为什么,以及要怎样给设机器挂接事件?或者是其他什么机制来处理的?


    2017年11月13日 8:40
  • Hi,

    感谢你的回复。 

    据我们分析,如果你想直接从左边的控件栏拖到你设计的tabControl1 里面设计的form上面,应该是没有办法做到。 

    设计时的form 是不会捕捉事件,所以move on的事件不会被捕捉到。 

    你可以在Tiny Form Designer form上面捕捉到事件。 

    捕捉设计时的form 事件,一般都是用service 来做,你可以看下面的文章,讲的比较详细。 我的理解可能不好,你当作参考。

    http://www.divelements.co.uk/net/articles/designers/hosting.asp

    我感觉作者的思想使用了C++的 回掉函数,首先得到你的service,然后从这service 中的到回掉函数。 这个回掉函数 我认为就我们要做的move on 事件。  也许我理解不对,只供参考。

    Best Regards,

    Hart

    注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年11月14日 6:35
    版主
  • 我看了一下你给的链接,貌似没发现跟我说的有直接相关的内容。

    但是你之前给的这个链接:http://www.divelements.co.uk/net/articles/designers/hosting.asp,其中有位叫Stanly_F的作者他好像就实现了,我还问了他个问题,但是他还没有给我回复。您能帮我问问他吗?我英文不好,他好像又是个老外(我估计的)。

    在此拜谢!

    2017年11月14日 8:35
  • 恩,我发现是这样的,我直接给那个Form窗体挂接事件是可以的。
    2017年11月14日 8:40
  • 我给那个

    Form rootComponent = (Form)surface.CreateRootComponent(typeof(Form), new Size(900, 700));

     Control view = surface.GetView();

     view.Parent = this.tabPage1;

    仔细看上面这段代码,我之前是给view 和rootComponent 挂接MouseMove等事件都不行,但是直接给tabPage1挂接MouseMove等事件是可以的。

    2017年11月14日 8:46
  • 错了,我看错了,貌似还是不能挂接事件,因此我的问题还是没有解决。
    2017年11月16日 8:56
  • 但是你之前给的这个链接:http://www.divelements.co.uk/net/articles/designers/hosting.asp,其中有位叫Stanly_F的作者他好像就实现了,我还问了他个问题,但是他还没有给我回复。您能帮我问问他吗?我英文不好,他好像又是个老外(我估计的)。
    2017年11月16日 8:57
  • Hi,

    关于这个问题,请参考这篇文档:

    Hosting Windows Forms Designers - 14 June 2003。

    这是项目的详细介绍,在这个文档的最底部有下载的源码,你可以直接下载,这个工程是使用的ToolboxService来实现控件拖拽的,而不是MouseMove事件。

    备注:关于你在英文论坛发的这个帖子:Problem in DesignSurface designer! 这个论坛是英文论坛,按照政策,在英文论坛讨论英文贴,在中文论坛讨论中文贴,所以如果有问题请在中文论坛发帖,避免在英文论坛讨论中文,谢谢合作。

    Regards,

    Stanly

    注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月17日 3:02
  • Hi TheYangtzeTheYellowRiver,

    因为你的第一个回复里面包含一些个人信息,为了安全,我建议把这些敏感的东西删掉。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月23日 7:02
    版主