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 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的方法,处理其中的业务逻辑,真是不错的代码;

[转]WPF入口Application的更多相关文章

  1. WPF入口Application

    1.WPF和 传统的WinForm 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain (应用程序域)中只能有一个 Application 实例存 ...

  2. WPF基础——Application

    一.Application介绍 WPF中的Application对象用来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在.WPF App ...

  3. WPF的Application类

    本节主要介绍一下Application类的部分功能,我们首先来看一下如何使用Application类来加载一个窗口: 我们首先创建一个控制台程序,并引入相关的dll,然后修改Main()方法. [ST ...

  4. WPF之application对象

    WPF:Application简介 Application是一个地址空间,在WPF中应用程序就是在System.Windows命名空间下的一个Application实例.一个应用程序只能对应一个App ...

  5. How to update WPF browser application manifest and xbap file with ‘mage.exe’

    老外参考文章1 老外参考文章2 I created a WPF browser application MyApp then published it by ClickOnce in VS2008. ...

  6. 使用IE9、FireFox与Chrome浏览WPF Browser Application(.XBAP)的方式

    最近开始写一些WPF的小Sample和文章,但是毕竟WPF应用程式不像Silverlight那么方便的只要装个Plugin就可以透过浏览器来看执行结果,因此把脑筋动到了改用WPF Browser Ap ...

  7. WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null

    原文:WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null 在 WPF 程序中,可能会存在 Application.Current.D ...

  8. WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null

    原文:WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null 在 WPF 程序中,可能会存在 Application.Curren ...

  9. Walkthrough: My first WPF desktop application

    Walkthrough: My first WPF desktop application This article shows you how to develop a Windows Presen ...

随机推荐

  1. c++保存数据到TXT

    sprintf(filename, "/Users/anitafang/Documents/Datasets/test-tensorflow/002/annot3/%d.pts", ...

  2. c# 利用反射清除事件

    控件的事件清除,除了-=,就只能依靠反射来执行了. /// <summary> /// 清除一个对象的某个事件所挂钩的delegate /// </summary> /// & ...

  3. 代码动态设置edittext输入类型为密码类型

    开发中常常会用到EditText输入框,要将他的输入类型设置为密码输入,但是直接在布局文件中设置时,hint字体风格就会不一样 例如,在布局文件中直接设置是这样的(如下图),字体风格明显跟上一行的不一 ...

  4. android适配pad和部分手机底部虚拟按键+沉浸式状态栏

    在使用沉浸式状态栏设置界面全屏时发现pad和部分手机(华为和魅族系统自带)屏幕底部会带有虚拟按键,遮挡住界面本身的一部分. 为了设置隐藏,在网上找了一些方法,设置Activity主题再在布局加fits ...

  5. 自然语言交流系统 phxnet团队 创新实训 项目博客 (三)

    语音转文本部分是调用的科大讯飞的在线语音,它的激发方式是按键,通过按钮触发开启安卓设备的录音,此部分需要在源码中写入关于安卓权限的要求,来调用安卓的录音权限,当按钮被激发,则开始进入语音录制阶段,将麦 ...

  6. Python之重复执行

    pip install retry 自动尝试5次,每次间隔2秒 from retry import retry @retry(tries=5, delay=2) def test(): print 1 ...

  7. 计算机网络——网络层

    一.虚拟线路与数据报线路 1. 在网络层提供有连接的计算机网络为虚电路网络: 如因特网:它需要VC(虚拟电路)号,用于建立虚拟电路的报文称为信令报文,相关的协议称为信令协议: 无连接的网络为数据报网络 ...

  8. e832. 从JTabbedPane中移动卡片

    To move a tab, it must first be removed and then reinserted into the tabbed pane as a new tab. Unfor ...

  9. (实用)Ubuntu Linux静态IP网络配置

    记录备忘. 基于Ubuntu 14.04 LTS Server. 首先查看一下当前系统的网卡: $ sudo iconfig 比如这里我除了回环网路lo外,网络接口名为em1,下面就去给它配置网络. ...

  10. Enigma Virtual Box:生成可执行文件。

    Enigma Virtual Box Enigma Virtual Box[1]  是软件虚拟化工具,它可以将多个文件封装到应用程序主文件,从而制作成为单执行文件的绿色软件.它支持所有类型的文件格式, ...