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
- 当我拖放时,什么也不会发生,当光标离开设计图面时(在我拖放之后),新的
控件将被创建并添加到我拖放它的地方
我自己现在无法深入了解这一点,但您可能也能从中找到一些东西,它解决了VisualStudio 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属性是根设计器视图中引用的控件
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,因为它们使用的解决方案/教程与我设计设计器时使用的相同。谢谢。嗨,你解决了鼠标闪烁的问题了吗?我也在使用同一个设计器,我遇到鼠标点闪烁,例如,我想将控件从工具箱拖动到面板,面板闪烁。