1、WPF和 传统的WinForm 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain (应用程序域)中只能有一个 Application 实例存在。和 WinForm 不同的是 WPF Application 默认由两部分组成 : App.xaml 和 App.xaml.cs,将定义和行为代码相分离。当然,这个和WebForm 也比较类似。XAML 从严格意义上说并不是一个纯粹的 XML 格式文件,它更像是一种 DSL(Domain Specific Language,领域特定语言),它的所有定义都直接映射成某些代码,只是具体的翻译工作交给了编译器完成而已。WPF应用程序由 System.Windows.Application类来进行管理。
入口文件的三种方式:
定义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(); app.Run(); 方法三:通过Url的方式启动 app.StartupUri = new Uri("Window2.xaml", UriKind.Relative); app.Run();
也可在XAML中配置:StartupUri和ShutdownMode 来控制APP开启打开页面和关闭调用方法:
<Application x:Class="WPFApplications.App" xmlns="http://schemas.microsoft.com/winfx/2015/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2015/xaml" StartupUri="Window2.xaml" ShutdownMode="OnExplicitShutdown"> <Application.Resources> </Application.Resources> </Application>
2、代码分析,重写OnStartUp:
1 Mutex mutex=null;//防止Exe多开 2 protected override void OnStartup(StartupEventArgs e) 3 { 4 Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 5 this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); 6 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 7 //取程序所在目录 8 string AppPath = AppDomain.CurrentDomain.BaseDirectory; 9 Login2 loginWinT3 = new Login2(); 10 bool? loginResult = loginWinT3.ShowDialog(); 11 12 if ((loginResult.HasValue == true) && (loginResult.Value == true)) 13 { 14 //base.OnStartup(e); 15 //Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose; 16 bool createdNew = false; 17 mutex = new Mutex(true, "WPFSTART", out createdNew); 18 if (!createdNew) 19 { 20 MessageBox.Show("程序已经启动!", "", MessageBoxButton.OK, MessageBoxImage.Warning); 21 this.Shutdown(); 22 } 23 } 24 else 25 { 26 this.Shutdown(); 27 } 28 }
仔细品味这段代码,你会发现,真的很不错;
1、想到防止多开Exe的处理方法;
2、想到Showdialog(),弹出窗体的处理页面数据交互;
3、想到应用程序域和应用程序载体(Application)未处理的异常的处理情况;
4、考虑到重写Application的OnStartUp的方法,处理其中的业务逻辑,真是不错的代码;