Application类是WPF类型中的一个基础,是每一个WPF必有的部分。

Application类在应用程序中所处的位置

WPF应用程序中,Application类实例是应用程序实例的代表,每个WPF应用程序中都存在一个Application实例,它用于接收程序参数,处理程序事件。

一个不使用WPF XAML框架的应用程序实例代码

使用Application类的最简单方式是手动创建它。下面实例简单的演示了最小的应用程序:在应用程序的入口处创建名为Window1的窗口,并启动一个新的应用程序:

using System;
using System.Windows;

public class Startup{
static void Main(){
    //create the application
    Application app = new Application();
    //create the main window.
    Window1 win = new Window1();
    //Launch the application and show the main window.
    app.Run(win);
}}

如果希望通过Main方法启动应用程序并处理传递参数,可以通过在WPF程序中改变VS属性配置来设定某个含有Main方法的类最为启动对象。

可以看出在应用程序中,启动顺序一般都是启动main方法,然后实例化application类,之后想application类中传递界面实例,这样应用程序就启动起来了。
然而真正的WPF肯定不是利用这种方法启动的,从代码和逻辑的表现上看就不一样。
但是肯定类似。

经典的WPF应用程序启动实例

下面是一个常见WPF项目中app.xaml的代码

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             StartupUri="Window1.xaml"
             ShutdownMode="OnLastWindowClose">
    <Application.Resources>

    </Application.Resources>
</Application>

本例中采用了app.xaml来配置应用程序,它制造了一个派生类App,派生于Application类,位置在于WpfApp1.App。可以看到WPF工程中是没有Main方法存在的,它应该利用了某种框架提供的类似方法,在利用反射等默认机制工作的过程中调用了Main方法。Main方法肯定是存在的,但是让WPF框架给藏起来了。

xaml文件是WPF工程中的类模板,VS利用XAML语句自动生成C#类App.g.cs。

StartupUri指定了应用程序启动的主界面是什么。在WpfApp1.App中可以自定义语句用来处理App接收到的命令行参数和应用程序事件处理代码。一般用于处理应用程序事件的方法可以利用继承特性重写,另一方面可以利用app.xaml配置之后关联方法。一般采用app.xaml进行配置,这样比较清楚明白。

App.xaml还可以这么用

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             Startup="Application_Startup"
             ShutdownMode="OnLastWindowClose">
    <Application.Resources>

    </Application.Resources>
</Application>
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            MainWindow fMain = new WpfApp1.MainWindow();
            frmLogin fLogin = new frmLogin();
            if(fLogin.ShowDialog() == true)
            {
                fMain.Show();
            }
            else
            {
                fMain.Close();
            }
        }
    }
}

这里实现了一个登录窗口的创意,在app.xaml中指定了Startup属性(不是StartupUri)也就表明了在Application对象实例化之后,会调用Application_Startup方法进行进一步处理。