WPF: Как установить активный цвет заголовка на фон окна?

У меня есть окно WPF без Titlebar и границы. Поэтому я хочу изменить фон окна, основываясь на том, активен он или нет.

Я написал код ниже, но получил сообщение Cannot implicitly convert type 'System.Drawing.Brush' to 'System.Windows.Media.Brush',

Можете ли вы помочь мне, как это сделать? Спасибо!

    // This function used for both "Actived" and "Deactived" event
    private void window_Activated(object sender, EventArgs e)
    {
        Background = (IsActive)? System.Drawing.SystemBrushes.ActiveCaption :
            System.Drawing.SystemBrushes.InactiveCaption;
    }

РЕДАКТИРОВАТЬ
Текущая строка заголовка моего окна имеет цвет Lime, если он активен, и серый, если неактивен, но другой пользователь может отличаться. Как я могу получить эти цвета по коду?

1 ответ

Решение

Так как вы используете WPFвместо того, чтобы использовать System.Drawing.SystemBrushes класс вы должны использовать класс System.Windows.SystemColors. Кисти из System.Drawing пространство имен не совместимы напрямую с System.Windows.Media кисти пространства имен.

Background = (IsActive)? System.Windows.SystemColors.ActiveCaptionBrush :
            System.Windows.SystemColors.InactiveCaptionBrush;

Если вы хотите использовать это в своем XAML, ты можешь использовать

Background="{x:Static SystemColors.ActiveCaptionBrush}"

Редактировать на основе обновленного вопроса

Если вы хотите использовать цвет темы, вам придется использовать PInvoke. Собственный метод - DwmGetColorizationColor. Это вернет целое число, поэтому вы можете создать SolidColorBrush с этим целым числом и назначьте его своему фону.

[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern void DwmGetColorizationColor(out int pcrColorization, [MarshalAs(UnmanagedType.Bool)]out bool pfOpaqueBlend);

int col;
bool opac;
DwmGetColorizationColor(out col, out opac);

//convert the int to a colour
byte[] bytes = BitConverter.GetBytes(col);
Color color = Color.FromRgb(bytes[2], bytes[1], bytes[0]);

Background = new SolidColorBrush(color);

Это должно получить ваш светло-зеленый цвет.

Другие вопросы по тегам