none
为什么IsEnable=false,控件就变灰? RRS feed

  • 问题

  • 已知常见的Button、TextBox等,设置IsEnable=false,它们就会变成灰色,而且点了也没反应了。我想知道这个变灰是用什么技术的。

    我看了《wpf 自定义控件不可用如何变灰?》,有人说改控件背景颜色,或加一个grid,背景色为灰,半透明。但我觉得在标准类库中这么广泛存在的现象,不太可能是用这种东拼西凑的方法完成的。

    有没有任何文章介绍了变灰的实现?或者指点我看一些.net framework类库源码,证明灰显真的是用XXXX完成的。

    我问这个问题,一是好奇,相信微软不会为了这几个控件的灰显开发了什么秘而不宣的技术,肯定是现有技术的组合;二是我想能不能它变灰时能不能变得更灰一点,或者变红变绿什么的。

    谢谢解惑!

    2012年6月20日 15:20

答案

  • 不知道你有没有尝试的在BLEND 里面导出 Button 的 ControlTemplate。 你会发现里面有针对 IsEnabled 为 false 的触发器,很可惜的是里面只有对ForeGround的设置, 而当我们在那个触发器里面手动对 Backgroud 设置是发现根本行不通。

    问题就在于这是由于一个叫做BackgroundOverlay的属性决定的(这是通过reflector 查看在PresentationFramework.Aero.dll 的 ButtonChrome 找到的)。 如果当Button 控件是Disabled 状态时,这个属性会从一个私有属性CommonDisabledBackgroundOverlay 返回一个SolidColorBrush, 这个SolidColorBrush 返回 RGB 244,244,244, 这就是我们看到的灰色背景了。

    更多的信息, 你可以看下这篇文章, 里面很详细的解释了这个现象。 http://www.infosysblogs.com/microsoft/2010/07/wpf_-_disabled_look_for_button.html


    Kee Poppy [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月21日 4:20
    版主

全部回复

  • 你一说,我也想知道了!
    2012年6月21日 1:18
  • 不知道你有没有尝试的在BLEND 里面导出 Button 的 ControlTemplate。 你会发现里面有针对 IsEnabled 为 false 的触发器,很可惜的是里面只有对ForeGround的设置, 而当我们在那个触发器里面手动对 Backgroud 设置是发现根本行不通。

    问题就在于这是由于一个叫做BackgroundOverlay的属性决定的(这是通过reflector 查看在PresentationFramework.Aero.dll 的 ButtonChrome 找到的)。 如果当Button 控件是Disabled 状态时,这个属性会从一个私有属性CommonDisabledBackgroundOverlay 返回一个SolidColorBrush, 这个SolidColorBrush 返回 RGB 244,244,244, 这就是我们看到的灰色背景了。

    更多的信息, 你可以看下这篇文章, 里面很详细的解释了这个现象。 http://www.infosysblogs.com/microsoft/2010/07/wpf_-_disabled_look_for_button.html


    Kee Poppy [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月21日 4:20
    版主