Winforms 在UserControl中定义新的可见属性。当设置为false时,控件将从设计器中消失

Winforms 在UserControl中定义新的可见属性。当设置为false时,控件将从设计器中消失,winforms,visual-studio-2010,visual-studio,visual-studio-2012,user-controls,Winforms,Visual Studio 2010,Visual Studio,Visual Studio 2012,User Controls,我创建了一个UserControl1:UserControl,其中我将VisibleNew属性定义为 [Browsable(true)] public bool VisibleNew { get { return Visible; } set { Visible = value; } } 因此,如果控件放置在窗体上,设置Visible=false不会对设计器隐藏它。但是设置VisibleNew=false会隐藏它

我创建了一个UserControl1:UserControl,其中我将VisibleNew属性定义为

[Browsable(true)]
public bool VisibleNew
{
    get
    {
        return Visible;
    }
    set
    {
        Visible = value;
    }
}
因此,如果控件放置在窗体上,设置Visible=false不会对设计器隐藏它。但是设置VisibleNew=false会隐藏它

怎么了?如何使VisibleNew在设计时不隐藏控件? VS2012控件在VS2010上进行了测试,它有一个设计器,一个在设计时运行并使控件行为不同的类。UserControl的现有设计器将拦截对Visible属性的任何分配,以防止控件在设计时不可见。问题是,它不知道您的VisibleNew属性的bean,所以无法拦截它

从技术上讲,您可以创建自己的设计器,并让它拦截VisibleNew。然而,直接在类中建立设计时意识要简单得多。您可以使用DesignMode属性检测控件在设计时是否正在使用。像这样:

    private bool visibleNew = true;

    [Browsable(true), DefaultValue(true)]
    public bool VisibleNew {
        get {
            return visibleNew;
        }
        set {
            visibleNew = value;
            if (!this.DesignMode) base.Visible = visibleNew;
        }
    }

戴上我的心理调试眼镜,我觉得你根本不想这么做。修补Visible属性是非常棘手的,它在运行时有奇怪的行为。只有当控件对用户实际可见时,它才会返回true。我只能想象你想要创建自己的财产来解决这种行为。正确的方法如下所示:

    private bool visibleIntent;

    protected override void SetVisibleCore(bool value) {
        visibleIntent = value;
        base.SetVisibleCore(value);
    }

    [Browsable(false)]
    public bool VisibleIntent {
        get { return visibleIntent;  }
    }

IDE如何与这个问题相关?