Wpf 最大自定义窗口丢失阴影效果
我有一个自定义WPF窗口,定义为:Wpf 最大自定义窗口丢失阴影效果,wpf,vb.net,xaml,window,Wpf,Vb.net,Xaml,Window,我有一个自定义WPF窗口,定义为: <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" Widt
<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">
我在网上找到了一个创建阴影的类,如下所示。即使使用调整大小夹点,这也能很好地工作,直到我将窗口最大化。一旦我最大化了窗口或更改了另一个窗口(如Visual Studio)的窗口状态,我就失去了阴影,无法恢复。有什么想法吗
放置阴影类:
公共类DropShadow
私有共享_handleras EventHandler=新的EventHandler(窗口的地址_SourceInitialized)
_
私有共享函数DwmSetWindowAttribute(hwnd作为IntPtr,attr作为Integer,ByRef attrValue作为Integer,attrSize作为Integer)作为Integer
端函数
_
私有共享函数dwmextendframeintoclienterea(hWnd作为IntPtr,ByRef pMarInset作为边距)作为整数
端函数
公共共享子DropShadowToWindow(窗口作为窗口)
如果不是DropShadow(窗口),则
AddHandler window.SourceInitialized,\u处理程序
AddHandler window.SizeChanged,新的SizeChangedEventHandler(WindowsSizeChanged的地址)
如果结束
端接头
私有共享子窗口\u SourceInitialized(发送方作为对象,e作为事件参数)
将窗口变暗为窗口=DirectCast(发送方,窗口)
DropShadow(窗口)
RemoveHandler window.SourceInitialized,\u处理程序
端接头
私有共享函数DropShadow(窗口作为窗口)作为布尔值
尝试
将辅助对象变暗为新窗口Interophelper(窗口)
Dim val为整数=2
Dim ret1为整数=DwmSetWindowAttribute(helper.Handle,2,val,4)
如果ret1=0,则
用{_
.Bottom=0_
.左=0_
.Right=0_
.Top=0_
}
Dim ret2作为整数=DwmExtendFrameIntoClientArea(helper.Handle,m)
返回ret2=0
其他的
返回错误
如果结束
特例
'可能找不到dwmapi.dll(不兼容的操作系统)
返回错误
结束尝试
端函数
私有共享子窗口SizeChanged(发件人作为对象,e作为SizeChangedEventArgs)
将窗口变暗为窗口=DirectCast(发送方,窗口)
DropShadow(窗口)
端接头
末级
要在能够重新调整窗体大小的同时创建阴影效果,请尝试以下操作:
<DropShadowEffect BlurRadius="5" Color="Black" Opacity="0.8" ShadowDepth="0.5" />
- ResizeMode=“CanResizeWithGrip”
- AllowTransparency=“True”
- WindowStyle=“无”
- 背景=“透明”
- BorderThickness=“3”
边框
元素边框。效果元素
<DropShadowEffect BlurRadius="5" Color="Black" Opacity="0.8" ShadowDepth="0.5" />
<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="500" Height="350" MinWidth="300" Width="700" ResizeMode="CanResizeWithGrip" AllowsTransparency="True" WindowStyle="None" Background="White" BorderThickness="3">
<Border>
<Border.Effect>
<DropShadowEffect BlurRadius="5" Color="Black" Opacity="0.8" ShadowDepth="0.5" />
</Border.Effect>
<!-- Put your content in here -->
</Border>
</Window>
所以我找到了一种方法让它工作 您需要使用WPFShell集成库()来完成这项工作。正如MS所写的,他们已经修复了(似乎)对P/Invoke代码的任何问题 因此,很容易获得一个没有Aero玻璃的窗口,该窗口的边缘可以调整大小,有一个与Aero snap行为一致的标题区域,并且有一个在min/maxing后重新出现的阴影 这是我的窗口的代码(注意,您需要引用Microsoft.Windows.Shell)
是为互操作设置所有不同变量的地方
:这是标题区域(标题栏)的高度,允许像普通标题栏一样进行航空捕捉和双击CaptionHeight
:出于某种原因将其设置为GlassFrameThickness
,将删除镀铬(玻璃),保留方形边框,并添加阴影0,0,0,1
:这是窗口边缘的厚度,您可以在此调整窗口的大小ResizeBorderThickness
SingleBorderWindow
,并让Shell库处理删除标题、按钮和其他chrome的问题
所以我有点浪费了我的赏金,但这看起来是一个完全可行的解决方案,效果不错
编辑:
以下是结果的图片:
我还在上建立了一个示例项目。这是麻省理工学院的许可证,人们可以随心所欲地使用它。这里有一些简单的代码,可以满足您的需求
此窗口的行为与普通窗口类似,因为它可以是:
- 通过其边缘调整大小
- 在标题区域内拖动
- 右键单击标题区域以显示系统菜单
- 通过双击标题区域最大化/恢复
- 通过拖动或使用热键捕捉到屏幕两侧(Win 10)
最终结果如下所示:
调试时,DropShadow的第一个返回值是什么?如果返回False,则事件处理程序将无法连接,并且在调整其大小时DS将消失。它正确设置了处理程序。我已经决定删除它,并尝试一种不同的方式。我将在稍后发布我的方式…谢谢你的补充回答。你能贴一张代码的图片来展示它最后的样子吗。将帮助其他返回此线程的人:)当然。。。我会尽快拍一张照片。@StuartBlackler:我添加了图像和一个示例项目的链接。请注意,如果您不想看到夹点,可以使用ResizeMode的CanResize选项。现在您不需要
Microsoft.Windows.Shell
软件包。该类位于PresentationFramework.dll
asSystem.Windows.Shell.WindowChrome
中。这些选项对我不起作用。。。斯图尔特·布莱克勒加利福尼亚州