效果图:



有不少示例介绍了如何将Vista Aero效果扩展到整个窗口,但大都是针对Windows Form应用程序,而不是WPF(即前者针对的是Form类,后者是针对的Window类),比如http://www.cnblogs.com/zhouyinhui/archive/2007/05/30/765416.html
其实与其类似,都是调用dwmapi,只不过Window类没有直接给我们提供句柄,我们需要这样的代码来找到其句柄:
IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
然后将窗口的背景设置为透明:
window.Background = Brushes.Transparent;
  HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor
= Colors.Transparent;

最后调用
DwmApi.DwmExtendFrameIntoClientArea(hwnd, margins);
注意,我们应该在窗口被显示之后(SourceInitialized之后)再调用我们的函数否则会引发异常。

参考代码:

public partial class Window1 : System.Windows.Window
   
{

       
public Window1()
       
{
            InitializeComponent();

        }


       
protected override void OnSourceInitialized(EventArgs e)
       
{
           
base.OnSourceInitialized(e);
            DWMLib.AeroHelper.ExtendGlassFrame(
this, new Thickness(-1));

        }


    }


public class AeroHelper
   
{
       
public static bool ExtendGlassFrame(Window window, Thickness margin)
       
{
           
if (!DwmApi.DwmIsCompositionEnabled())
               
return false;

            IntPtr hwnd
= new WindowInteropHelper(window).Handle;
           
if (hwnd == IntPtr.Zero)
               
throw new InvalidOperationException("The Window must be shown before extending glass.");

           
// Set the background to transparent from both the WPF and Win32 perspectives
            window.Background = Brushes.Transparent;
            HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor
= Colors.Transparent;

            DWMLib.DwmApi.MARGINS margins
= new DWMLib.DwmApi.MARGINS((int)margin.Left, (int)margin.Top, (int)margin.Right, (int)margin.Bottom);
            DwmApi.DwmExtendFrameIntoClientArea(hwnd, margins);

           
return true;
        }


public class DwmApi
   
{
        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern void DwmEnableBlurBehindWindow(IntPtr hWnd, DWM_BLURBEHIND pBlurBehind);

        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, MARGINS pMargins);

        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern bool DwmIsCompositionEnabled();

        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern void DwmGetColorizationColor(
           
out int pcrColorization,
            [MarshalAs(UnmanagedType.Bool)]
out bool pfOpaqueBlend);

        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern void DwmEnableComposition(bool bEnable);

        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern IntPtr DwmRegisterThumbnail(IntPtr dest, IntPtr source);

        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern void DwmUnregisterThumbnail(IntPtr hThumbnail);

        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern void DwmUpdateThumbnailProperties(IntPtr hThumbnail, DWM_THUMBNAIL_PROPERTIES props);

        [DllImport(
"dwmapi.dll", PreserveSig = false)]
       
public static extern void DwmQueryThumbnailSourceSize(IntPtr hThumbnail, out Size size);

        [StructLayout(LayoutKind.Sequential)]
       
public class DWM_THUMBNAIL_PROPERTIES
       
{
           
public uint dwFlags;
           
public RECT rcDestination;
           
public RECT rcSource;
           
public byte opacity;
            [MarshalAs(UnmanagedType.Bool)]
           
public bool fVisible;
            [MarshalAs(UnmanagedType.Bool)]
           
public bool fSourceClientAreaOnly;

           
public const uint DWM_TNP_RECTDESTINATION = 0x00000001;
           
public const uint DWM_TNP_RECTSOURCE = 0x00000002;
           
public const uint DWM_TNP_OPACITY = 0x00000004;
           
public const uint DWM_TNP_VISIBLE = 0x00000008;
           
public const uint DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010;
        }


        [StructLayout(LayoutKind.Sequential)]
       
public class MARGINS
       
{
           
public int cxLeftWidth, cxRightWidth, cyTopHeight, cyBottomHeight;

           
public MARGINS(int left, int top, int right, int bottom)
           
{
                cxLeftWidth
= left;
                cyTopHeight
= top;
                cxRightWidth
= right;
                cyBottomHeight
= bottom;
            }

        }


        [StructLayout(LayoutKind.Sequential)]
       
public class DWM_BLURBEHIND
       
{
           
public uint dwFlags;
            [MarshalAs(UnmanagedType.Bool)]
           
public bool fEnable;
           
public IntPtr hRegionBlur;
            [MarshalAs(UnmanagedType.Bool)]
           
public bool fTransitionOnMaximized;

           
public const uint DWM_BB_ENABLE = 0x00000001;
           
public const uint DWM_BB_BLURREGION = 0x00000002;
           
public const uint DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004;
        }


        [StructLayout(LayoutKind.Sequential)]
       
public struct RECT
       
{
           
public int left, top, right, bottom;

           
public RECT(int left, int top, int right, int bottom)
           
{
               
this.left = left;
               
this.top = top;
               
this.right = right;
               
this.bottom = bottom;
            }

        }

    }


Demo, 要正确运行Demo,你应该使用开启Aero效果的Vista版本