窗体Window

Window 是 WPF 桌面应用的顶层容器控件,是所有界面元素(按钮、文本框、布局等)的根容器,相当于 Windows 桌面程序的「主窗口 / 弹出窗口」。
 
它负责:窗口标题、大小、位置、边框样式、图标、关闭 / 最小化 / 最大化、窗口生命周期、模态 / 非模态弹窗等核心功能。

一、Window 核心概念

  1. 顶层窗口:不依附于其他控件,独立显示在 Windows 任务栏
  2. 继承关系:Window → ContentControl → Control → FrameworkElement
    • 本质是内容控件,只能有一个直接子元素(通常用 Grid/StackPanel 包裹多个控件) 
  3. 两种使用方式
    • 普通窗口(主窗口)
    • 模态弹窗(必须关闭才能操作主窗口,如提示框)
    • 非模态弹窗(可同时操作主窗口,如记事本的查找窗口)

二、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 常用事件

窗口生命周期核心事件,开发中高频使用:
  1. Loaded:窗口加载完成、界面渲染后触发(初始化数据首选)
  2. Closing:窗口关闭前触发(可拦截关闭,如提示保存)
  3. Closed:窗口关闭后触发
  4. SizeChanged:窗口大小改变时触发
  5. MouseDown/KeyDown:鼠标 / 键盘事件

四、Window 常用方法

  1. Show():显示非模态窗口(不阻塞主窗口)
  2. ShowDialog():显示模态窗口(阻塞主窗口,必须关闭才能操作)
  3. Close():关闭当前窗口
  4. 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

七、总结

  1. Window 是 WPF 顶层窗口容器,所有界面都必须放在 Window 中
  2. 核心功能:窗口样式、大小、状态、生命周期、弹窗
  3. 只能有一个直接子元素,必须用布局控件(Grid/StackPanel)包裹
  4. 弹窗分模态 (ShowDialog)和非模态 (Show)
  5. 常用事件:Loaded(初始化)、Closing(拦截关闭)

 

posted on 2026-03-27 13:40  工业搬砖猿Lee  阅读(42)  评论(0)    收藏  举报