【问题标题】:Windows 10 Creators Update changes the style of PropertyGrid controlWindows 10 Creators Update 更改 PropertyGrid 控件的样式
【发布时间】:2017-09-22 09:38:23
【问题描述】:

我刚刚将一些系统升级到 Windows 10 Creators Update,我注意到 Windows 窗体 PropertyGrid 控件将其标题和栏边距的默认视觉样式更改为深灰色,如下所示:

而且大多数情况下发生意外的视觉变化,用户并不高兴。有没有办法恢复到旧的默认样式或覆盖默认样式?

【问题讨论】:

  • 与 PropertyGrid.LineColor 同色。鉴于它已更改,您可能将其保留为默认设置 SystemColors.InactiveBorder。微软确实对系统颜色进行了修补,以使新版本的 Windows 看起来不同。或者你选择了你喜欢的配色方案,很难猜到。在以后的版本中更改系统颜色变得更加困难,this superuser.com question 有详细信息。注册表黑客是我想象中唯一有用的。
  • 在我公司的多台机器上,这确实是由 Microsoft 更新引起的。运行了几个月的工具现在有了不同的风格。有没有地方可以找到更新所做的更改?
  • @joe:对于 .NET,他们有发布说明 here,包括指向已知问题的链接。

标签: windows winforms propertygrid


【解决方案1】:

PropertyGrid 中有一个错误:

属性PropertyGrid.LineColor 有一个DefaultValue 属性设置为SystemColors.InactiveBorder
但是内部字段lineColor是用SystemColors.ControlDark初始化的。

这很糟糕,因为 Windows 窗体设计器检测到该属性与DefaultValue 属性具有相同的值,因此它不会在InitializeComponent 中编写PropertyGrid.LineColor 属性的设计器代码。所以在运行时,属性被初始化为SystemColors.ControlDark

作为一个快速破解,您可以在InitializeComponent 之后设置属性:

InitializeComponent();
propertyGrid.LineColor = SystemColors.InactiveBorder;

【讨论】:

  • 和往常一样,部署在开发者计算机上的System.Windows.Forms 版本为lineColor 字段指定SystemColors.InactiveBorder
  • 您可以通过 Visual Studio 的“报告问题”对此进行投票,输入 The LineColor of PropertyGrid is defined inconsistent。现有问题报告表明该更改是在 .NET 4.7 中引入的。
  • @tm1:谢谢,不知道可以直接通过Visual Studio报bug,谢谢!
【解决方案2】:

我们将在 .Net Framework 的下一版本中将默认 Windows 主题中的标题颜色恢复为 InactiveBorder,这很可能会包含在 Windows 10 Fall Creators Update 中。引入此更改的原因是,前景色和背景色在其中一个高对比度主题中对比度不够,这就是为什么我们仅在默认主题中恢复为以前使用的颜色。 供您参考,.Net Framework 4.7.1 的发行说明中也会提到的内部工作项编号是 407249。

谢谢你,谭雅

【讨论】:

    【解决方案3】:

    这似乎是一个“功能”。来自.NET Framework 4.7 Release Notes

    更改了属性网格线的背景颜色,为高对比度主题提供 8:1 的对比度。

    所以,我想说,不,使用 Windows 10 Creators Update,没有重新编译就无法恢复到旧样式(请参阅this 答案)。

    我投诉了here

    更新

    我像这样改进了PropertyGrid 类:

    sealed class LightPropertyGrid : PropertyGrid {
        static readonly Color DefaultLineColor = (Color)
            typeof(PropertyGrid)
                .GetProperty(nameof(LineColor))
                .GetCustomAttribute<DefaultValueAttribute>()
                .Value;
    
        public LightPropertyGrid() {
            LineColor = DefaultLineColor;
        }
    }
    

    我从同一属性上定义的默认值推断LineColor 的初始值。当然,你可以简单地分配LineColor = SystemColors.InactiveBorder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 2018-02-02
      相关资源
      最近更新 更多