窗体Window
Window 是 WPF 桌面应用的顶层容器控件,是所有界面元素(按钮、文本框、布局等)的根容器,相当于 Windows 桌面程序的「主窗口 / 弹出窗口」。
它负责:窗口标题、大小、位置、边框样式、图标、关闭 / 最小化 / 最大化、窗口生命周期、模态 / 非模态弹窗等核心功能。
一、Window 核心概念
- 顶层窗口:不依附于其他控件,独立显示在 Windows 任务栏
- 继承关系:
Window → ContentControl → Control → FrameworkElement- 本质是内容控件,只能有一个直接子元素(通常用 Grid/StackPanel 包裹多个控件)
- 两种使用方式
- 普通窗口(主窗口)
- 模态弹窗(必须关闭才能操作主窗口,如提示框)
- 非模态弹窗(可同时操作主窗口,如记事本的查找窗口)
二、Window 常用关键属性
| 属性 | 作用 | 常用值 |
|---|---|---|
Title |
窗口标题栏文字 | 字符串 |
Width/Height |
窗口默认宽高 | 数值 |
MinWidth/MinHeight |
窗口最小尺寸 | 数值 |
MaxWidth/MaxHeight |
窗口最大尺寸 | 数值 |
WindowState |
窗口状态 | Normal (正常)、Maximized (最大化)、Minimized (最小化) |
WindowStyle |
窗口边框样式 | None (无边框)、SingleBorderWindow (默认) |
ResizeMode |
窗口是否可拖拽缩放 | NoResize (不可调整)、CanResize (可调整) |
Icon |
窗口左上角图标 | 图片路径 |
Background |
窗口背景色 | 颜色 / 画刷 |
Topmost |
是否置顶显示 | True/False |
ShowInTaskbar |
是否在任务栏显示 | True/False |
StartupLocation |
窗口启动位置 | CenterOwner (居中于父窗口)、CenterScreen (屏幕居中) |
Cursor |
鼠标悬浮样式 | 系统光标 |
三、Window 常用事件
窗口生命周期核心事件,开发中高频使用:
- Loaded:窗口加载完成、界面渲染后触发(初始化数据首选)
- Closing:窗口关闭前触发(可拦截关闭,如提示保存)
- Closed:窗口关闭后触发
- SizeChanged:窗口大小改变时触发
- MouseDown/KeyDown:鼠标 / 键盘事件
四、Window 常用方法
- Show():显示非模态窗口(不阻塞主窗口)
- ShowDialog():显示模态窗口(阻塞主窗口,必须关闭才能操作)
- Close():关闭当前窗口
- Hide():隐藏窗口(不销毁,可再次 Show)
五、完整实战示例
我们做一个包含:主窗口 + 模态弹窗 + 无边框窗口 + 窗口事件 的完整 Demo。
步骤 1:创建 WPF 项目
Visual Studio → 新建 WPF 应用 (.NET Framework/.NET 6+)
示例 1:基础主窗口(MainWindow.xaml)
1 <Window x:Class="WpfWindowDemo.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="WPF Window 主窗口" <!-- 窗口标题 --> 5 Width="600" Height="400" <!-- 默认大小 --> 6 MinWidth="400" MinHeight="300" <!-- 最小尺寸 --> 7 WindowState="Normal" <!-- 初始状态:正常 --> 8 ResizeMode="CanResize" <!-- 允许缩放 --> 9 StartupLocation="CenterScreen" <!-- 启动居中 --> 10 Background="#f0f0f0" <!-- 背景色 --> 11 Icon="app.ico" <!-- 窗口图标 --> 12 Loaded="MainWindow_Loaded" <!-- 加载事件 --> 13 Closing="MainWindow_Closing"> <!-- 关闭事件 --> 14 15 <!-- Window 只能有一个直接子元素,用 Grid 布局 --> 16 <Grid> 17 <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> 18 <Button x:Name="btnModal" Content="打开模态弹窗" 19 Width="180" Height="40" Margin="10" 20 Click="BtnModal_Click"/> 21 22 <Button x:Name="btnNoBorder" Content="打开无边框窗口" 23 Width="180" Height="40" Margin="10" 24 Click="BtnNoBorder_Click"/> 25 </StackPanel> 26 </Grid> 27 </Window>
后台代码(MainWindow.xaml.cs)
1 using System; 2 using System.Windows; 3 using System.Windows.MessageBox; 4 5 namespace WpfWindowDemo 6 { 7 public partial class MainWindow : Window 8 { 9 public MainWindow() 10 { 11 InitializeComponent(); // 初始化界面(必须调用) 12 } 13 14 // 窗口加载完成事件 15 private void MainWindow_Loaded(object sender, RoutedEventArgs e) 16 { 17 MessageBox.Show("主窗口加载完成!"); 18 } 19 20 // 窗口关闭前事件(可拦截关闭) 21 private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 22 { 23 // 弹出确认框 24 MessageBoxResult result = MessageBox.Show("确定要退出吗?", "提示", 25 MessageBoxButton.YesNo, 26 MessageBoxImage.Question); 27 if (result == MessageBoxResult.No) 28 { 29 e.Cancel = true; // 拦截关闭,窗口不关闭 30 } 31 } 32 33 // 打开模态弹窗 34 private void BtnModal_Click(object sender, RoutedEventArgs e) 35 { 36 ModalWindow modal = new ModalWindow(); 37 modal.Owner = this; // 设置父窗口 38 modal.ShowDialog(); // 模态:必须关闭才能操作主窗口 39 } 40 41 // 打开无边框窗口 42 private void BtnNoBorder_Click(object sender, RoutedEventArgs e) 43 { 44 NoBorderWindow borderWindow = new NoBorderWindow(); 45 borderWindow.Show(); // 非模态:可同时操作 46 } 47 } 48 }
示例 2:模态弹窗窗口(ModalWindow.xaml)
1 <Window x:Class="WpfWindowDemo.ModalWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="模态弹窗" 5 Width="300" Height="200" 6 ResizeMode="NoResize" <!-- 禁止缩放 --> 7 WindowStartupLocation="CenterOwner"> <!-- 居中于父窗口 --> 8 <Grid> 9 <Button Content="我是模态弹窗,点击关闭" 10 Click="BtnClose_Click" 11 VerticalAlignment="Center" HorizontalAlignment="Center"/> 12 </Grid> 13 </Window>
1 public partial class ModalWindow : Window 2 { 3 public ModalWindow() 4 { 5 InitializeComponent(); 6 } 7 private void BtnClose_Click(object sender, RoutedEventArgs e) 8 { 9 this.Close(); // 关闭当前窗口 10 } 11 }
示例 3:无边框窗口(NoBorderWindow.xaml)
核心:
WindowStyle="None" 去掉标题栏和边框1 <Window x:Class="WpfWindowDemo.NoBorderWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 WindowStyle="None" <!-- 无边框无标题栏 --> 5 AllowsTransparency="True" <!-- 允许透明 --> 6 Background="#2c3e50" 7 Width="400" Height="300" 8 WindowStartupLocation="CenterScreen" 9 MouseLeftButtonDown="Window_MouseLeftButtonDown"> <!-- 拖拽移动 --> 10 11 <Grid> 12 <TextBlock Text="无边框窗口" Foreground="White" FontSize="20" 13 VerticalAlignment="Center" HorizontalAlignment="Center"/> 14 15 <Button Content="关闭" Width="80" Height="30" 16 VerticalAlignment="Bottom" Margin="20" 17 Click="BtnClose_Click"/> 18 </Grid> 19 </Window>
1 public partial class NoBorderWindow : Window 2 { 3 public NoBorderWindow() 4 { 5 InitializeComponent(); 6 } 7 8 // 无边框窗口实现拖拽移动 9 private void Window_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 10 { 11 this.DragMove(); // WPF 内置拖拽方法 12 } 13 14 private void BtnClose_Click(object sender, RoutedEventArgs e) 15 { 16 this.Close(); 17 } 18 }
六、关键知识点重点说明
1. Window 内容限制
Window 只能有 1 个直接子元素,不能直接写多个控件:
1 <!-- 错误写法 --> 2 <Window> 3 <Button/> 4 <TextBlock/> 5 </Window> 6 7 <!-- 正确写法:用布局容器包裹 --> 8 <Window> 9 <Grid> 10 <Button/> 11 <TextBlock/> 12 </Grid> 13 </Window>
2. 模态 vs 非模态
- ShowDialog():阻塞主线程,必须关闭弹窗才能操作主窗口(用于确认、设置)
- Show():非阻塞,多窗口同时操作(用于工具、侧边栏)
3. 无边框窗口必备
WindowStyle="None":隐藏标题栏AllowsTransparency="True":支持透明背景DragMove():实现窗口拖拽移动
4. 窗口生命周期顺序
构造函数 → InitializeComponent → Loaded → 交互操作 → Closing → Closed七、总结
- Window 是 WPF 顶层窗口容器,所有界面都必须放在 Window 中
- 核心功能:窗口样式、大小、状态、生命周期、弹窗
- 只能有一个直接子元素,必须用布局控件(Grid/StackPanel)包裹
- 弹窗分模态 (ShowDialog)和非模态 (Show)
- 常用事件:
Loaded(初始化)、Closing(拦截关闭)
浙公网安备 33010602011771号