【问题标题】:Design-Time drag and drop设计时拖放
【发布时间】:2009-09-18 09:27:35
【问题描述】:

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

我遵循了这个教程"Hosting Windows Forms Designers, by Tim Dawson",并且几乎已经实现了我需要的所有功能。

给那些不想阅读教程的人的短篇故事: 我实现了IDesignerHostIContainerISelectionServiceIToolboxService 和一些其他界面,创建我的设计表面。我没有在框架中使用System.ComponentModel.Design.DesignSurface,主要是因为我需要一个真正自定义的设计表面。

问题:

我想允许用户将新的ControlIToolboxService 拖放到IDesignerHost/IContainer。在本教程中,您单击工具箱中的Control,单击设计图面以添加控件。

我发现了什么:

  • 有一个内置功能, 自动从 IToolboxServiceSystem.ComponentModel.Design.DesignSurface 但如果您从零开始实施 IDesignerHost,它显然无法正常工作。
  • 当您使用 Control.DoDragDrop(ToolboxItem) 方法,启动拖放:

    1. IToolboxService.SerializeToolboxItem(ToolboxItem) 被调用来序列化项目
    2. IToolboxService.IsToolboxItem(object)
      IToolboxService.IsSupported(object) 被调用以评估是否
      可以允许序列化的 ToolboxItem 被丢弃在设计表面上
    3. 当您删除控件时:IToolboxService.DeserializeToolboxItem(object serializedObject) 被设计图面调用以反序列化被删除的控件。
  • 调用IToolboxService.SetCursor() 以了解您是定义自定义光标还是让标准窗口光标。

问题:

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

  • 我拖,一切都很好,但是当 徘徊在设计表面,我的 光标在之间闪烁一点 标准光标和 “DragDropEffects.Copy”样式。
  • 当我放下时,什么也没有发生,当我的光标离开设计表面时(在我放下之后),新的 Control 被创建并添加到我放下它的地方。

有没有人尝试过我正在做的事情,如果有,您是如何做到的? 有没有人有任何指针/链接/好的建议?

谢谢你=)

【问题讨论】:

  • 您好,您解决鼠标闪烁的问题了吗?我也在使用同一个设计器,我遇到鼠标点闪烁,例如我想将控件从工具箱拖到面板,面板在闪烁。

标签: c# drag-and-drop design-time


【解决方案1】:

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

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

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

我自己现在无法对此进行更深入的研究,但您也可以从 Customize Drag & Drop in the Designer 中找到一些东西,它解决了 Visual Studio 2003 和 2005 版本之间拖放行为的变化;这很可能是相关的,并且其中一个接受的答案实际上确实特别提到了上面的 Microsoft Connect 问题,而且它还提供了更多关于可能解决方案的提示。

【讨论】:

  • 该死,他们改变了行为?我要看看你的链接,它们似乎真的与我的问题有关,尤其是 Microsoft Connect,因为它们使用我用来设计我的设计师的相同解决方案/教程。谢谢。
【解决方案2】:

我在一天前研究过这个问题。这是我为像您这样的项目找到的解决方案。

  1. 我拖动,一切都很好,但是当悬停在设计表面时,我的光标在标准光标和“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 属性是引用根设计器视图的控件。

  1. 当我放下时,什么都没有发生,当我的光标离开设计表面(在我放下之后)时,新的 Control 会被创建并添加到我放下它的地方。

EasyAccordionToolBoxService 中有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);

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多