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

How to override Control.Enabled property in C# Winforms?

我正在处理一个自定义控件。我想在启用或禁用时更改它的颜色。所以我在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 属性。但是打字的时候不显示。

那么我该如何覆盖它呢?如果有其他方法我想使用它。

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

您必须创建自己的设计器才能对此有所作为。这通常是用来杀死蚊子的火箭筒,尤其是在这种情况下,因为您仍然无法对启用进行任何操作。更糟糕的是,此行为是由 ControlDesigner class 实现的,您需要这种 class 作为基础 class 才能让设计人员开始工作。我严重怀疑它是否实用。

不采取任何措施来解决这个问题是完全合理的,因为当您在设计器中更改它们的启用 属性 时,工具箱中的其他控件 none 会改变它们的外观。