从Toolbox拖动控件时,ControlDesigner不活动

时间:2016-07-04 07:39:05

标签: c# winforms visual-studio user-controls windows-forms-designer

我试图为我的自定义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已经过验证(如下所示)

enter image description here

我对ControlDesigner很陌生,所以我不确定这种行为是否符合设计要求,或者我是否可以更改此设置,以便在从工具箱中拖动时我的验证工作正常。

我使用的是Visual Studio 2013,但我认为这不应该成为一个问题。

1 个答案:

答案 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

因此,当您从工具箱中拖动控件并将其放在除表单之外的任何容器上时,它会向用户显示一条消息,但没有任何反应,并且不会将其添加到该父级。如果您愿意,可以删除消息框。