WPF无边框的一个方案(保留默认窗口的拖动、阴影等效果)
使用 WindowStyle="None" AllowsTransparency="True" 的方式达成无边框的效果有很多无法忽视的缺陷,比如失去了拖动效果、双击全屏、阴影等。
使用 WindowChrome 可以避免这些缺陷,在需要无边框的窗口使用:
1、
<WindowChrome.WindowChrome> <WindowChrome CaptionHeight="44" GlassFrameThickness="-1" UseAeroCaptionButtons="False"/> </WindowChrome.WindowChrome>
其中 CaptionHeight 是标题栏的高度,其值可根据需求定义,这里定义为44像素。其中道理可参考:
WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)
2、控件与上述标题重合时,默认无法相应点击事件,在控件中添加下述代码修改此行为:
WindowChrome.IsHitTestVisibleInChrome="True"
IsHitTestVisibleInChrome 可继承,比如在一个Grid将IsHitTestVisibleInChrome属性设置为真,其子元素该属性均为真。
可参考:WPF 按钮 Button 的 IsEnabled 属性对 WindowChrome 的 IsHitTestVisibleInChrome 的影响
3、使用此方法,全屏时边缘将丢失几个像素!在windows10上这个数值是7,我通过定制一个 WinRootPanelStyle样式消除该影响,每一个窗口的根Panel应用该样式:
<Style TargetType="{x:Type Panel}" x:Key="WinRootPanelStyle"> <Setter Property="Margin" Value="0" /> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=WindowState}" Value="Maximized"> <Setter Property="Margin" Value="7" /> </DataTrigger> </Style.Triggers> </Style>
在窗口根Panel应用它,就像这样:
<Grid Style="{StaticResource WinRootPanelStyle}"> </Grid>
问题解决,欢迎谈论。
本文来自博客园,作者:陈百川,欢迎留言讨论。转载请注明原文链接:https://www.cnblogs.com/buachuan/p/15485186.html