3

我使用 WPF 制作了一个非常漂亮的 Windows 8-ish 界面。结果已经比我希望的要好得多,但我想知道以下几点:

是否有可能检索用户设置的当前窗口颜色?您知道,您可以在右键单击桌面时设置 Aero 颜色...我的计划是将该颜色用于我的 GUI 上的几个画布元素。

提前致谢!

4

4 回答 4

5

SystemColours类就是为了这个目的而存在的。您可以像这样直接绑定到它

"{DynamicResource {x:Static SystemColors.WindowColorKey}}"
于 2012-10-26T13:56:27.693 回答
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"));
}
于 2012-10-26T13:08:45.030 回答
1

我设法使用以下代码获得了正确的颜色: 小旁注:它有一个小的修正来忽略十六进制数的 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;
于 2012-10-29T10:34:52.600 回答
0

我在这里为此创建了一个开源库,它也可以在 NuGet 上找到。

install-package aerocolor-wpf.AeroColor

安装包后,你可以参考一个DynamicResource调用AeroColorAeroBrush根据你的需要。

还需要一些设置代码,但并不多。只需Loaded在窗口的事件处理程序中放一些东西,如下所示。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Loaded += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        AeroResourceInitializer.Initialize();
    }
}

这个库的巧妙之处在于它还安装了一个钩子,当系统中实际的 Aero 颜色变化时,它也会更新这些资源。这意味着您也不必处理它,并且如果您使用 aDynamicResource来指向 XAML 中的颜色而不是 a StaticResource,WPF 也会自动更新您的 UI 中的颜色。

当 Windows 8 过渡更改 Aero 颜色并且您的颜色随之变化时,看起来非常酷。

于 2014-08-15T23:52:23.723 回答