2013-04-16 47 views
2

我有一个没有标题栏和边框的WPF窗口。所以我想要改变基于它是否激活的窗口背景。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; 
    } 

编辑
目前我的窗口标题栏有石灰的颜色,如果它的活性,如果不活动的灰色,但其他用户可能会不同势。我怎样才能通过代码获得这些颜色?

回答

2

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

这应该得到你的柠檬绿色。

+0

工作。谢谢。我得到的颜色是默认的活动/非活动颜色。目前,我的Windows标题栏如果处于活动状态,则为酸橙色;如果处于非活动状态,则为灰色我怎样才能获得这些颜色? – Sakura

+1

@TuyenTk - 我已经更新了答案。它应该得到你的柠檬绿色。第一个答案中的InactiveCaptionBrush没有得到正确的灰色? – keyboardP

+0

'bool opac'怎么样?我没有获得与窗口活动框架颜色完全相同的颜色,但是很近,稍微烧焦。 –