文章目录
- 一. 目标
- 二. 技能介绍
- ① OnStartup方法介绍
- ② Startup事件介绍
- 三. 结论
- ① 不同点1: 设计意图
- ② 不同点2: 执行时机
一. 目标
- 搞明白WPF应用中
OnStartup()
方法的作用和用法- 搞明白WPF应用中
StartUp
事件的作用和用法- 搞明白为什么同时需要这两个功能?它们设计上有所重叠,什么时候使用重写
OnStartup()
方法,什么时候使用StartUp
事件?
二. 技能介绍
① OnStartup方法介绍
OnStartup()
方法是Application
类中的一个虚拟方法,提供了一种在派生类中处理启动逻辑的方式.当WPF
应用程序启动并且准备好运行时,会自动调用此方法.通过重写OnStartup
方法,你可以在应用程序启动时插入自定义的启动逻辑,比如配置应用程序环境,注册服务,准备数据等.这种方法更适合面向对象设计,对于需要复杂逻辑和更好封装的应用程序,重写OnStartup
方法是更好的选择.下面举一个例子来说明OnStartup()
方法的使用场景
public partial class App : Application
{
public App()
{
// 通过这种方式,可以将调试信息打印到输出窗口,在这种WPF应用程序中进行调试的时候很方便.
System.Diagnostics.Debug.WriteLine("App() 构造函数执行完毕");
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// 初始化数据库
InitializeDatabase();
// 初始化日志系统
InitializeLogging();
// 注册全局异常处理器
DispatcherUnhandledException += GlobalUiExceptionHandler;
System.Diagnostics.Debug.WriteLine("OnSatrtup() 方法执行完毕!");
}
private void GlobalUiExceptionHandler(object sender, DispatcherUnhandledExceptionEventArgs e)
{
}
private void InitializeLogging()
{
}
private void InitializeDatabase()
{
}
}
上面代码我学到了哪些技能:
- WPF框架的
Application
类实现了虚方法OnStartup()
,它的子类可以重写这个方法,来进行应用程序的一些初始化工作.并且它的调用是在App()
构造函数执行完成之后.System.Diagnostics.Debug.WriteLine
可以在WPF应用程序调试的时候增加调试日志到visual studio
的输出窗口
② Startup事件介绍
Startup
事件是Application
类提供的一个事件,当应用程序完成启动准备时触发.Startup
事件提供了一种更灵活的方式来添加启动逻辑,如果你不想继承Application
的时候使用Strtup
事件是更好的完成初始化动作的选择.
Startup事件的使用方式1:XAML中声明事件,后台实现(常规方法)
<Application x:Class="OnStartUpTest.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:OnStartUpTest"
Startup="Application_Startup" StartupUri="MainWindow.xaml">
<Application.Resources />
</Application>
Startup事件使用方式2:后台直接在构造函数中绑定事件
public App()
{
Startup += Application_Startup;
// 通过这种方式,可以将调试信息打印到输出窗口,在这种WPF应用程序中进行调试的时候很方便.
System.Diagnostics.Debug.WriteLine("App() 构造函数执行完毕");
}
具体的后台代码如下:
namespace OnStartUpTest
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
public App()
{
Startup += Application_Startup;
// 通过这种方式,可以将调试信息打印到输出窗口,在这种WPF应用程序中进行调试的时候很方便.
System.Diagnostics.Debug.WriteLine("App() 构造函数执行完毕");
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// 初始化数据库
InitializeDatabase();
// 初始化日志系统
InitializeLogging();
// 注册全局异常处理器
DispatcherUnhandledException += GlobalUiExceptionHandler;
System.Diagnostics.Debug.WriteLine("OnSatrtup() 方法执行完毕!");
}
private void GlobalUiExceptionHandler(object sender, DispatcherUnhandledExceptionEventArgs e)
{
}
private void InitializeLogging()
{
}
private void InitializeDatabase()
{
}
private void Application_Startup(object sender, StartupEventArgs e)
{
// 加载配置数据
LoadConfigurationData();
System.Diagnostics.Debug.WriteLine("Startup 事件执行完毕!");
}
private void LoadConfigurationData()
{
}
}
}
运行结果:
三. 结论
OnStartup()
方法和Startup
事件从功能上来说非常的相似,都是在启动的时候执行一些初始化和资源加载的工作.但是它们具有本质上的不同.
① 不同点1: 设计意图
OnStartup
是面向对象的一个设计,当你继承Application
类的时候,可以重写这个方法,然后里面执行更加复杂的逻辑和自己做的一些项目启动前的准备Startup
是事件驱动设计.允许多个订阅者监听和响应事件,同时适用于不需要从Application
类派生的情况
② 不同点2: 执行时机
从上面的日志可以看出来
Startup
事件会先于OnStartup()
方法执行
结论: 具体你想使用哪种方式来完成项目启动前的初始化,都是可以的,我一般喜欢使用事件的方式,比较简单,并且不需要重写父类方法