簡體   English   中英

設計時拖放

[英]Design-Time drag and drop

我目前正在開發一個項目,我的部分是設計一個Design Surface,最終用戶可以在運行時添加/刪除/移動控件。

我按照本教程“由Tim Dawson主持Windows窗體設計器” ,幾乎已經實現了我需要的所有功能。

那些不想閱讀教程的人的簡短故事:我實現了IDesignerHostIContainerISelectionServiceIToolboxService和其他一些界面,以創建我的設計界面。 我沒有在框架中使用System.ComponentModel.Design.DesignSurface ,主要是因為我需要一個非常自定義的設計表面。

題 :

我想允許用戶將新ControlIToolboxServiceIDesignerHost/IContainer 在本教程中,您可以在工具箱中單擊Control ,單擊設計圖面以添加控件。

我發現了什么:

  • 有一個內置功能可以自動從IToolboxServiceSystem.ComponentModel.Design.DesignSurface但如果IToolboxService實現IDesignerHost,它顯然無法正常工作。
  • 使用Control.DoDragDrop(ToolboxItem)方法時,要啟動拖放操作:

    1. IToolboxService.SerializeToolboxItem(ToolboxItem)來序列化項目
    2. IToolboxService.IsToolboxItem(object)
      IToolboxService.IsSupported(object)來評估是否
      可以允許序列化的ToolboxItem在設計圖面上進行droped
    3. 刪除控件時:設計圖面將調用IToolboxService.DeserializeToolboxItem(object serializedObject)以反IToolboxService.DeserializeToolboxItem(object serializedObject)控件。
  • IToolboxService.SetCursor()以了解您是定義自定義光標,還是讓標准窗口光標。

問題:

我實現了上面提到的所有內容,在“我發現了什么”中,但拖放是錯誤的:

  • 我拖動,一切都很好,但是當懸停在設計表面上時,我的光標在標准光標和“ DragDropEffects.Copy ”樣式之間略微閃爍。
  • 當我放下時,沒有任何反應,當我的光標離開設計界面時(在我放棄之后),然后創建新的Control並添加到我丟棄的位置。

有沒有人試圖做我正在做的事情,如果有的話,你是如何管理它的? 有沒有人有任何指針/鏈接/好建議?

謝謝=)

有沒有人有任何指針/鏈接/好建議?

您的問題似乎是由2.0 Connect 設計人員中消費/未提升的Microsoft Connect問題鼠標事件解決的。 這個問題很容易掌握,但顯然從.NET Framework 1.1(2003)到2.0(2006)的升級意味着拖放行為的改變 - 鑒於你提到的文章源自2003年,這很可能是相關的。 具體來說,您應該向前滾動到第2期 ,引文:

拖動窗體時,您將注意到持續閃爍。 這部分是由2.0中的新拖放行為引起的。

我現在無法深入研究這個問題,但您也可以在Designer中自定義拖放功能 ,這可以解決Visual Studio版本2003和2005之間拖放的變化行為; 很可能這可能是相關的,並且其中一個已接受的答案實際上特別引用了上面的Microsoft Connect問題,而且它也為可能的解決方案提供了更多提示。

我在一天前研究過這個問題。 這是我為我的項目找到的解決方案。

  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. 當我放下時,沒有任何反應,當我的光標離開設計界面時(在我放棄之后),然后創建新的控件並添加到我丟棄的位置。

從IToolboxService實現的EasyAccordionToolBoxService中有GetSelectedToolboxItem方法。 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM