如何在不改变外观的情况下禁用.net Winforms控件?

时间:2009-01-27 17:20:45

标签: c# .net winforms

假设我有一个控件,我想阻止它被编辑。

将控件的Enabled属性设置为False将起作用,但控件外观将相应更改,通常是难以读取的黑色灰色字体。当可读性仍然很重要时,这是一个真正的问题。

对于TextBox,有一些明显的修复:

Textbox1.BackColor = Color.White;

Textbox1.ReadOnly= true; // instead of setting Enabled to false

但不幸的是,这不适用于每个控件(例如单选按钮)

另一个解决方案是让Enabled属性不受影响,并订阅像这样的焦点事件(但这不是一个非常优雅的解决方案)

    this.Textbox1.Enter += new System.EventHandler(this.Textbox1_Enter);

    private void Textbox1_Enter(object sender, EventArgs e)
    {
      Textbox1.FindForm().ActiveControl = null;
    }

您是否看到过处理此问题的其他方法? (我的意思是现实世界的解决方案;当然,您可以捕获控件的屏幕截图并在控件上显示副本...:p)

4 个答案:

答案 0 :(得分:3)

有一种说法认为干扰标准Windows行为会让用户感到困惑,但除此之外我已经看到过这种情况,尽管在C ++中更常见。您可以对控件进行子类化并自己处理绘制消息。启用控件后,只需将绘图委托给基类。当控件被禁用时,你可以让基类绘制自己,然后在顶部做一些自定义绘图,或者你可以自己绘制整个事物。我强烈推荐第一个选项。

答案 1 :(得分:0)

某些控件可以设置为ReadOnly,使其保持启用状态,但无法更改。这可能是你正在寻找的。

那说当你的用户开始感到困惑时,你可能会成为一个受到伤害的世界,因为看起来他们应该能够编辑控件,但他们不能。他们改变视觉外观的原因是 - 将系统的状态传达给用户。与此混淆,他们可能会非常困惑。

答案 2 :(得分:0)

如果控件被禁用/只读,那么它确实需要看起来已禁用/只读。否则,您将完全混淆用户。

有很好的理由说明Windows控件的行为与他们的行为方式有关,而且您确实希望与其他Windows界面保持一致。当有人使用Windows应用程序时,他们对它的外观和行为有一定的期望。

如果您偏离这些期望,那么用户通常会认为您的软件是一块垃圾。

答案 3 :(得分:0)

通常,是的,不想更改Windows默认行为。

但我有一个案例,我在一个页面上禁用许多控件,通常不到一秒钟,以避免多线程应用程序中的一些交叉线程问题。当用户滚动时,例如树视图或列表框,这会导致主要的闪烁问题。在这种情况下不改变它们的外观是一件令人满意的事情。

但是,当出于其他原因禁用控件时,我希望它们的外观能够反映其启用/禁用状态。

在仅仅是瞬间的情况下启用/禁用状态的闪烁实际上导致对软件的更多负面感知,而不是抑制禁用控件的外观变化以避免闪烁许多部分表格会。