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.Windows.SystemColorsSystem.Drawing.SystemBrushesクラスを使用する必要があります。名前空間のブラシは、名前空間のブラシと直接互換性がありません。System.DrawingSystem.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 に答える