WPF开辟系列一:WPF应用法度生命周期

转载 2013年12月03日 11:13:59

http://www.mysjtu.com/page/M0/S613/613036.html

目标:


1.一个简单的WPF应用


2.WPF中的主窗体


3.Application的生命周期


4.单实例运行WPF应用


一、一个简单的WPF应用


WPF应用法度是一种包含Application对象的Windows过程,Application对象供给了生命周期办事,是以要懂得WPF应用的生命周期我们就须要从Application开端。


起首我们建树一个WPF应用,在默认景象下我们运行这个应用法度。


 


我们应用默认WPF Application创建了一个WPF应用,默认景象下我们什么都不做,点击运行就会看到上方的窗口。那么这背后Visual Studio为我们做了什么呢?我们知道在Winform中有一个Program.cs,此中定义了Main函数,法度从Main开端履行,那么WPF有没有类似的函数呢?我们的MainWindow又是在何处指定运行的?


我们可以看到VS为我们主动生成了一个App.xaml及其对应的隐蔽文件App.xaml.cs。在App.xaml.cs中我们可以看到它没有创建任何类,更没有启动MainWindow,那么打开App.xaml呢?打开App.xaml文件代码如下:


1 <Application x:Class="WPFLifeCycle.App"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 StartupUri="MainWindow.xaml" ShutdownMode="OnLastWindowClose">
5 <Application.Resources>
6
7 </Application.Resources>
8 </Application>

  


在这里我们看到x:Class="WPFLifeCycle.App",事实上如许的代码等同于创建了一个名为App的Application对象。而根节点Application的StartupUri属性指定了启动的窗口(StartupUri="MainWindow.xaml"),这就相当于创建了一个MainWindow类型的对象,然后调用其Show()办法。此时可能会有伴侣问,按理说这个法度应当有个Main函数啊,为安在此看不到Main呢?法度如何创建Application?


其实,这一切都归功于App.xaml文件的一个属性BuildAction


 


BuildAction属性指定了法度生成的体式格式,默认为ApplicationDefinition。对于WPF法度来说,若是指定了BuildAction为ApplicationDefinition之后,WPF会主动创建 Main函数,并且主动检测Application定义文件,按照定义文件主动创建Application对象并启动它(当然它会按照StartupUri创建MainWindow并显示)。


既然如此我们将BuildAction设置为None尝尝,我们运行会发明抛出如下错误:


 


很明显这时我们须要Main函数作为我们的法度进口,我们不妨手动创建尝尝,此时我们创建一个Program.cs类,代码如下:


 1 using System;
2 using System.Windows;
3
4 namespace WPFLifeCycle
5 {
6 static class Program
7 {
8 [STAThread]
9 static void Main()
10 {
11 Application App = new Application();
12 MainWindow mw = new MainWindow();
13 mw.Show();
14 App.Run();
15 }
16 }
17 }

运行之后我们看到的结果和之前完全一样。换句话说App.xaml文件和我们上方代码起到的结果是雷同的,事实上上方的xaml代码在编译时编译器也会做出同样的解析,这也是WPF设计的一个长处--很多器材我们都可以在XAML中实现而不须要编写过多的代码。


备注: App.xaml帮我们做的工作具体如下:


a.创建Application对象,并且设置其静态属性Current为当前对象


b.按照StartupUri创建并显示UI


c.设置Application的MainWindow属性(主窗口)


d.调用Application对象的Run办法,并对峙一向运行直到应用封闭


二、WPF中的主窗口


我们知道在Winform中我们有"主窗体"概念,在WPF中我们也同样有"主窗口"。"主窗口"是一个"顶级窗口",它不包含或者不附属于其他窗口。默认景象下,创建了Application对象之后会设置Application对象的MainWindow属性为第一个窗口对象来作为法度的"主窗口"。当然,若是你愿意这个属性在法度运行的任何时刻都是可以批改的。


在Winform中我们知道,主窗体封闭之后全部应用法度生命周期就会停止,这里我们不妨尝尝在WPF中是否如此。起首在应用程中添加另一个Window对象OtherWindow,然后在MainWindow中放一个按钮,点击按钮显示OtherWindow。运行结果如下:


 


如今点击封闭MainWindow之后我们发明OtherWindow并未封闭,当然Application并未停止:


 


