Loading

WPF Window的所有重要生命周期事件

🔄 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适配
posted @ 2026-02-07 15:57  老卫同学  阅读(15)  评论(0)    收藏  举报