🔄 WPF Window 完整生命周期事件
📌 窗口创建和加载阶段
// 1. 窗口初始化(构造函数执行后)
Initialized += (s, e) => { };
// 首次初始化时触发,早于Loaded
// 2. 窗口加载
Loaded += (s, e) => { };
// 窗口及所有子元素加载完成,UI已渲染,最常用
// 3. 内容渲染
ContentRendered += (s, e) => { };
// 窗口内容首次渲染到屏幕后触发(晚于Loaded)
// 4. 窗口显示
SourceInitialized += (s, e) => { };
// 窗口句柄(HWND)创建后触发,可以使用WindowInteropHelper
🎯 窗口激活/失活阶段
// 5. 窗口激活
Activated += (s, e) => { };
// 窗口获得焦点时触发(用户点击窗口、Alt+Tab切换到窗口)
// 6. 窗口失活
Deactivated += (s, e) => { };
// 窗口失去焦点时触发(切换到其他窗口)
// 7. 获得键盘焦点
GotKeyboardFocus += (s, e) => { };
// 窗口内某元素获得键盘焦点
// 8. 失去键盘焦点
LostKeyboardFocus += (s, e) => { };
// 窗口内某元素失去键盘焦点
📐 窗口状态变化阶段
// 9. 状态改变
StateChanged += (s, e) => { };
// 窗口状态改变时触发(Normal ⇄ Maximized ⇄ Minimized)
// 10. 位置改变
LocationChanged += (s, e) => { };
// 窗口在屏幕上的位置改变
// 11. 大小改变
SizeChanged += (s, e) => { };
// 窗口尺寸改变时触发
// 12. DPI改变(高DPI支持)
DpiChanged += (s, e) => { };
// 窗口在不同DPI显示器间移动时触发
❌ 窗口关闭阶段
// 13. 正在关闭(可取消)
Closing += (s, e) => {
// e.Cancel = true; // 可以阻止窗口关闭
};
// 窗口即将关闭,可以进行保存提示等操作
// 14. 已关闭(不可取消)
Closed += (s, e) => { };
// 窗口已关闭,无法取消,用于清理资源
// 15. 卸载
Unloaded += (s, e) => { };
// 窗口从可视化树中移除时触发
📊 完整生命周期时序图
构造函数执行
↓
Initialized (初始化完成)
↓
SourceInitialized (窗口句柄创建)
↓
Loaded (UI加载完成) ← 最常用的启动事件
↓
ContentRendered (内容首次渲染)
↓
Activated (窗口激活) ← 可能多次触发
↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
运行期间可能触发的事件:
- StateChanged (最小化/最大化/正常)
- LocationChanged (移动窗口)
- SizeChanged (调整大小)
- Activated / Deactivated (焦点切换)
- DpiChanged (跨显示器)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
↓
Closing (即将关闭,可取消) ← 保存数据的最后机会
↓
Closed (已关闭)
↓
Unloaded (从可视化树移除)
↓
对象销毁
💡 实际应用场景示例
public MainWindow()
{
InitializeComponent();
// ✅ 初始化数据和配置
Loaded += (s, e) => {
LoadUserSettings();
StartBackgroundServices();
};
// ✅ 监控窗口状态变化,更新UI
StateChanged += (s, e) => {
if (WindowState == WindowState.Minimized)
PauseVideoPlayback();
else if (WindowState == WindowState.Normal)
ResumeVideoPlayback();
};
// ✅ 窗口激活时刷新数据
Activated += (s, e) => {
RefreshNotifications();
};
// ✅ 失去焦点时自动保存
Deactivated += (s, e) => {
AutoSaveDocument();
};
// ✅ 关闭前确认
Closing += (s, e) => {
if (HasUnsavedChanges)
{
var result = MessageBox.Show(
"有未保存的更改,确定要关闭吗?",
"确认",
MessageBoxButton.YesNo
);
if (result == MessageBoxResult.No)
e.Cancel = true; // 取消关闭
}
};
// ✅ 清理资源
Closed += (s, e) => {
StopBackgroundServices();
DisposeResources();
};
// ✅ 跨DPI显示器适配
DpiChanged += (s, e) => {
UpdateIconsForNewDpi(e.NewDpi);
};
}
🎯 常用事件推荐
| 事件 |
使用频率 |
典型用途 |
Loaded |
⭐⭐⭐⭐⭐ |
初始化、加载数据、启动服务 |
Closing |
⭐⭐⭐⭐⭐ |
保存数据、确认关闭 |
StateChanged |
⭐⭐⭐⭐ |
响应最小化/最大化 |
SizeChanged |
⭐⭐⭐⭐ |
响应式布局调整 |
Activated |
⭐⭐⭐ |
刷新数据、恢复状态 |
Closed |
⭐⭐⭐ |
清理资源 |
ContentRendered |
⭐⭐ |
启动动画、首次渲染后的操作 |
DpiChanged |
⭐⭐ |
高DPI适配 |