这是不是申明Application封闭同Winform不合呢(当然我们调用Application.Current.Exit()是可以退出应用的)?在WPF中Application的封闭模式同Winform确切不合,WPF中应用法度的封闭模式有三种,它由Application对象的ShutdownMode属性来决意


 


它的列举值如下:

























列举名称


列举值


申明


OnLastWindowClose


0


当应用法度最后一个窗口封闭后则全部应用停止


OnMainWindowClose


1


当主窗口封闭后则应用法度停止


OnExplicitShutdown


2


只用经由过程调用Application.Current.Shutdown()才干停止应用法度


从上图我们也可以看到默认景象下ShutdownMode值是OnLastWindowClose,是以当MainWindow封闭后应用法度没有退出,若是要批改它可以将光标放到App.xaml中的XAML编辑窗口中,然后批改属性窗口中的ShutdownMode,也可以在XAML中或者法度中设置ShutdownMode属性。


三、Application的生命周期


下面我们看看Application的生命周期(引用网上一张图片)


 


上图片描述WPF应用的生命周期,此中值得一提的是Run办法后会调用应用程的Starup事务,而"已激活"、"已停用"分别对应Activated和Deactivate事务。DispatcherUnhandledException用来将事务路由到正确地位的对象,包含未处理惩罚的异常,可以用它来处理惩罚法度其他项目组未处理惩罚的异常或者一些操纵(例如保存当前文档)。当封闭、刊出或者从头启动时则会触发SessionEnding事务,SessionEnding事务中的SessionEndingCancelEventArgs的ReasonSessionEnding属性可以指导你是履行了刊出还是封闭(这是一个列举属性)。


四、单实例运行WPF应用


固然上方我们简单介绍了WPF应用的生命周期,然则默认景象下我们可以打开一个应用法度多个实例,例如你双击一个exe多次。当然有些时辰这么做会带来很多益处,然则有时我们又不欲望这么做,要避免这个题目其实很简单,同WinForm中单实例运行一个应用是一样的,我们只须要在应用法度启动时创建一个"排他锁",批改App.xaml.cs如下:


 1 using System;
2 using System.Windows;
3 using System.Threading;
4
5 namespace WPFLifeCycle
6 {
7 /// <summary>
8 /// Interaction logic for App.xaml
9 /// </summary>
10 public partial class App : Application
11 {
12 Mutex mutex=null;
13 protected override void OnStartup(StartupEventArgs e)
14 {
15 base.OnStartup(e);
16 bool createdNew = false;
17 mutex = new Mutex(true, "WPFLifeCycle",out createdNew);
18 if (!createdNew)
19 {
20 MessageBox.Show("法度正在运行中,无法启动另一个实例!", "体系提示", MessageBoxButton.OK, MessageBoxImage.Warning);
21 this.Shutdown();
22 }
23 }
24 }
25 }

此时若是我们已经运行了WPFLifeCycle.exe,当再双击此应用则会给出提示:

相关文章推荐

WPF中的窗口的生命周期

WPF中所有窗口的基类型都是System.Windows.Window。Window通常用于SDI窗口和对话框。Window在应用程序中除了一个设计用于托管顶级内容的控件外,就别无他物了。典型的,可以...

WPF系列之应用程序生命周期

摘要: WPF是微软最新的图形用户界面技术,从2003年公之于众(当时开发代号Avalon),其革命性的创建软件的方式便引起了高度关注,特别是对于使用Windows Form和GDI开发的人员。时至...

WinForm、WPF、ASP.NET窗口生命周期

做了这么久桌面应用程序开发,对窗口的生命周期还没有一个清晰的了解。那我们就对*WinForm、WPF和ASP.NET*应用程序中窗口的生命周期做一个测试,看一下在窗口的创建和消亡的过程中,各个事件的执...

Android应用开发提高系列——Activity生命周期

前言   四大应用程序组件中Activity是最常用的,也是必须掌握的一个组件。这里分几章梳理归纳一些实用的知识点与大家分享。 声明   欢迎转载,但请保...

Android应用开发提高系列 Activity生命周期

前言   四大应用程序组件中Activity是最常用的,也是必须掌握的一个组件。这里分几章梳理归纳一些实用的知识点与大家分享。 声明   欢迎转载,但请保留文章原始出处:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)