WPF的Application类
本节主要介绍一下Application类的部分功能,我们首先来看一下如何使用Application类来加载一个窗口:
我们首先创建一个控制台程序,并引入相关的dll,然后修改Main()方法。
[STAThread]
private static void Main()
{ var app = new Application();
var win = new Window1();
app.Run(win); //另一种方法创建一个主窗口并显示
//var app = new Application();
//var window1 = new Window1();
//app.MainWindow = window1;
//window1.Show();
//app.Run(); Console.WriteLine("Window1 Closed");
}
该示例中用了两种方法通过Application类来加载窗口。该窗口会被作为主窗口显示。当代码执行Run()方法的时候,会触发Application.StartUp事件,该事件执行完之后才显示主窗口。不管是用上面的那种方法,应用程序一直运行,直到主窗口和其他所有窗口都关闭,Run()方法才返回,并在应用程序结束之前,执行Run()方法后面的代码。
下面我们来介绍一下常规的WPF应用程序,并且主要也使用这种方法。
我们在用Visual Studio创建WPF应用程序的时候,可以使用它提供的WPF Application模板。它会为我们创建一个App.xaml和App.xaml.cs文件。我们查看App.xaml文件,会发现有一个StartupUri="MainWindow.xaml",它的含义是指定程序的主窗口;在程序自动生成的文件App.g.i.cs中,会用到这个值,它是一个URI格式的值。我们再查看代码隐藏文件App.xaml.cs,发现只有一个继承自System.Windows.Application的App部分类。
最初,App类是没有包含任何代码的。但是我们可以添加代码来处理应用程序事件,接下来我们来看看Application类中几个重要的事件:
Startup:在Application.Run()方法之后,显示主窗体之前发生。还可以用这个事件的StartupEventArgs.Args属性,获取程序集命令行参数。甚至还可以在该事件里面创建和显示主窗口,而不适用App.XAML中的StartupUri。
Exit:该事件发生在应用程序关闭之前,不能撤销(不管是何种原因关闭:调用Shutdown方法、Windows用户注销或者关闭结束回话等)。
SessionEnding:发生,当用户在注销或关闭操作系统关闭 Windows 会话。可以通过检查SessionEndingCancelEventArgs.ReasonSessionEnding属性值来明确原因。如果要防止应用程序关闭,可以设置SessionEndingCancelEventArgs.Cancel属性值为true(默认为false)。
Activated:当应用程序的一个窗口被激活的时候发生(包括:启动主窗口的时候;对应用程序的用户切换通过使用 ALT+TAB 或使用任务管理器;用户单击某一的任务栏按钮在应用程序的窗口)。
Deactivated:当应用程序的一个窗口被取消激活的时候发生。
DispatcherUnhandledException:在应用程序中的任何位置,只要发生一个任何未处理的异常,就会发生该事件。我们甚至可以在该事件中使用DispatcherUnhandledExceptionEventArgs.Handled属性,并设置为true(默认为false),让程序继续运行。
有2中选择用于处理事件:通过App.xaml关联事件处理程序;或者直接通过重写相应的受保护的方法。
我还可以通过ShutdownMode改变应用程序的关闭方式,有以下三种方式:
OnLastWindowClose:应用程序关闭时,或最后一个窗口关闭时关闭,或者Shutdown()方法调用。这是默认的行为。
OnMainWindowClose:应用程序关闭时,或主窗口关闭时关闭,或者Shutdown()方法调用。
OnExplicitShutdown:仅当Shutdown()方法调用时,应用程序关闭。在此模式下,如果不调用Shutdown()方法,应用程序一直都不会结束(即使所有窗口都已经关闭)。
我们已经对WPF的Application类已经有了一定的了解,接下来我们看看其他一些情况:
访问当前Application对象:通过静态的Application.Current属性,可以在应用程序的任何位置获取当前应用程序实例。
var app = Application.Current;
var main = (MainWindow)app.MainWindow;//转换为正确的窗口类型
foreach (var window in app.Windows)
{ }
这个例子中需要注意的一点就是:Application.Current.Windows这个属性的值是。当窗口(包括主窗口)显示时,它们会被添加到Windows集合中;而当窗口关闭的时候,会从Windows集合中移除该窗口。
单实例应用程序:
通常,只要愿意,我们就可以加载WPF应用程序的任意多个副本。在某些情况下,这是非常合理的。但是在另外一些情况下,这可能是一个问题。我们可以先来看一篇文章,然后再来看一个具体的例子:
1.我们首先创建一个WPF应用程序,然后删除掉App.xaml文件和其代码后置文件
2.项目添加Microsoft.VisualBasic.dll文件引用
3.创建一个名为App的类文件,并让该App类继承System.Windows.Application
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e); var main = new MainWindow();
main.Show();
}
4.创建一个名为SingleInstanceApplicationWrapper的类文件,并让该类继承Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
public class SingleInstanceApplicationWrapper : WindowsFormsApplicationBase
{ /// <summary>
/// WPF App
/// </summary>
private App _app; public SingleInstanceApplicationWrapper()
{
IsSingleInstance = true;
} protected override bool OnStartup(StartupEventArgs eventArgs)
{
base.OnStartup(eventArgs); _app = new App();
_app.Run(); return false;//这里一定要返回false,指示应用程序是否应继续启动。
}
}
5.接下来我们就需要创建一个程序入口文件Program.cs
public class Program
{ [STAThread]
public static void Main(string[] args)
{
var single = new SingleInstanceApplicationWrapper();
single.Run(args);
} }
这样,我们一个简单的只能运行单实例的应用程序就创建成功了。接下来基于上面的代码,构建基于文档的应用程序。
6.创建一个读取文档的窗口Document.xaml,用于显示读取文档的内容:
/// <summary>
/// Interaction logic for Document.xaml
/// </summary>
public partial class Document : Window
{
public Document()
{
InitializeComponent();
} private DocumentReference _docRef; public void LoadFile(DocumentReference docRef)
{
_docRef = docRef;
Content = File.ReadAllText(docRef.Name);
Title = docRef.Name;
} protected override void OnClosed(EventArgs e)
{
base.OnClosed(e); ((App)Application.Current).Documents.Remove(_docRef);
}
}
7.创建一个实体类DocumentReference,用于MainWindow.xaml的ListBox控件绑定数据源
public class DocumentReference
{
public DocumentReference(Document document, string name)
{
Document = document;
Name = name;
} public Document Document { get; set; } public string Name { get; set; }
}
我们编辑Solution的Properties,修改Debug选项卡的Command line arguments,如果多个参数需要空格。

