WPF WindowChrome 自定义窗体
一、标准Window
窗口由两部分构成:工作区,非工作区,图中出工作区之外都是非工作区。
二、WindowChrome的基本概念
WindowChrome的作用:将客户区域扩展至整个窗体(遮住了非客户区),同时提供部分标准窗体的功能。
若要自定义窗口,同时保留其标准功能,可以使用WindowChrome类。 WindowChrome类允许您控制的客户端和应用程序窗口的非工作区之间的边界。
<WindowChrome.WindowChrome> <WindowChrome /> </WindowChrome.WindowChrome>
运行效果如图:
UseAeroCaptionButtons:表示标题栏上的那三个默认按钮是否可以命中,因为我们想要自己管理这三个按钮的样式、显示或隐藏,所以设置为False
GlassFrameThickness:用于控制边框
ResizeBorderThickness:用户可以单击并拖动以调整窗口大小的区域的宽度。
CaptionHeight:指定WindowChrome的标题栏高度,允许窗体被鼠标拖动
CornerRadius:则将窗体变成了圆角
IsHitTestVisibleInChrome:穿过CaptionHeight,允许响应控件事件
示例一:
XAML代码:
<WindowChrome.WindowChrome> <WindowChrome CornerRadius="0" CaptionHeight="0" GlassFrameThickness="1" UseAeroCaptionButtons="False" NonClientFrameEdges="None" /> </WindowChrome.WindowChrome> <Grid> <Border Height="30" Background="Red" VerticalAlignment="Top"></Border> </Grid>
自定义窗台,同时加上阴影效果:
<Style TargetType="Window" x:Key="WindowStyle"> <!--无边框--> <Setter Property="ResizeMode" Value="NoResize"></Setter> <!--无默认样式--> <Setter Property="WindowStyle" Value="None"></Setter> <!--自定义窗体--> <Setter Property="WindowChrome.WindowChrome"> <Setter.Value> <WindowChrome GlassFrameThickness="-1" CaptionHeight="30" CornerRadius="0"/> <!--CaptionHeight:标题栏高度,允许窗体被鼠标拖动--> <!--CornerRadius:窗体边框圆角--> <!--GlassFrameThickness:窗体边框大小--> </Setter.Value> </Setter> <!--阴影效果--> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Window}"> <Border BorderThickness="10" CornerRadius="10"> <Border.Effect> <DropShadowEffect ShadowDepth="0" BlurRadius="10" Color="#AAAAAA"/> </Border.Effect> <ContentPresenter /> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
参考:
WindowChrome自定义Window Style:https://www.cnblogs.com/dino623/p/custom_window_style_using_WindowChrome.html
使用WindowChrome自定义Window Style:https://www.cnblogs.com/dino623/p/CustomWindowStyle.html
WPF中自定义标题栏时窗体最大化处理之WindowChrome:https://www.cnblogs.com/huaxia283611/p/wpf-maximize-windowchrome.html
WPF 窗口大小自适应:https://blog.csdn.net/weixin_34268843/article/details/89581243
WPF 设置属性使窗口不可改变大小:https://blog.csdn.net/qq_39704682/article/details/95475855
WindowChrome的功能详解:https://www.cnblogs.com/cdaniu/p/16875714.html
WPF的MainWindow设置背景透明仍然显示黑色Black问题
<Window ... AllowsTransparency="True" Foreground="{x:Null}" Background="{x:Null}" FocusVisualStyle="{x:Null}">
注意要设置AllowsTransparency=true,允许透明色,否则就是黑色
window 拖动
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); if (e.ButtonState == MouseButtonState.Pressed) DragMove(); }
窗口失去焦点
protected override void OnDeactivated(EventArgs e) { base.OnDeactivated(e); this.Close(); }
设置窗口内容自适应
<Window SizeToContent="WidthAndHeight"
判断项目中的某个窗体是否已经打开或者已经存在
foreach (Window item in Application.Current.Windows) { if (item is window1) return; }