WPF生命周期管理与内存优化

1. 应用程序生命周期(Application Lifecycle)
Startup 事件
应用程序入口点,在 App.xaml.cs 中定义。通常用于初始化资源或显示主窗口。

csharp
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow
= new MainWindow();
MainWindow.Show();
}
}
运行期间
处理用户输入、事件响应、数据绑定等。

Exit 事件
应用程序结束时触发,用于清理资源。

csharp
protected override void OnExit(ExitEventArgs e)
{
// 释放资源
base.OnExit(e);
}
2. 窗口生命周期(Window Lifecycle)
初始化

构造函数和 InitializeComponent() 加载 XAML 元素。

csharp
public MainWindow()
{
InitializeComponent();
// 解析 XAML 并创建 UI 树
}
Loaded 事件
UI 元素渲染完成后触发,适合初始化数据或订阅事件。

csharp
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// 加载数据或初始化逻辑
}
激活与失活

Activated:窗口获得焦点时触发。

Deactivated:窗口失去焦点时触发。

Closing 事件
窗口关闭前触发,可取消关闭操作(如提示保存)。

csharp
private void Window_Closing(object sender, CancelEventArgs e)
{
if (MessageBox.Show("确认关闭?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.No)
e.Cancel
= true; // 阻止关闭
}
Closed 事件
窗口关闭后触发,用于释放非托管资源。

csharp
private void Window_Closed(object sender, EventArgs e)
{
// 清理资源
}
3. 控件生命周期(UIElement Lifecycle)
初始化
通过构造函数和 XAML 加载。

Loaded 与 Unloaded 事件

Loaded:控件加入可视化树时触发(如页面导航或动态添加)。

Unloaded:控件从可视化树移除时触发(需在此取消事件订阅,避免内存泄漏)。

csharp
private void UserControl_Loaded(object sender, RoutedEventArgs e) { / 初始化 / }
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
// 取消事件订阅
this.Loaded -= UserControl_Loaded;
}
渲染阶段

Measure 和 Arrange:WPF 布局系统自动调用,计算控件大小和位置。

OnRender:实际绘制控件(通常无需重写)。

4. 数据绑定生命周期
绑定初始化
在 XAML 或代码中建立绑定关系。

xaml
<TextBlock Text="{Binding UserName}" />
更新与通知
通过 INotifyPropertyChanged 实现动态更新。

csharp
public class User : INotifyPropertyChanged
{
private string _userName;
public string UserName
{
get => _userName;
set
{
_userName
= value;
OnPropertyChanged(nameof(UserName));
}
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">event</span><span style="color: #000000;"> PropertyChangedEventHandler PropertyChanged;
</span><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">void</span> OnPropertyChanged(<span style="color: #0000ff;">string</span><span style="color: #000000;"> propertyName)
    </span>=&gt; PropertyChanged?.Invoke(<span style="color: #0000ff;">this</span>, <span style="color: #0000ff;">new</span><span style="color: #000000;"> PropertyChangedEventArgs(propertyName));

}
绑定解除
控件 Unloaded 时自动解除绑定(若使用 Dispose() 需手动清理)。

5. 内存管理关键点
避免内存泄漏

在 Unloaded 事件中取消事件订阅。

避免静态对象引用控件。

使用弱事件模式(如 WeakEventManager)。

资源释放
实现 IDisposable 接口释放非托管资源:

csharp
public void Dispose()
{
// 释放数据库连接、文件句柄等
}

掌握 WPF 生命周期能帮助您:

  1. 在正确时机初始化/清理资源

  2. 优化性能(如延迟加载)

  3. 避免内存泄漏

  4. 确保数据绑定和事件处理的安全

根据场景选择处理事件(如 Loaded 替代构造函数初始化数据),并在复杂控件中显式管理资源释放。

 
 
 



掌握 WPF 生命周期能帮助您:

  1. 在正确时机初始化/清理资源

  2. 优化性能(如延迟加载)

  3. 避免内存泄漏

  4. 确保数据绑定和事件处理的安全

根据场景选择处理事件(如 Loaded 替代构造函数初始化数据),并在复杂控件中显式管理资源释放。

 
 
 

 

posted @ 2025-06-19 21:00  若水如引  阅读(69)  评论(0)    收藏  举报