基于 Enabled 属性更改用户控件上的属性

5
在.NET C# 3.5 Winforms中,我有一个带有一些简单子控件(如文本框、标签和按钮)的用户控件。当前,当我将用户控件的.Enabled属性设置为false时,控件会相应地变暗。然而,如果我为用户控件使用自定义的.BackColor,有时候变暗的效果不够明显。
是否有一种方法可以指定或更改用户控件在.Enabled被设置为false时的变暗颜色?或者在相关问题上,是否有一种方法可以在发生此情况时调用一个方法?

我确实查看了http://stackoverflow.com/questions/1672781/how-to-properly-render-control-enabled-false-- 但是我没有自定义绘制任何东西。 - JYelton
3个回答

5

控件有一个EnabledChange事件,您可以利用它。 为用户控件创建此事件的处理程序,并相应地更改其控件的属性。


谢谢,这实际上本来是完美的,但由于我在几个地方重复使用用户控件,所以我想通过用户控件代码处理状态改变(而不是通过事件)。我也发布了我的答案。 - JYelton
1
@JYelton,用户控件可以订阅自己的事件。在这种情况下,用户控件将响应EnabledChanged事件。 - Anthony Pegram
自订阅对我来说是一种“跳出常规”的思维方式。感谢您指出这一点! - JYelton

2

如果您不想订阅EnabledChanged事件,可以重写.OnEnabledChanged(EventArgs e)方法,这是比隐藏控件的.Enable属性更好的解决方案,因为该属性未标记为虚拟:

protected override OnEnabledChanged(EventArgs e)
{
    base.OnEnabledChanged(e);
    // your code here
}

Max,这比隐藏.Enable属性要好得多,谢谢。安东尼建议让用户控件自我订阅事件是我更喜欢的方法。 - JYelton

1

我最终覆盖了用户控件的基本属性,因为我希望处理状态更改的代码位于用户控件本身(而不是订阅事件)。

这就是我所做的:

public new bool Enabled
{
    get
    {
        return base.Enabled;
    }
    set
    {
        base.Enabled = value;
        // code to alter the appearance of control
    }
}

编辑:

在用户控件内部自订阅事件的建议比隐藏非虚拟 Enabled 属性更加简洁。对其他答案进行进一步编辑后,我得到了这个更好的解决方案:

this.EnabledChanged += new EventHandler(UserControl_EnabledChanged);
void UserControl_EnabledChanged(object sender, EventArgs e)
{
    // code to alter appearance of control
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接