[英]Design-Time drag and drop
我目前正在開發一個項目,我的部分是設計一個Design Surface,最終用戶可以在運行時添加/刪除/移動控件。
我按照本教程“由Tim Dawson主持Windows窗體設計器” ,幾乎已經實現了我需要的所有功能。
那些不想閱讀教程的人的簡短故事:我實現了IDesignerHost
, IContainer
, ISelectionService
, IToolboxService
和其他一些界面,以創建我的設計界面。 我沒有在框架中使用System.ComponentModel.Design.DesignSurface
,主要是因為我需要一個非常自定義的設計表面。
我想允許用戶將新Control
從IToolboxService
到IDesignerHost/IContainer
。 在本教程中,您可以在工具箱中單擊Control
,單擊設計圖面以添加控件。
IToolboxService
到System.ComponentModel.Design.DesignSurface
但如果IToolboxService
實現IDesignerHost,它顯然無法正常工作。 使用Control.DoDragDrop(ToolboxItem)
方法時,要啟動拖放操作:
IToolboxService.SerializeToolboxItem(ToolboxItem)
來序列化項目 IToolboxService.IsToolboxItem(object)
和 IToolboxService.IsSupported(object)
來評估是否 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問題,而且它也為可能的解決方案提供了更多提示。
我在一天前研究過這個問題。 這是我為我的項目找到的解決方案。
這是我的工具箱服務。
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屬性是控制引用根設計器的視圖。
從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.