为最大化的WPF自定义窗口删除DropShadow

我有一个自定义窗口边框的WPF应用程序(.NET Framework 4)。 我已经禁用使用WPF壳集成库的玻璃边框,并绘制我自己的边框。 但是,我想添加一个DropShadow的时候没有最大化的窗口边界。 我已经添加了这样的阴影:

private static bool DropShadow(Window window) { try { WindowInteropHelper helper = new WindowInteropHelper(window); int val = 2; int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4); if (ret1 == 0) { Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 }; int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m); return ret2 == 0; } else { return false; } } catch (Exception ex) { // Probably dwmapi.dll not found (incompatible OS) return false; } } 

有关更多详细信息,请参阅: WPF无边界窗口的DropShadow

使用WindowState.Normal时,此解决scheme可以正常工作! 但是,当我最大化应用程序并禁用DWMWA_NCRENDERING_POLICY窗口的背景变得稍微透明,我的大部分控件渲染完全不同于我以前。

在下面的图片中,您可以看到最初的最大化状态,以及阴影代码。 正如你所看到的,它完全改变了阴影代码窗口的透明度:o 在这里输入图像说明

有什么我失踪? 我一直在阅读DWM函数库,但无法find答案…

Solutions Collecting From Web of "为最大化的WPF自定义窗口删除DropShadow"

过了一段时间,我从不同的角度重新审视了这个问题,并找到了一个更好的解决方案:

 public class GlassWindow : Window { [SuppressUnmanagedCodeSecurity] internal static class DwmNativeMethods { [StructLayout(LayoutKind.Sequential)] internal struct DwmMargins { public int cxLeftWidth; public int cxRightWidth; public int cyTopHeight; public int cyBottomHeight; public DwmMargins(bool fullWindow) { this.cxLeftWidth = this.cxRightWidth = this.cyTopHeight = this.cyBottomHeight = fullWindow ? -1 : 0; } } [DllImport("DwmApi.dll")] internal static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref DwmMargins m); [DllImport("DwmApi.dll")] internal static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); } private IntPtr windowHandle; protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); WindowInteropHelper interopHelper = new WindowInteropHelper(this); this.windowHandle = interopHelper.Handle; this.ToggleAreoGlass(this.WindowState != WindowState.Maximized); this.StateChanged += this.GlassWindowStateChanged; } private void ToggleAreoGlass(bool value) { // Enable NcRenderingPolicy int attrValue = 2; int result = DwmNativeMethods.DwmSetWindowAttribute(this.windowHandle, 2, ref attrValue, 4); if (result == 0) { // Extend DwmFrame DwmNativeMethods.DwmMargins margins = new DwmNativeMethods.DwmMargins(value); DwmNativeMethods.DwmExtendFrameIntoClientArea(this.windowHandle, ref margins); } } private void GlassWindowStateChanged(object sender, EventArgs e) { this.ToggleAreoGlass(this.WindowState != WindowState.Maximized); } }