2009-01-27 70 views
6

假设我有一个控件,我想阻止它被编辑。如何禁用.net Winforms控件而不更改其外观?

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

对于一个文本框,有几个明显的修正:

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)

回答

3

有一种观点认为,干扰标准Windows行为会让用户感到困惑,但除此之外,我已经看到了这一点,尽管在C++中更常见。您可以继承该控件并自己处理绘画消息。当控件启用时,只需将绘图委派给基类。当控件被禁用时,您可以让基类自己绘制,然后在顶部执行一些自定义绘图,或者您可以仅绘制整个事物。我强烈推荐这些选项中的第一个。

0

某些控件可以设置为ReadOnly,使其启用,但无法被改变。这可能是你正在寻找的东西。

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

+0

我在实际完成问题之前发帖。 – 2009-01-27 17:24:36

+1

啊哈!另一个声誉狙击手:) – Brann 2009-01-27 17:27:54

0

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

Windows控件的行为方式有很好的理由,而且您确实希望与其他Windows界面保持一致。当有人使用Windows应用程序时,他们对应该如何看待和操作有一定的期望。

如果你偏离了这些期望,那么用户往往会认为你的软件是一件垃圾。

0

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

但是我有一种情况,我禁用了页面上的许多控件,通常不到一秒钟,以避免多线程应用程序中的一些交叉线程问题。这会导致用户在浏览时发生重大闪烁问题,比如树视图或列表框。在这种情况下不改变他们的外观是一个理想的事情。

但是,当控件由于其他原因而被禁用时,我确实希望它们的外观反映它们的启用/禁用状态。

在仅仅是瞬间事物的情况下,启用/禁用状态的闪烁实际上导致对软件的更多负面认知超过抑制禁用控件的外观变化以避免闪烁许多部件的形式会。

相关问题