2012-10-26 53 views
3

我使用WPF做出了非常漂亮的Windows 8十岁上下的接口。它已经证明的方式比我求之不得,但我想知道以下几点:获取航空窗口颜色

是它在某种程度上可以检索当前窗口的颜色由用户设置的?您知道,当您右键单击桌面时,您可以设置Aero颜色......我的计划是在我的GUI上使用该颜色作为几个画布元素。

在此先感谢!

+0

可能的重复http://stackoverflow.com/questions/628483/how-can-i-set-a-wpf-controls-color-to-a-system-color-programatically-so-that-i – Surfbutler

+2

正确的方法是捏住DwmGetColorizationColor() –

回答

4

您可以查询这个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")); 
} 
+0

我使用你的代码,因为我需要代码背后的颜色。我想我最好把它放在一起,以保持可读性。 – X3N0N10

+0

当Aero颜色实际上发生变化时(我经常会在Windows 8中自动着色),我的答案也会改变颜色。 –

+0

我怎么知道这个值是否随着SystemColors.WindowColorKey – Mike

3

SystemColours类。您可以直接绑定到它像这样

"{DynamicResource {x:Static SystemColors.WindowColorKey}}" 
+0

的绑定而改变非常简单!非常感谢! – X3N0N10

1

我设法使用下面的代码,以获得正确的色彩: 小旁注:它有一个小的修正它忽略十六进制数的α位,所以我得到的是全彩色,而不是饱和度较低的一种。

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; 
0

我创建了一个开放源码库这个here这也可在的NuGet。

install-package aerocolor-wpf.AeroColor

安装包后,您可以指取决于你需要什么叫AeroColorAeroBrushDynamicResource

有是一个的太需要一些设置代码,但它并不多。只需在窗口的事件处理函数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的过渡性地改变了航空的颜色和你的颜色如下。