我有一个没有Titlebar和边框的WPF窗口。所以我想基于它改变窗口背景是否有效。
我在下面写了代码,但收到了消息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;
}
修改
当前我的Windows标题栏如果处于活动状态则为Lime颜色,如果处于非活动状态则为灰色,但其他用户可能不同。我如何通过代码获得这些颜色?
答案 0 :(得分:2)
由于您使用的是WPF
,因此您应该使用System.Windows.SystemColors类,而不是使用System.Drawing.SystemBrushes
类。 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);
那应该是你的柠檬绿色。