【问题标题】:How to set color of window title depending on the color of the WindowChrome如何根据 WindowChrome 的颜色设置窗口标题的颜色
【发布时间】:2020-07-15 11:18:46
【问题描述】:

我需要让我的应用程序的窗口标题根据在 Windows 10 中为 WindowChrome 设置的颜色而改变颜色。

是否有一个 WPF 属性可以绑定到文本颜色,该属性会自动采用实际清晰的正确颜色(黑色或白色)?

是否必须手动计算正确的颜色,如果需要,如何确定 WindowChrome 的颜色?

【问题讨论】:

  • 为什么要更改标题颜色?你想达到/解决什么?
  • 如果用户为其标题栏设置了深色,则默认的黑色窗口标题难以辨认。
  • 您可以从system colors 获取颜色,然后对其进行修改(可能类似于this,另请参见this)。如果您只想检查使用哪种颜色(黑色或白色),则将颜色转换为灰度并与中间进行比较。
  • 谢谢,我正打算这样做,但 WindowChrome 的颜色不包含在 SystemColors 中
  • 应该是ControlBrush (source)。

标签: c# .net wpf windows


【解决方案1】:

在以前的 Windows 版本中,您将使用 SystemColors 类来获取相应的颜色。但是,它不会映射到 Windows 10 浅色和深色模式颜色,如您在 this issue 中所见。它只会在一定程度上在高对比度模式下有用。 SystemParameters.WindowGlassBrush 只会为您提供强调色,这不是一般的窗口镶边颜色,但前提是您在系统设置中明确将其应用于窗口框架和标题。

我还没有找到任何方法来直接在任何地方获取窗口镶边颜色或标题栏颜色。

您可以做的是检测是否为应用启用了 Light ModeDark Mode 并根据它更改应用中的颜色,但您必须自己定义颜色。下面的 sn -p 使用注册表来找出启用了哪种模式。如果未定义注册表项,则返回null

var value = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", null);
var isAppLightTheme = value != null ? Convert.ToBoolean(value) : (bool?)null;

如果您还想覆盖将访问颜色设置为窗口框架或标题栏颜色的情况,请使用下面的注册表项。这种情况下的问题是,Windows 会将标题文本颜色设置为黑色或白色,具体取决于强调色以提高可读性。如上所述,您必须手动处理。

var value = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorPrevalence", null);
var isTitleFrameAccentColored = value != null ? Convert.ToBoolean(value) : (bool?)null;

为了访问注册表,您需要Microsoft.Win32 命名空间。如果你使用.NET Core,你可以安装Microsoft.Win32.Registry 包来访问Registry 类。

【讨论】:

    猜你喜欢
    • 2018-02-23
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2010-10-10
    • 2019-09-12
    相关资源
    最近更新 更多