一.介绍WPF和 传统的WinForm 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain (应用程序域)中只能有一个 Application 实例存在。和 WinForm 不同的是 WPF Application 默认由两部分组成 : App.xaml 和 App.xaml.cs,这有点类似于 Delphi Form(我对此只是了解,并没有接触过Delphi ),将定义和行为代码相分离。当然,这个和WebForm 也比较类似。XAML 从严格意义上说并不是一个纯粹的 XML 格式文件,它更像是一种 DSL(Domain Specific Language,领域特定语言),它的所有定义都直接映射成某些代码,只是具体的翻译工作交给了编译器完成而已。WPF应用程序由 System.Windows.Application类来进行管理。
二.创建WPF应用程序
创建WPF应用程序有两种方式:
1、Visual Studio和Expression Blend默认的方式,使用App.xaml文件定义启动应用程序
App.xaml文件的内容大致如下所示:
2、可以自已定义类,定义Main方法实现对WPF应用程序的启动
在项目中添加一个类,类的代码如下,在项目选项中,设定此类为启动项。 using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Windows;
namespace WPFApplications { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { [STAThread] static void Main() { // 定义Application对象作为整个应用程序入口 Application app = new Application(); // 方法一:调用Run方法,参数为启动的窗体对象 ,也是最常用的方法 Window2 win = new Window2(); app.Run(win);
// 方法二:指定Application对象的MainWindow属性为启动窗体,然后调用无参数的Run方法 //Window2 win = new Window2(); //app.MainWindow = win; //win.Show(); // win.Show()是必须的,否则无法显示窗体 //app.Run();
// 方法三:通过Url的方式启动 //app.StartupUri = new Uri("Window2.xaml", UriKind.Relative); //app.Run(); } } }
三、Application应用程序关闭
|
|
OnLastWindowClose(默认值): |
最后一个窗体关闭或调用Application对象的Shutdown() 方法时,应用程序关闭。 |
OnMainWindowClose |
启动窗体关闭或调用Application对象的Shutdown()方法时,应用程序关闭。(和C#的Windows应用程序的关闭模式比较类似) |
OnExplicitShutdown |
只有在调用Application对象的Shutdown()方法时,应用程序才会关闭。 |
对关闭选项更改的时候,可以直接在App.xaml中更改: <Application x:Class="WPFApplications.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window2.xaml" ShutdownMode="OnExplicitShutdown"> <Application.Resources> </Application.Resources> </Application>
同样你也可以在代码文件(App.xaml.cs)中进行更改,但必须注意这个设置写在app.Run()方法之前 ,如下代码: app.ShutdownMode = ShutdownMode.OnExplicitShutdown; app.Run(win);
四、Application对象的事件
名称 |
描述 |
Activated |
当应用程序成为前台应用程序时发生,即获取焦点。 |
Deactivated |
当应用程序停止作为前台应用程序时发生,即失去焦点。 |
DispatcherUnhandledException |
在异常由应用程序引发但未进行处理时发生。 |
Exit |
正好在应用程序关闭之前发生,且无法取消。 |
FragmentNavigation |
当应用程序中的导航器开始导航至某个内容片断时发生,如果所需片段位于当前内容中,则导航会立即发生;或者,如果所需片段位于不同 内容中,则导航会在加载了源 XAML 内容之后发生。 |
LoadCompleted |
在已经加载、分析并开始呈现应用程序中的导航器导航到的内容时发生。 |
Navigated |
在已经找到应用程序中的导航器要导航到的内容时发生,尽管此时该内容可能尚未完成加载。 |
Navigating |
在应用程序中的导航器请求新导航时发生。 |
NavigationFailed |
在应用程序中的导航器在导航到所请求内容时出现错误的情况下发生。 |
NavigationProgress |
在由应用程序中的导航器管理的下载过程中定期发生,以提供导航进度信息。 |
NavigationStopped |
在调用应用程序中的导航器的 StopLoading 方法时发生,或者当导航器在当前导航正在进行期间请求了一个新导航时发生(没大用到)。 |
SessionEnding |
在用户通过注销或关闭操作系统而结束 Windows 会话时发生。 |
Startup |
在调用 Application 对象的 Run 方法时发生。 |
应用程序的事件处理可以:
1、在App.xaml中做事件的绑定,在App.xaml.cs文件中添加事件的处理方法
在App.xaml文件中: <Application x:Class="WPFApplications.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window1.xaml" Startup="Application_Startup" Exit="Application_Exit" DispatcherUnhandledException="Application_DispatcherUnhandledException"> <Application.Resources> </Application.Resources> </Application>
在App.xaml.cs文件中: public partial class App : Application { [STAThread] static void Main() { Application app = new Application(); Window2 win = new Window2(); app.Run(win); }
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading. DispatcherUnhandledExceptionEventArgs e) { }
private void Application_Exit(object sender, ExitEventArgs e) { } }
2、在自定义的类中可以做正常的C#的事件绑定: public partial class App : Application { [STAThread] static void Main() { // 定义Application对象作为整个应用程序入口 Application app = new Application(); // 调用Run方法,参数为启动的窗体对象 ,也是最常用的方法 Window2 win = new Window2(); app.Startup += new StartupEventHandler(app_Startup); app.DispatcherUnhandledException += new System.Windows.Threading. DispatcherUnhandledExceptionEventHandler(app_DispatcherUnhandledException); app.Run(win); }
static void app_DispatcherUnhandledException(object sender, System.Windows.Threading. DispatcherUnhandledExceptionEventArgs e) { throw new NotImplementedException(); }
static void app_Startup(object sender, StartupEventArgs e) { throw new NotImplementedException(); } } 如果通过XAML启动窗体的话,也会编译成为为如下的程序,默认路径为Debug文件夹得App.g.cs文件: public partial class App : System.Windows.Application { /// <summary> /// InitializeComponent /// </summary> [System.Diagnostics.DebuggerNonUserCodeAttribute()] public void InitializeComponent() { #line 4 "..\..\App.xaml" this.StartupUri = new System.Uri("Window5.xaml", System.UriKind.Relative); #line default #line hidden } /// <summary> /// Application Entry Point. /// </summary> [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] public static void Main() { WPFApplications.App app = new WPFApplications.App(); app.InitializeComponent(); app.Run(); } } 五、WPF应用程序生存周期 当然这幅图也只是简单的概括了WPF的执行顺序和生命周期,具体还要细致研究才是。
|