(一)在WPF中获得Windows 10或8的主题色

x

 Windows强调的颜色

因为Windows 8用户可以选择一个系统强调色。这种颜色可以在默认应用程序的窗口边框上看到,在UWP应用程序中使用它非常容易。

如何在WPF中获得强调颜色?

选项1:SystemParameters。

WindowGlassBrush -不是100%相同的颜色据我所知,有几种方法可以获得颜色代码,其中一种简单但不是100%正确的方法是使用SystemParameters。在。net 4.5中引入的WindowGlassBrush属性。遗憾的是,这个颜色不是100%正确的——我不知道在哪里使用了这个“类似的”,但不是相同的颜色,以及为什么API返回这个颜色。这似乎只是未文档化的DwmGetColorizationParameters Win32 API的一个包装器。

选项2:GetImmersiveColorFromColorSetEx

我在这里找到了这个解决方案,它只是围绕GetImmersiveColorFromColorSetEx Win32 API的一个包装器。

选项3:Registry, DwmGetColorizationParameters

最后一个选项是读取注册表值——我在这个站点上找到了一些提示,但我不建议使用它,因为它或多或少没有文档,将来可能会崩溃。我们用选项1或2。用法:两个选项的使用都非常简单(至少提供了选项2代码):

用法:

两个选项的使用都非常简单(至少提供了选项2代码):

    // https://gist.github.com/paulcbetts/3c6aedc9f0cd39a77c37
    var accentColor = new SolidColorBrush(AccentColorSet.ActiveSet["SystemAccent"]);
    this.Code.Background = accentColor;
    this.Code.Text = "AccentColorSet Immersive 'SystemAccent' " + accentColor.Color.ToString();

    // Available in .NET 4.5
    this.SystemProperties.Background = SystemParameters.WindowGlassBrush;
    this.SystemProperties.Text = "SystemParameters.WindowGlassBrush " + ((SolidColorBrush)SystemParameters.WindowGlassBrush).Color.ToString();
  
    //同样也可以通过Binding来设置主题色
    <TextBlock Height="50" x:Name="Code" Background="{x:Static SystemParameters.WindowGlassBrush}">Code</TextBlock>

 Result:

x

从评论中可以看出:正如Yves Goergen所指出的,生成的颜色并不完全匹配边框颜色,但是它确实匹配了系统的重音颜色,这是可以的。我猜边框有一些附加的chrome行为,所以颜色略有不同。

完整的代码在GitHub上希望这个有帮助。

原文地址

思考:这篇文章解决了获取Win10强调色的问题,但是,问题又来了,这个例子不能动态的改变主题色,当程序运行的过程中,主题色变了,WPF程序怎么跟随主题色同时变化。

发布了18 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_28368039/article/details/89914579