C# 设计时拖放

C# 设计时拖放,c#,drag-and-drop,design-time,C#,Drag And Drop,Design Time,我目前正在从事一个项目,我的部分是设计一个最终用户可以在运行时添加/删除/移动控件的设计图面 我遵循本教程,几乎实现了我需要的所有功能 为那些不想阅读本教程的人编写的短篇故事:我实现了、、和其他一些界面,以创建我的设计图面。我没有使用框架中已有的,主要是因为我需要一个真正定制的设计图面 问题: 我希望允许用户将新的控件从IToolboxService拖放到IDesignerHost/IContainer。在本教程中,您可以在工具箱中的控件上单击,然后单击设计图面以添加控件 我发现: 有一个内置

我目前正在从事一个项目,我的部分是设计一个最终用户可以在运行时添加/删除/移动控件的设计图面

我遵循本教程,几乎实现了我需要的所有功能

为那些不想阅读本教程的人编写的短篇故事:我实现了、、和其他一些界面,以创建我的设计图面。我没有使用框架中已有的,主要是因为我需要一个真正定制的设计图面

问题: 我希望允许用户将新的
控件
IToolboxService
拖放到
IDesignerHost/IContainer
。在本教程中,您可以在工具箱中的
控件上单击,然后单击设计图面以添加控件

我发现:
  • 有一个内置功能 自动从中进行拖放
    IToolboxService
    System.ComponentModel.Design.DesignSurface
    但如果您从无到有地实现IDesignerHost,它显然不起作用
  • 当你使用
    Control.DoDragDrop(ToolboxItem)
    方法,以启动拖放操作:

  • IToolboxService.ToolboxItem(ToolboxItem)
    调用以序列化该项
  • IToolboxService.IsToolboxItem(对象)

    IToolboxService.IsSupported(对象)
    调用,以评估 可以允许序列化ToolboxItem 放置在设计图面上
  • 删除控件时:
    IToolboxService.DeserializeToolboxItem(object serializedObject)
    由设计图面调用以反序列化所删除的控件
  • 调用IToolboxService.SetCursor()
以了解您是定义自定义游标,还是让标准windows游标

问题: 我在“我发现了什么”中实现了上面提到的所有内容,但拖放是有缺陷的:

  • 我拖,一切都好,但什么时候 在设计图面上悬停,我的 光标在两个方向之间稍微闪烁 标准游标和 “
    DragDropEffects.Copy
    ”样式
  • 当我拖放时,什么也不会发生,当光标离开设计图面时(在我拖放之后),新的
    控件将被创建并添加到我拖放它的地方
有没有人试过做我正在做的事,如果有,你是怎么做到的? 有没有人有什么建议/链接/好的建议

谢谢=)

有没有人有 指针/链接/好建议

您的问题似乎已由Microsoft Connect问题解决。虽然这个问题很容易理解,但是从.NET Framework 1.1(2003)升级到2.0(2006)显然意味着拖放行为的改变——考虑到您提到的文章源于2003年,这很可能是相关的。具体而言,您应该向前滚动至第2期,引文:

现在您将注意到常数 在屏幕上拖动时闪烁 形式。这部分是由于 2.0中的新拖放行为


我自己现在无法深入了解这一点,但您可能也能从中找到一些东西,它解决了VisualStudio 2003版和2005版之间拖放行为的变化;这很可能与此相关,事实上,其中一个公认的答案确实特别提到了上述Microsoft Connect问题,而且它还提供了更多关于可能的解决方案的提示。

一天前,我一直在研究这些问题。这是我为像你这样的项目找到的解决方案

  • 我拖动,一切正常,但在设计图面上悬停时,我的光标在标准光标和“DragDropEffects.Copy”样式之间稍微闪烁
  • 这是我的工具箱服务

    class EasyAccordionToolboxService : AccordionControl, IToolboxService
    {
        EasyAccordionControlElement _SelectedElement;
        public Control DesignPanel { get; set; }
    
        public EasyAccordionToolboxService()
        {
            AddAccordions();
            AllowItemSelection = true;
            base.ElementClick += EasyAccordionToolboxService_ElementClick;
        }
    
        private void EasyAccordionToolboxService_ElementClick(object sender, ElementClickEventArgs e)
        {
            if (e.Element.Level == 1) this._SelectedElement = e.Element as EasyAccordionControlElement;
        }
    
        public ToolboxItem GetSelectedToolboxItem()
        {
            if(_SelectedElement != null)
            {
                var selectedToolboxItem = this._SelectedElement.ToolBoxItem;
                this._SelectedElement = null;
                return selectedToolboxItem;
            }
            else
            {
                return null;
            }
        }
    
            public bool SetCursor()
        {
            if(this._SelectedElement == null)
            {
                this.DesignPanel.Cursor = Cursors.Default;
            }
            else
            {
                this.DesignPanel.Cursor = Cursors.Hand;
            }
    
            return true;
        }
    
    有“DesignPanel”属性和“SetCursor”方法。DesignPanel属性是根设计器视图中引用的控件

  • 当我拖放时,什么也不会发生,当我的光标离开设计图面(在我拖放之后),新控件将被创建并添加到我拖放它的地方
  • EasyAccordingToolboxService中存在GetSelectedToolboxItem方法,该方法是从IToolboxService实现的。GetSelectedToolboxItem是您的答案

    最后,

            designer = new EasyDesignSurface(propertyGrid);
    
            var rootForm = (Form)designer.CreateComponent(typeof(Form));
            rootForm.Name = "rootForm";
            rootForm.Text = "BELGE";
            rootForm.TopLevel = false;
            rootForm.Size = new Size(600, 600);
            designer.ComponentContainer.Add(rootForm);
    
            var view = (Control)designer.View;
            view.Dock = DockStyle.Fill;
            designPanel.Controls.Add(view);
    
            easyAccordionToolboxService1.DesignPanel = view;
            designer.AddService(typeof(IToolboxService), easyAccordionToolboxService1);
    

    该死,他们改变了行为?我要看看你的链接,它们似乎真的与我的问题有关,特别是Microsoft Connect,因为它们使用的解决方案/教程与我设计设计器时使用的相同。谢谢。嗨,你解决了鼠标闪烁的问题了吗?我也在使用同一个设计器,我遇到鼠标点闪烁,例如,我想将控件从工具箱拖动到面板,面板闪烁。