这样我们运行程序的时候,就会自动的打开文档了。还需要注意的一点就是把项目中的所有.testDoc文档Copy to Output Directory修改为,Copy always。
WPF的Application类的更多相关文章
- 六,WPF的Application类
Application.ShutdownMode属性:通过,只要有一个窗口还没有关闭,Application类就保持应用程序处于有效状态,如果这不是所期望的行为,就可以调整该属性. 应用程序事件 Ap ...
- WPF Application 类介绍以及怎样修改启动方式
因为想要修改wpf的启动方式,所以研究了下Application类,现把一些有用的属性与大家分享下: 属性: Current 获取当前 AppDomain的 Appl ...
- WPF中的Application类。
原文:WPF中的Application类. Application对象用的名称空间是system.windows 1.手动创建Application对象步骤. 1.1).把项目中的App.Xaml文件 ...
- 【WPF学习】第二十六章 Application类——应用程序的生命周期
在WPF中,应用程序会经历简单的生命周期.在应用程序启动后,将立即创建应用程序对象,在应用程序运行时触发各种应用程序事件,你可以选择监视其中的某些事件.最后,当释放应用程序对象时,应用程序将结束. 一 ...
- WPF教程七:通过App.xaml来了解Application类都能干什么
这个章节来了解Application类,我考虑了一晚上决定跳过控件类相关的学习,因为控件如果只是入门的话每个控件F12跳过去看一下属性.事件就能大致了解的差不多,而且控件比较多,每个都这样看一遍,感觉 ...
- WPF基础——Application
一.Application介绍 WPF中的Application对象用来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在.WPF App ...
- WPF入口Application
1.WPF和 传统的WinForm 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain (应用程序域)中只能有一个 Application 实例存 ...
- WPF之application对象
WPF:Application简介 Application是一个地址空间,在WPF中应用程序就是在System.Windows命名空间下的一个Application实例.一个应用程序只能对应一个App ...
- [转]WPF入口Application
1.WPF和 传统的WinForm 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain (应用程序域)中只能有一个 Application 实例存 ...
随机推荐
- Dapper使用方法:dapper-dot-net/Tests/Tests.cs解析(1)方法:TestMultiMapWithConstructor
sql: SELECT * FROM users; SELECT * FROM posts; SELECT * FROM Posts p LEFT JOIN Users u ON u.Id= p.Ow ...
- 社交分享:-canOpenURL: failed for URL: "weixin://app/*************/" - error: "This app is not allowed to query for scheme weixin"
升级到iOS9后,微信,QQ,微博等社交软件的分享都失效了,控制台默默地打印了这条信息: This app is not allowed to query for scheme xxx 这是因为iOS ...
- 【谷歌市场安装】Google Play 闪退问题解决
Google Play 安装后闪退,是因为手机没有内置GMS(Google Mobile Service) 框架. 由于谷歌退出了中国市场,国产手机很多都没有内置GMS, 导致Google Play ...
- Linux下C/C++程序开发管理(makefile)
一.引言 从我们刚开始编写一个简单的C/C++ "Hello,World!",到将其编译.运行处结果—这部分工作IDE(集成开发环境)帮我们做了,包括语法错误检查 ...
- [转]使用 HTML5 索引型数据库的待办事项简要列表
本文转自:http://www.html5rocks.com/zh/tutorials/indexeddb/todo/ <!DOCTYPE html><html> <h ...
- CENTOS如何禁用ROOT本地或远程SSH登录
下面详细描述如何禁止root登录. 禁止root本地登录 禁止root远程ssh登录 禁止root本地登录 修改/etc/pam.d/login文件增加下面一行 1 auth required p ...
- POJ 2516 Minimum Cost 最小费用流
题目: 给出n*kk的矩阵,格子a[i][k]表示第i个客户需要第k种货物a[i][k]单位. 给出m*kk的矩阵,格子b[j][k]表示第j个供应商可以提供第k种货物b[j][k]单位. 再给出k个 ...
- MSP下载方式
MSP430无论是仿真还是烧写程序,一般可以通过:JTAG.SBW.BSL接口进行. 1.JTAG是利用边界扫描技术,在430内部有逻辑接口给JTAG使用,内部有若干个寄存器连接到了430内部数据地址 ...
- asp.net从一个页面的单击按钮事件控制另一个页面的刷新
分步说(比如你的三个页面分别为main.aspx; left.aspx;right.aspx,且点击left.aspx页面的button,则right.aspx刷新): 1. 在父页面main.asp ...
- CSS之上边栏
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...