Windows 10 Creators Update 改变了PropertyGrid控件的样式

Windows 10 Creators Update changes the style of PropertyGrid control

我刚刚将一些系统升级到 Windows 10 Creators Update,我注意到 windows 表单 PropertyGrid 控件更改了 headers 和栏边距的默认视觉样式变成深灰色,像这样:

而且大多数情况下都会发生意想不到的视觉变化,用户对此并不满意。有没有办法恢复到旧的默认样式或者覆盖默认样式?

PropertyGrid 中存在错误:

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

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

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

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

这似乎是 "feature"。来自 .NET Framework 4.7 Release Notes:

Changed the background color of property grid lines to provide an 8:1 contrast ratio for high contrast themes.

所以,我会说,不,有了 Windows 10 Creators Update,如果不重新编译就无法恢复到旧样式(参见 回答)。

我投诉了here

更新

我把 PropertyGrid class 精炼成这样:

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.

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

谢谢你,谭雅