3

我有一个没有标题栏和边框的 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;
    }

编辑
当前我的窗口标题栏如果处于活动状态,则具有石灰颜色,如果处于非活动状态,则为灰色,但其他用户可能不同。如何通过代码获取这些颜色?

4

1 回答 1

3

由于您使用的是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);

那应该得到你的石灰绿色。

于 2013-04-16T16:50:59.577 回答