我使用WPF制作了一个相当漂亮的类似于Windows 8的界面。它已经比我想象中的要好得多了,但我想知道以下问题:
是否有可能检索用户设置的当前窗口颜色?你知道的,你可以在右键单击桌面时设置Aero颜色... 我的计划是将该颜色用于我的GUI上的一些画布元素。
提前感谢!
我使用WPF制作了一个相当漂亮的类似于Windows 8的界面。它已经比我想象中的要好得多了,但我想知道以下问题:
是否有可能检索用户设置的当前窗口颜色?你知道的,你可以在右键单击桌面时设置Aero颜色... 我的计划是将该颜色用于我的GUI上的一些画布元素。
提前感谢!
为此,存在着一个名为SystemColours的类。您可以直接绑定到它,如下所示:
"{DynamicResource {x:Static SystemColors.WindowColorKey}}"
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"));
}
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;
我为这个链接创建了一个开源库,也可以在NuGet上使用。
install-package aerocolor-wpf.AeroColor
安装完包后,您可以引用DynamicResource
,根据需要调用AeroColor
和AeroBrush
。
还需要一些设置代码,但不多。只需将以下内容放入窗口的Loaded
事件处理程序中即可。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
AeroResourceInitializer.Initialize();
}
}
这个库的好处在于它还安装了一个钩子,随着系统中实际的Aero颜色变化而更新这些资源。这意味着您也不必处理它,如果您使用DynamicResource
来指向XAML中的颜色而不是StaticResource
,WPF也会自动更新UI中的颜色。
当Windows 8过渡性地改变Aero颜色时,您的颜色跟随变化看起来非常酷。