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

手动创建应用程序

1.创建Empty Project

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

2.添加引用

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

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

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

 通过向导创建应用程序

Main函数实现在  objDebugApp.g.cs中

应用程序的生命周期

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

应用程序入口

应用程序入口都是Main函数,两种主要类型的对象ApplicationWindow,前者在全局中是唯一的可以通过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 = 0,
        //
        // Summary:
        //     An application shuts down when either the main window closes, or System.Windows.Application.Shutdown()
        //     is called.
        OnMainWindowClose = 1,
        //
        // Summary:
        //     An application shuts down only when System.Windows.Application.Shutdown()
        //     is called.
        OnExplicitShutdown = 2,
    }

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

To be continue...