【问题标题】:Get Aero Window Colour获取 Aero 窗口颜色
【发布时间】:2012-10-26 11:19:36
【问题描述】:

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

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

提前致谢!

【问题讨论】:

标签: c# wpf xaml aero


【解决方案1】:

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

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

【讨论】:

  • 非常简单!非常感谢!
【解决方案2】:

您可以为此查询 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"));
}

【讨论】:

  • 我正在使用您的代码,因为我需要后面代码中的颜色。我想我最好把它们放在一起以保持可读性。
  • 当 Aero 颜色实际上发生变化时,我的回答也会改变颜色(这在启用自动着色的 Windows 8 中经常发生)。
  • 我怎么知道这个值是否随着绑定到 SystemColors.WindowColorKey 而改变
【解决方案3】:

我设法使用以下代码获得了正确的颜色: 小旁注:它有一个小的修正,以忽略十六进制数的 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;

【讨论】:

    【解决方案4】:

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

    install-package aerocolor-wpf.AeroColor

    安装包后,根据需要可以参考DynamicResourceAeroColorAeroBrush

    还需要一些设置代码,但并不多。只需在窗口的 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 颜色并且您的颜色随之变化时,看起来非常酷。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 2012-02-15
      • 1970-01-01
      • 2011-09-24
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多