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>

 问题解决,欢迎谈论。

posted @ 2021-10-30 15:50  陈百川  阅读(371)  评论(0编辑  收藏  举报