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...
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
Vous devez vous connecter pour publier un commentaire.
J'ai donc trouvé un moyen d'obtenir que cela fonctionne.
Vous avez besoin pour utiliser WPF Shell Intégration de la Bibliothèque (ici) pour faire le travail pour vous. Comme il a été écrit par MS, ils se sont fixés (il me semble) questions à faire à la P/Invoke code.
De sorte qu'il est facile d'obtenir une Fenêtre qui n'a pas d'Aero glass, est redimensionnable sur les bords, a une zone de légende qui se comporte avec Aero snap, et a une ombre portée qui réapparaît après min/maxer.
Voici le code de ma fenêtre (note, vous devez avoir référencé
Microsoft.Windows.Shell
)La
<shell:WindowChrome>
vous permet de définir les différentes variables de l'interop.CaptionHeight
: C'est la hauteur de la zone de la légende (headerbar) qui permet pour l'Aero snap, double cliquant sur le comportement normal de la barre de titre.GlassFrameThickness
: Le réglage à0,0,0,1
pour quelque raison supprime le chrome (en verre), qui tient la place de la frontière, et ajoute une ombre portée.ResizeBorderThickness
: C'est l'épaisseur de la bordure de la fenêtre dans laquelle vous pouvez redimensionner la fenêtre.D'autres choses à noter que vous gardez la Fenêtre.WindowStyle bien égal à
SingleBorderWindow
et laissez-la Bibliothèque de Shell traiter avec la suppression du titre, des boutons et d'autres chrome.Donc j'ai un peu perdu mon bounty, mais il ressemble à un complètement viable solution qui fonctionne un régal!
EDIT:
Voici une photo du résultat:
J'ai aussi mis un exemple de projet sur http://code.google.com/p/sample-metro-wpf-application/. C'est une licence MIT et les gens peuvent l'utiliser mais ils veulent.
Bien sûr... je vais prendre une image vers le haut le plus vite possible.
J'ai ajouté l'image et un lien vers un exemple de projet.
Notez que vous pouvez utiliser le CanResize option pour ResizeMode si vous ne voulez pas voir la poignée.
Aujourd'hui, vous n'avez pas besoin de la
Microsoft.Windows.Shell
paquet. La classe est enPresentationFramework.dll
commeSystem.Windows.Shell.WindowChrome
.OriginalL'auteur Alastair Pitts
Pour créer un effet d'ombre portée, tout en ayant la possibilité de re-taille, la forme, essayez les opérations suivantes:
Définissez les propriétés suivantes dans la fenêtre:
Après la fenêtre de déclaration, ajouter un
Border
élémentBorder.Effect
élément à l'intérieur de la frontièrePour l'effet frontière ajouter les éléments suivants:
Cela va créer le suivant (sans la boîte de contrôle en haut à droite):
Plein XAML:
Je crois que le seul morceau que je ne comprend pas a les boutons. Je vais voir si je peux trouver le projet, mais je ne peux pas garantir quoi que ce soit, désolé.
J'ai créé un nouveau projet à partir de zéro... et cela a fonctionné... Tout ce que je veux, c'est voir les boutons... je les ai créés à l'aide de
Webdings
police... Comment avez-vous créé? Par la façon dont l'idée deBorderThickness
rochers!!! Merci!!!!!! 🙂Fonctionne bien! - merci!!
stackoverflow.com/a/16017103 @SAM
OriginalL'auteur Stuart Blackler
Voici quelques un minimum de code qui fait ce que vous êtes après.
Cette fenêtre se comporte comme une fenêtre d'habitude et qu'il peut être:
Il dispose également d'une ombre portée.
Le résultat final ressemble à ceci:
OriginalL'auteur Drew Noakes