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);
Это должно получить ваш светло-зеленый цвет.