【发布时间】:2012-10-26 11:19:36
【问题描述】:
我使用 WPF 制作了一个非常漂亮的 Windows 8-ish 界面。结果已经比我希望的要好得多,但我想知道以下几点:
是否有可能检索用户设置的当前窗口颜色?您知道,您可以在右键单击桌面时设置 Aero 颜色...我的计划是将该颜色用于我的 GUI 上的几个画布元素。
提前致谢!
【问题讨论】:
-
正确的方法是pinvoke DwmGetColorizationColor()
我使用 WPF 制作了一个非常漂亮的 Windows 8-ish 界面。结果已经比我希望的要好得多,但我想知道以下几点:
是否有可能检索用户设置的当前窗口颜色?您知道,您可以在右键单击桌面时设置 Aero 颜色...我的计划是将该颜色用于我的 GUI 上的几个画布元素。
提前致谢!
【问题讨论】:
SystemColours 类就是为了这个目的而存在的。你可以像这样直接绑定到它
"{DynamicResource {x:Static SystemColors.WindowColorKey}}"
【讨论】:
您可以为此查询 ColorizationColor 注册表项。
我什至更进一步,创建了一种获取十六进制颜色值的方法,希望对您有所帮助:
public void SomeMethod()
{
int argbColor = (int)Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM","ColorizationColor", null);
var color = System.Drawing.Color.FromArgb(argbColor);
string hexadecimalColor = ConverterToHex(color);
}
private static String ConverterToHex(System.Drawing.Color c)
{
return String.Format("#{0}{1}{2}", c.R.ToString("X2"), c.G.ToString("X2"), c.B.ToString("X2"));
}
【讨论】:
我设法使用以下代码获得了正确的颜色: 小旁注:它有一个小的修正,以忽略十六进制数的 alpha 位,所以我得到的是全色而不是饱和度较低的。
string colorizationValue = string.Format("{0:x}", Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", "00000000"));
StringBuilder bl = new StringBuilder(colorizationValue);
bl[0] = 'd';
bl[1] = '9';
colorizationValue = bl.ToString();
BrushConverter bc = new BrushConverter();
Brush brush = (Brush)bc.ConvertFrom("#" + colorizationValue);
cvs_barColor.Background = brush;
【讨论】:
我为此 here 创建了一个开源库,它也可以在 NuGet 上找到。
install-package aerocolor-wpf.AeroColor
安装包后,根据需要可以参考DynamicResourceAeroColor和AeroBrush。
还需要一些设置代码,但并不多。只需在窗口的 Loaded 事件处理程序中添加一些内容,如下所示。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
AeroResourceInitializer.Initialize();
}
}
这个库的巧妙之处在于它还安装了一个钩子,当系统中实际的 Aero 颜色变化时,它也会更新这些资源。这意味着您也不必处理该问题,如果您使用 DynamicResource 而不是 StaticResource 来指向 XAML 中的颜色,WPF 也会自动更新您的 UI 中的颜色。
当 Windows 8 过渡更改 Aero 颜色并且您的颜色随之变化时,看起来非常酷。
【讨论】: