赞助商

DropShadow for WPF无边界窗口

发布时间:2019-07-11 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了DropShadow for WPF无边界窗口脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个WPF窗口,WindowStyle设置为none。有没有办法我可以强制这个窗口放下一个阴影(就像你在WindowStyle不是没有的时候)?我不想将AllowTransparency设置为true,因为它会影响性能。而且我也不想禁用硬件渲染(我读到透明度更好地禁用的地方)。

解决方法

我已经写了一个能够完成你想要的工具类:在无边框窗口上放置一个标准的阴影,但是将AllowTransparency设置为false。

你只需要调用DropShadowToWindow(Window窗口)方法。最好在窗口的构造函数InitializeComponent()之后进行此调用,但即使在窗口显示之后调用它也会起作用。

using System;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

public static class DwmDropShadow
{
    [DllImport("dwmapi.dll",PreserveSig = true)]
    private static extern int DwmSetWindowAttribute(IntPtr hwnd,int attr,ref int attrValue,int attrSize);

    [DllImport("dwmapi.dll")]
    private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd,ref Margins pMarInset);

    /// <summary>
    /// Drops a standard shadow to a WPF Window,even if the window is borderless. Only works with DWM (Windows Vista or newer).
    /// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect,/// as AllowsTransparency involves a huge performance issue (hardware acceleration is turned off for all the window).
    /// </summary>
    /// <param name="window">Window to which the shadow will be applied</param>
    public static void DropShadowToWindow(Window window)
    {
        if (!DropShadow(window))
        {
            window.SourceInitialized += new EventHandler(window_SourceInitialized);
        }
    }

    private static void window_SourceInitialized(object sender,EventArgs e)
    {
        Window window = (Window)sender;

        DropShadow(window);

        window.SourceInitialized -= new EventHandler(window_SourceInitialized);
    }

    /// <summary>
    /// The actual method that makes API calls to drop the shadow to the window
    /// </summary>
    /// <param name="window">Window to which the shadow will be applied</param>
    /// <returns>True if the method succeeded,false if not</returns>
    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;
        }
    }
}

总结

以上是脚本之家为你收集整理的DropShadow for WPF无边界窗口全部内容,希望文章能够帮你解决DropShadow for WPF无边界窗口所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:76874919,请注明来意。
标签: