c# – 有效地“覆盖”Control.Enabled

我看了一下,我无法想出如何有效地“覆盖”C#WinForms 3.5中的Control.Enabled.

我们的情况是我们使用了一个基本表单或主表单,它在底部添加了状态栏,在顶部添加了工具栏.此表单将由我们所有其他表单继承,然后将控件添加到中心面板.

在从主基础表单继承的一些表单上,我们希望能够在表单上使用“已启用”属性,但我们希望能够覆盖功能,因此它只会禁用中心面板而不是状态/菜单栏,所以它仍然可以移动表单.

我试图在主表单(FrmBaseStatus)上执行以下操作:

private bool enabled = true;
public new bool Enabled
{
    return this.enabled;
}
set
{
    this.enabled = value;
    this.panelBase.Enabled = value;
}

然而,显然这不是真正的覆盖,如果我们在一个继承的表单中的基本面板上有用户控件,并且我们想要覆盖此用户控件的表单,我们必须执行以下操作:

((FrmBaseStatus)this.ParentForm).Enabled = true;

有没有其他方法可以做到这一点,或者我们一直坚持总是强制转换到我们的基本表单,以达到我们想要使用的Enabled属性.

注意:覆盖OnEnabled事件而不调用基础OnEnabled会执行此操作,还是在Control.OnEnabled()的此事件中未启用和禁用?

解决方法:

控件中的Enabled属性用于启用/禁用整个控件,因此我不明白为什么需要覆盖父窗体上的Enabled属性.如果您需要准确禁用centerPanel,请添加一个属性以获取该面板,并禁用它.

我建议您在基本表单中定义一个CenterPanel属性,然后使用它来禁用该面板:

// code defined in your FrmBaseStatus form
protected Control CenterPanel
{
    get
    {
        return this.panelBase;
    }
}

然后从您继承的表单中,您可以使用:

// disable center panel and its childs
this.CenterPanel.Enabled = false;

//disable the whole form
this.Enabled = false;
上一篇:php – Zend_Auth:为什么验证对象名为adapter而不是策略?


下一篇:c# – Winforms:创建动态时间轴控件