WPF常用控件-Window

常用属性

这里重点记录一些关键且容易忘记的属性,那些很常用的如Title啥的就不在这里一一说明了。

任务栏按钮

ShowInTaskbar:是否在任务栏中显示应用按钮,默认为True

层级

Topmost:应用是否始终在所有应用的最上层,默认为False

图标

Icon:设置应用窗体左上角的图标。

事件函数

Loaded:指定窗体加载函数,例如Loaded="Window_Loaded"

Closing:指定窗体的关闭事件处理函数。

MouseDoubleClick:指定窗体的双击事件处理函数。

WindowChrome

在WPF中,如果希望设置窗体无边框,是可以通过设置窗体WindowsWindowStyle="None"来实现的。但是通过这种方式设置的无边框窗口,缺少了边框阴影、边框拉伸、边框移动、双击放大/缩小等一系列的功能。对于此WPF提供了更加简便的方式,即WindowChrome

csharp 复制代码
<Window x:Class="WPFStudy.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        xmlns:local="clr-namespace:WPFStudy"
        Title="MainWindow"
        Height="450" 
        Width="800">
    <WindowChrome.WindowChrome>
        <WindowChrome/>
    </WindowChrome.WindowChrome>
    <Grid>
    </Grid>
</Window>


标题区域高度设置

CaptionHeight:指定窗口顶部的标题区域的高度。

csharp 复制代码
<WindowChrome.WindowChrome>
    <WindowChrome CaptionHeight="50"/>
</WindowChrome.WindowChrome>

取消默认按钮

使用WindowChrome之后,虽然看不见,但是那几个默认的按钮还是存在的,如果鼠标点击对应的位置,就会触发相应的功能。如果要屏蔽这三个默认按钮,可以使用以下属性。

UseAeroCaptionButtons:是否启用标题按钮的命中测试,也就是点击对应位置是否触发这三个标题按钮,默认为True,设为False即可屏蔽。

csharp 复制代码
<WindowChrome.WindowChrome>
    <WindowChrome UseAeroCaptionButtons="False"/>
</WindowChrome.WindowChrome>

玻璃边框宽度

GlassFrameThickness:设置窗体玻璃边框的宽度,官方文档中有说,如果指定 GlassFrameThickness 值为 -1,那么可以做到整个窗口都遮挡,所以一般设置为1就可以了。如果要禁用这个效果,则设置为0即可。

缩放区域宽度

如果没有禁用窗口的缩放,在希望改变缩放触发区域宽度时,可以通过ResizeBorderThickness属性进行修改。

xml 复制代码
<WindowChrome.WindowChrome>
    <WindowChrome ResizeBorderThickness="10"/>
</WindowChrome.WindowChrome>

标题栏遮挡子控件的处理

当窗体内的子控件出与窗体标题区域重叠时,默认会被标题区域遮挡,如果希望优先使用子控件,可以在子控件中使用以下属性。

WindowChrome.IsHitTestVisibleInChrome:附加属性,是否优先点击窗体中的可见区域,默认为false

csharp 复制代码
<WindowChrome.WindowChrome>
    <WindowChrome CaptionHeight="50" UseAeroCaptionButtons="False"/>
</WindowChrome.WindowChrome>
<Grid>
    <Button WindowChrome.IsHitTestVisibleInChrome="True" Width="50" Height="50" Content="button" HorizontalAlignment="Right" VerticalAlignment="Top" />
</Grid>

WindowStyle方式

属性设置

csharp 复制代码
<Window ......
        WindowStyle="None"
        Background="Transparent"
        AllowsTransparency="True"
				......
>
		......
</Window>

窗体拖动

有些情况下只能通过WindowStyle的方式来设置窗体的无边框样式(例如异样窗口下无法使用WindowChrome),此时如果要实现窗体的拖动,就需要在对应的区域内设置

csharp 复制代码
<Grid>
	  <Label Background="Yellow" Height="20" VerticalAlignment="Top" MouseDown="Label_MouseDown"/>
</Grid>
csharp 复制代码
private void Label_MouseDown(object sender, MouseButtonEventArgs e)
{
    DragMove();//吓尿了,比winform简单很多
}

无边框遮挡任务栏解决方案

在使用WindowStyle="None"的方式设计无边框窗体时,将窗体最大化会遮挡屏幕下方的任务栏。针对这个问题有一个较好的解决方案是在窗体加载时设置窗体的最大宽度和高度。

csharp 复制代码
public MainWindow()
{
    InitializeComponent();
		MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
		MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
}
相关推荐
玖笙&2 天前
✨WPF编程基础【3.3】:容器控件(附源码)
c++·wpf·visual studio
500842 天前
GE 怎么做算子融合
分布式·架构·开源·wpf
500842 天前
Conv + BN + ReLU 融合:省掉两次显存读写
flutter·架构·开源·wpf·音视频
500842 天前
把 FlashAttention 讲清楚
flutter·electron·wpf
500843 天前
ATC 做了什么:从 ONNX 到 .om
分布式·架构·开源·wpf·开源鸿蒙
500843 天前
Graph Engine 是什么,为什么需要它
java·人工智能·性能优化·ocr·wpf
一念春风3 天前
.md文件浏览器
c#·wpf
lingxiao168883 天前
Wpf常用样式与自定义控件(仪表盘,管道,分页器等)
wpf
LateFrames3 天前
520 - 如何说晚安 (WPF)
c#·wpf·浪漫·ui体验
heimeiyingwang4 天前
【架构实战】日志体系ELK:集中化日志管理实践
elk·架构·wpf