如何在C#Winforms中覆盖Control.Enabled属性?

时间:2016-08-22 19:59:56

标签: c# winforms custom-controls

我正在使用自定义控件。我想在启用或禁用时更改其颜色。所以我在OnEnabledChanged内写了一段代码。

        protected override void OnEnabledChanged(EventArgs e)
        {
            if (!Enabled)
            {
                temp1 = colorOn;
                temp2 = colorOff;
                colorOff = colorOn = Color.LightGray;
            }
            else
            {
                colorOn = temp1;
                colorOff = temp2;
            }
            Invalidate();
            base.OnEnabledChanged(e);
        }

此代码在运行时工作正常,但不适用于设计时。当我在设计时改变Enabled属性时,它没有被提升。所以我想覆盖控件的Enabled属性。但是在输入时它并没有显示出来。

那我怎么能覆盖呢?如果还有其他方法我想使用它。

1 个答案:

答案 0 :(得分:4)

这完全正常。控制设计者的一项工作是拦截某些属性和方法的行为,这些属性和方法会干扰设计视图中控件的使用。 Enabled属性就是其中之一,如果它在设计时也可以工作,那么你再也不能选择控件了。设计师当然不能让这种情况发生,它总是在设计时强制Enabled = true并截取属性的赋值。你发现了。覆盖它也可以工作,它不是虚拟财产,但无论如何都不会给你你想要的东西。 Visible属性是另一个被截获的属性,你可以想象这是怎么回事:)

你必须创建自己的设计师才能做些什么。这通常是一个杀死蚊子的火箭筒,特别是在这种情况下,因为你仍然无法使用Enabled做任何事情。更糟糕的是,这种行为是由ControlDesigner类实现的,这是您作为基类获得设计师所需的类。我非常怀疑这是否切合实际。

根本没有做任何事情来解决这个问题是完全合理的,因为工具箱中的其他任何控件都不会在设计器中更改其Enabled属性时改变其外观。