1、创建Application对象
- 新建WPF程序后,排除掉WPF自动创建的App.xaml,我们自定义一个类,在该类的Main()方法中,创建Application对象,然后调用创建一个窗口对象,最后在Run()方法中,传递这个窗口对象。便完成了一个简单的应用程序的启动。
class AppStart { [STAThread] public static void Main() { Application application = new Application(); MainWindow mainWindow = new MainWindow(); application.Run(mainWindow); } }
- 当Run()方法中传递一个窗口时,该窗口就被设置为主窗口。我们可以通过Application.MainWidow属性获取到主窗口。
- 调用Run()方法后会触发Application.Startup事件并显示主窗口。
- 当然还有另一种方式启动应用程序:
[STAThread] public static void Main() { Application application = new Application(); MainWindow mainWindow = new MainWindow(); application.MainWindow = mainWindow; application.Run(); }
2、自定义派生自Application的类
WPF自动会为我们创建一个App.xaml文件,<Applicatin>标签中的Class属性值会为我们创建一个派生自所在标签类型(Application)的类。并且这个类也应该是由两个不可见的partial类型组成。
从反编译结果可以看出自动生成的部分类中带有程序入口方法的Main()。所以该类的结构大致就是:
[STAThread()] static void Main() { App app = new App(); app.InitializeComponent(); app.Run(); } public void InitializeComponent() { this.StartupUri = new Uri("MainWindow.xaml",System.UriKind.Relative); }
而第二部分存储在项目的App.xaml.cs类似的文件中。这一部分由我们自己来添加代码:
public partial class App : Application { //添加你的实现 }
3、应用程序的关闭方式
通常只要还有一个窗口没有关闭,Application类就还处于有效状态。
- 可以通过调整Application.ShutdownMode属性来设置应用程序关闭模式。
- 如果Application是手动实例化的,则需要在Run()方法调用前设置ShutdownMode属性。
- 无论使用那种关闭模式,只要调用Application.Shutdown()方法,Application.Run()方法会立即返回,进而终止应用程序。Run()方法返回后,仍然可以在Main()里面处理其它代码或者在Exit事件中处理未完的事情。
4、应用程序事件
虽然,新建的App.xaml.cs中没有任何代码,但是我们仍然可以在其中添加一些代码来响应应用程序事件。下面贴出来一串代码来帮助理解Application类里面的事件。
/// <summary> /// Application.Run()之后,主窗口显示前发生。 /// </summary> /// <param name="e"></param> protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); //SplashScreen splashScreen = new SplashScreen("welcome.png"); //splashScreen.Show(false); //Thread.Sleep(1500); //splashScreen.Close(new TimeSpan(5000000)); } /// <summary> /// 发生在应用程序关闭时,并在Run()方法返回前发生。这是不能取消的关闭。 /// </summary> /// <param name="e"></param> protected override void OnExit(ExitEventArgs e) { base.OnExit(e); } /// <summary> /// 当程序从后台切换到前台时发生 /// </summary> /// <param name="e"></param> protected override void OnActivated(EventArgs e) { base.OnActivated(e); } /// <summary> /// 当应用程序切换到其它Windows程序时发生 /// </summary> /// <param name="e"></param> protected override void OnDeactivated(EventArgs e) { base.OnDeactivated(e); } /// <summary> /// /// </summary> /// <param name="e"></param> protected override void OnSessionEnding(SessionEndingCancelEventArgs e) { base.OnSessionEnding(e); }