Maximum de fenêtre personnalisée perd l'effet d'ombre portée

J'ai un custom fenêtre WPF défini comme:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" MinHeight="300" Height="350" MinWidth="600" Width="700"      ResizeMode="CanResizeWithGrip" AllowsTransparency="True" WindowStyle="None">

J'ai trouvé une classe en ligne qui crée des ombres portées, illustré ci-dessous. Cela fonctionne bien, même avec un redimensionnement de la poignée, jusqu'à ce que j'maximiser la fenêtre. Une fois que j'maximiser la fenêtre ou modifier l'état de la fenêtre d'une autre fenêtre (par exemple. Visual Studio), je lâche l'ombre et je ne peux pas le récupérer. Des Idées?


Ombre Portée De La Classe:

Public Class DropShadow
Private Shared _handler As EventHandler = New EventHandler(AddressOf window_SourceInitialized)
<DllImport("dwmapi.dll", PreserveSig:=True)> _
Private Shared Function DwmSetWindowAttribute(hwnd As IntPtr, attr As Integer, ByRef attrValue As Integer, attrSize As Integer) As Integer
End Function
<DllImport("dwmapi.dll")> _
Private Shared Function DwmExtendFrameIntoClientArea(hWnd As IntPtr, ByRef pMarInset As Margins) As Integer
End Function
Public Shared Sub DropShadowToWindow(window As Window)
If Not DropShadow(window) Then
AddHandler window.SourceInitialized, _handler
AddHandler window.SizeChanged, New SizeChangedEventHandler(AddressOf windowSizeChanged)
End If
End Sub
Private Shared Sub window_SourceInitialized(sender As Object, e As EventArgs)
Dim window As Window = DirectCast(sender, Window)
DropShadow(window)
RemoveHandler window.SourceInitialized, _handler
End Sub
Private Shared Function DropShadow(window As Window) As Boolean
Try
Dim helper As New WindowInteropHelper(window)
Dim val As Integer = 2
Dim ret1 As Integer = DwmSetWindowAttribute(helper.Handle, 2, val, 4)
If ret1 = 0 Then
Dim m As New Margins() With { _
.Bottom = 0, _
.Left = 0, _
.Right = 0, _
.Top = 0 _
}
Dim ret2 As Integer = DwmExtendFrameIntoClientArea(helper.Handle, m)
Return ret2 = 0
Else
Return False
End If
Catch ex As Exception
' Probably dwmapi.dll not found (incompatible OS)
Return False
End Try
End Function
Private Shared Sub windowSizeChanged(sender As Object, e As SizeChangedEventArgs)
Dim window As Window = DirectCast(sender, Window)
DropShadow(window)
End Sub
End Class
Lorsque vous déboguez, quelle est la première valeur de retour de DropShadow? Si elle retourne False, le gestionnaire d'événement ne sera pas accroché et la DS va disparaître lorsque vous redimensionnez.
Il a été de déterminer les gestionnaires correctement. J'ai décidé de l'enlever et essayer d'une autre façon. Je vais poster ce que j'ai fait il un peu...

OriginalL'auteur Stuart Blackler | 2011-09-10