我试图为我的自定义WinForms控件添加设计器支持,但看起来设计器仅在我已创建实例时才有效,而不是在从工具箱中拖放时。
显示我的意思我已经使用设计师创建了简单的控件:
[Designer(typeof(MyButtonDesigner))]
public class MyButton:Button
{
public MyButton()
{
base.Size= new Size(50,50);
}
}
class MyButtonDesigner : ControlDesigner
{
public override bool CanBeParentedTo(IDesigner parentDesigner)
{
return parentDesigner != null && parentDesigner.Component is Form;
}
}
我喜欢我的控件只能通过表单托管(用户只能将控件添加到表单,而不是组框)。当我从Toolbox拖动控件时,我的验证逻辑被跳过,但是当我尝试将控件实例从表单移动到groupbox时,我可以看到drop已经过验证(如下所示)
我对ControlDesigner很陌生,所以我不确定这种行为是否符合设计要求,或者我是否可以更改此设置,以便在从工具箱中拖动时我的验证工作正常。
我使用的是Visual Studio 2013,但我认为这不应该成为一个问题。
答案 0 :(得分:2)
CanBeParentedTo
方法
您可以为控件创建自定义ToolBoxItem
,然后覆盖CreateComponentsCore
方法,以防止在父级Form
时创建控件。从ToolBox拖动控件时将使用ToolBoxItem
,从设计图面拖动控件时将使用Designer
。
//Add reference to System.Drawing.dll then using
using System.Drawing.Design;
using System.Windows.Forms.Design;
public class MyButtonToolBoxItem:ToolboxItem
{
protected override IComponent[] CreateComponentsCore(IDesignerHost host,
System.Collections.IDictionary defaultValues)
{
if(defaultValues.Contains("Parent"))
{
var parent = defaultValues["Parent"] as Control;
if(parent!=null && parent is Form)
return base.CreateComponentsCore(host, defaultValues);
}
var svc = (IUIService)host.GetService(typeof(IUIService));
if (svc != null) svc.ShowError("Can not host MyButton in this control");
return null;
}
}
注册控件的工具箱项目:
[ToolboxItem(typeof(MyButtonToolBoxItem))]
[Designer(typeof(MyButtonDesigner))]
public class MyButton : Button
因此,当您从工具箱中拖动控件并将其放在除表单之外的任何容器上时,它会向用户显示一条消息,但没有任何反应,并且不会将其添加到该父级。如果您愿意,可以删除消息框。