手动创建应用程序

1.创建Empty Project

2.添加引用

3.添加 ManualApp.cs 并添加下面的代码

[STAThread]
public static void Main()
{
Window win = new Window();
win.Title = "Manually created application";
win.Show();
Application app = new Application();
app.Run();
}
[STAThread] 单线程模型

4.执行该程序会多出现一个控制台窗口,可以修改Project的Output Type

 通过向导创建应用程序

Main函数实现在  \obj\Debug\App.g.cs中

应用程序的生命周期

Application开始Run以后,进入消息循环,不断响应并处理事件

应用程序入口

应用程序入口都是Main函数,两种主要类型的对象Application\Window,前者在全局中是唯一的可以通过Application.Current获取。

[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main() {
Alex_WPFAPPDemo04.App app = new Alex_WPFAPPDemo04.App();
app.InitializeComponent();
app.Run();
}

应用程序起点

第一个响应的事件是Startup

App.xaml中默认使用下面的方式

<Application x:Class="Alex_WPFAPPDemo04.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_StartUp">

稍作修改,会最先进入到Application_StartUp事件处理方法

<Application x:Class="Alex_WPFAPPDemo04.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_StartUp">

应用程序的状态

应用程序有两种状态,Actived/Deactived,WPF可以通过Actived/Deactived事件来处理这两种状态

<Application x:Class="Alex_WPFAPPDemo04.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
Activated="Application_Actived"
Deactivated="Application_Deactived">

应用程序的异常

<Application x:Class="Alex_WPFAPPDemo04.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
DispatcherUnhandledException="Application_DispatcherUnhandledException">

当应用程序发生异常时,会触发DispatcherUnhandledException事件,实现该事件处理逻辑可以防止程序崩溃

非正常退出

当操作系统关机、重启、注销等操作时,应用程序会接受SessionEnding事件,通过设置Cancel属性可以组织操作系统的关机、重启、注销等操作

<Application x:Class="Alex_WPFAPPDemo04.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
SessionEnding="Application_SessionEnding">
private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)
{
string msg = string.Format("{0}. End Session?", e.ReasonSessionEnding);
MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);
if (result == MessageBoxResult.No)
{
e.Cancel = true;
}
}

正常退出

当关闭应用程序主窗口、所有窗口、显示调用Shutdown函数时,程序会正常退出

这3种情况由ShutdownMode属性决定

  // Summary:
// Specifies how an application will shutdown. Used by the System.Windows.Application.ShutdownMode
// property.
public enum ShutdownMode
{
// Summary:
// An application shuts down when either the last window closes, or System.Windows.Application.Shutdown()
// is called.
OnLastWindowClose = ,
//
// Summary:
// An application shuts down when either the main window closes, or System.Windows.Application.Shutdown()
// is called.
OnMainWindowClose = ,
//
// Summary:
// An application shuts down only when System.Windows.Application.Shutdown()
// is called.
OnExplicitShutdown = ,
}

Shutdown函数有两种形式,不传任何参数、传入Int作为ExitCode

To be continue...

WPF学习之路(七)应用程序和窗口的更多相关文章

  1. WPF学习之路初识

    WPF学习之路初识   WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...

  2. WPF学习之路(一) 初识WPF

    参考<葵花宝典-WPF自学手册> VS2012 先创建第一个WPF小程序 1.创建WPF程序 2.查看Solution,WPF中xaml文件和cs文件经常成对出现 两个主要的类:APP(W ...

  3. WPF学习之路(七)应用程序和窗口(续)

    窗口的生命周期 WPF中一个Window类代表一个窗口 一个的窗口的生命周期也有好几个阶段: 1.构造器被调用 2.Window.Initialized事件被触发 3.Window.Activated ...

  4. WPF学习之路(十二)控件(Items控件)

     ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...

  5. WPF学习之路(九)导航和页面(续)

    生命周期 如果Page1成功导航到Page2,首先会触发NavigationService的Navigating事件,标识导航开始.随后创建Page2对象,并且触发NavigationProgress ...

  6. WPF学习之路(八)页面

    传统的应用程序中有两类应用程序模式:桌面应用,Web应用.WPF的导航应用程序模糊了这两类应用程序的界限的第三类应用程序 WPF导航表现为两种形式,一是将导航内容寄宿于窗口,二是XAML浏览器应用程序 ...

  7. WPF学习之路(六)Command

    在WPF中,命令绑定机制是相比于事件更高级的概念,把应用程序的功能划分为多个任务,任务由多种途径触发. 应用Command Binding使代码更符合MVVM模式(Model-View-ViewMod ...

  8. WPF学习之路(二) XAML

    在WPF中引入了XAML语言,主要用于界面设计,业务逻辑则使用C#实现后台代码,将界面设计与业务逻辑分离 XAML是一种声明式语言,类似XML\HTML 示例: <!--Start Tag--& ...

  9. zigbee学习之路(七):定时器3(中断方式)

    一.前言 上次我们学习了了用定时器3进行查询方式来进行溢出判断,今天我们来换一种方式,用中断方式来检测和查询定时器3的溢出. 二.原理与分析 要使用定时器3,我们必须先要配置的是T3CTL,来把定时器 ...

随机推荐

  1. PHP条件语句语法与示例

    一.if…else语句 语法: 1 if(条件){ …… } else{ …… } 2 if(条件){ …… } elseif(条件){ …… } else{ …… } 示例1: <?php & ...

  2. 只用CSS实现容器内图片上下左右居中

    一直以来,大家都知道,DIV容器内设置 text-align:center 即可让图片居中,但是DIV内默认的图片是上对齐,不会上下居中,如果想要实现这样的效果,JS判断是比较麻烦的,因为DIV容器内 ...

  3. RabbitMQ入门教程——工作队列

    什么是工作队列 工作队列是为了避免等待一些占用大量资源或时间操作的一种处理方式.我们把任务封装为消息发送到队列中,消费者在后台不停的取出任务并且执行.当运行了多个消费者工作进程时,队列中的任务将会在每 ...

  4. Redis系列三之持久化

    一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...

  5. iOS 阶段学习第九天笔记(内存管理)

    iOS学习(C语言)知识点整理 一.内存管理 1)malloc , 用于申请内存; 结构void *malloc(size_t),需要引用头文件<stdlib.h>:在堆里面申请内存,si ...

  6. Debian7编译VIM7.4

    [ 另: vim7.4源码在vs2013的编译方法 ] 1 安装libncurses5库: apt-get install libncurses5-dev 2 安装gvim需要的库: 方法一: apt ...

  7. Scalaz(45)- concurrency :Task-函数式多线程编程核心配件

    我们在上一节讨论了scalaz Future,我们说它是一个不完善的类型,最起码没有完整的异常处理机制,只能用在构建类库之类的内部环境.如果scalaz在Future类定义中增加异常处理工具的话,用户 ...

  8. phpcms 二次开发数据过滤的技巧

    参数过滤 1,针对不能直接使用pdo进行参数绑定,可以使用sprintf模拟,并使用new_addslashes来过滤,然后使用query执行拼接的sql %% - 返回百分比符号 %b - 二进制数 ...

  9. Android应用开发基础之十一:新特性

    Fragment 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 生命周期方法跟Activity一致,可以理解把其为就是一个Activity 定义布局文件作为Fra ...

  10. 客观评价C#的优点和缺点

    对于C#,coder中可以分为2类:一类是C#死忠,对它赞赏到极点:另一类刚好相反,对它极度排斥. 本文将以全面.客观的方式评价这门语言,特别是语法方面. 其实很多人评价一门语言是带着一种感情色彩的. ...