Получить цвет окна Aero
Я сделал довольно приятный интерфейс для Windows 8, используя WPF. Это уже получается лучше, чем я мог пожелать, но мне было интересно следующее:
Можно ли каким-то образом получить текущий цвет окна, заданный пользователем? Знаете, вы можете установить цвет Aero, щелкнув правой кнопкой мыши по рабочему столу... Я планирую использовать этот цвет для пары элементов canvas в моем графическом интерфейсе.
Заранее спасибо!
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"));
}
Класс SystemColours существует именно для этой цели. Вы можете привязать к нему напрямую так
"{DynamicResource {x:Static SystemColors.WindowColorKey}}"
Мне удалось получить правильный цвет, используя следующий код:Little sidenote: в нем есть небольшая поправка, чтобы игнорировать альфа-бит шестнадцатеричного числа, поэтому я получаю полный цвет, а не менее насыщенный.
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 автоматически обновит цвет в вашем интерфейсе.
Выглядит очень круто, когда Windows 8 меняет цвет Aero переходно и ваш цвет следует.