WPF:如何将活动标题栏颜色设置为窗口背景?

时间:2013-04-16 16:37:05

标签: wpf colors background titlebar brushes

我有一个没有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颜色,如果处于非活动状态则为灰色,但其他用户可能不同。我如何通过代码获得这些颜色?

1 个答案:

答案 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);

那应该是你的柠檬绿色。