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>=> 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 生命周期能帮助您:
-
在正确时机初始化/清理资源
-
优化性能(如延迟加载)
-
避免内存泄漏
-
确保数据绑定和事件处理的安全
根据场景选择处理事件(如 Loaded 替代构造函数初始化数据),并在复杂控件中显式管理资源释放。
掌握 WPF 生命周期能帮助您:
-
在正确时机初始化/清理资源
-
优化性能(如延迟加载)
-
避免内存泄漏
-
确保数据绑定和事件处理的安全
根据场景选择处理事件(如 Loaded 替代构造函数初始化数据),并在复杂控件中显式管理资源释放。

浙公网安备 33010602011771号