一、Application介绍

一、Application介绍

接上文WPF入门教程系列二——Application介绍,我们继续来学习Application

WPF中的Application对象用来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在。WPF Application默认由两部分组成 : App.xaml 和 App.xaml.cs,这有点类似于 Asp.Net WebForm,将定义和行为代码相分离。

WPF中的Application对象用来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在。WPF Application默认由两部分组成 : App.xaml 和 App.xaml.cs,这有点类似于 Asp.Net WebForm,将定义和行为代码相分离。

三、WPF应用程序的关闭

微软把WPF中经常使用的功能都封装在 Application 类中了。 Application 类具体有以下功能: 

微软把WPF中经常使用的功能都封装在 Application 类中了。 Application 类具体有以下功能: 

       WPF应用程序的关闭只有在应用程序的
Shutdown 方法被调用时,应用程序才停止运行。 ShutDown
是隐式或显式发生,可以通过指定 ShutdownMode 的属性值来进行设置。

  • 跟踪应用程序的生存期并与之交互。 
  • 检索和处理命令行参数。 
  • 检测和响应未经处理的异常。 
  • 共享应用程序范围的属性和资源。 
  • 管理独立应用程序中的窗口。 
  • 跟踪和管理导航。 
  • 跟踪应用程序的生存期并与之交互。 
  • 检索和处理命令行参数。 
  • 检测和响应未经处理的异常。 
  • 共享应用程序范围的属性和资源。 
  • 管理独立应用程序中的窗口。 
  • 跟踪和管理导航。 

 ShutdownMode选项

 

OnLastWindowClose(默认值):

应用程序关闭时,或最后一个窗口关闭时关闭,或调用Application对象的Shutdown() 方法时,应用程序关闭。

OnMainWindowClose

启动窗体关闭或调用Application对象的Shutdown()方法时,应用程序关闭。(和C#的Windows应用程序的关闭模式比较类似)

OnExplicitShutdown

只有在调用Application对象的Shutdown()方法时,应用程序才会关闭。

二、Applicaion应用

二、Applicaion应用

 

1、在Visual Studio 2015中创建一个“WPF应用程序”,使用App.xaml文件定义启动应用程序。

1、在Visual Studio 2015中创建一个“WPF应用程序”,使用App.xaml文件定义启动应用程序。

  1. 对ShutdownMode选项的更改,可以直接在App.xaml中更改,如下代码。

             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"            
    
             StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" >
    
    <Application.Resources>
    

项目中的每个WPF窗口(xaml),包含2个文件:xaml和xaml.cs

项目中的每个WPF窗口(xaml),包含2个文件:xaml和xaml.cs

    </Application.Resources>

</Application>

图片 1

图片 1

    2. 
在代码文件(App.xaml.cs)中修改ShutdownMode选项,但必须注意这个设置要写在app.Run()方法之前
,如下代码。

项目文件(WpfApplication.csproj)中有对应的描述节点:<Page>和<Compile>,而<ApplicationDefinition>节点有的话只能有一个,用来定义启动项。

项目文件(WpfApplication.csproj)中有对应的描述节点:<Page>和<Compile>,而<ApplicationDefinition>节点有的话只能有一个,用来定义启动项。

  app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
    app.Run(win);
  <ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </ApplicationDefinition>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Page Include="MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>
  <ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </ApplicationDefinition>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Page Include="MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>

 

2、也可以自己定义一个Main方法来实现WPF应用程序的启动。

2、也可以自己定义一个Main方法来实现WPF应用程序的启动。

Application对象的其他属性:

第一步:在“解决方案资源管理器”中选中App.xaml文件,右键“从项目中排除”。

第一步:在“解决方案资源管理器”中选中App.xaml文件,右键“从项目中排除”。

名称

说明

Current

获取当前 AppDomain的 Application 对象。

Dispatcher

获取与此 DispatcherObject 关联的 Dispatcher。 (继承自 DispatcherObject。)

MainWindow

获取或设置应用程序的主窗口。

Properties

获取应用程序范围的属性集合。

ResourceAssembly

获取或设置对于 WPF 应用程序的资源提供已装箱统一资源标识符 (URI) 的 Assembly 。

Resources

获取或设置应用程序范围资源的集合,例如样式和画笔。

ShutdownMode

获取或设置会导致 Shutdown 方法调用的情况。

StartupUri

获取或设置自动显示的 UI ,当应用程序启动时。

Windows

获取在应用程序中实例化窗口。

此时,Visual Studio自动会改变WPF项目文件(WpfApplication.csproj),去掉了<ItemGroup>中的<ApplicationDefinition>节点和<Compile>节点

此时,Visual Studio自动会改变WPF项目文件(WpfApplication.csproj),去掉了<ItemGroup>中的<ApplicationDefinition>节点和<Compile>节点

 

<ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </ApplicationDefinition>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
</ItemGroup>
<ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </ApplicationDefinition>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
</ItemGroup>

四、添加Application对象事件

若后面又要将App.xaml文件“包括在项目中”来作为WPF应用启动,F5运行时会报错误“不包含适合于入口点的静态‘Main’方法”。这个错误是由于Visual
Studio把项目文件(*.csproj)中原来自动生成的app.xaml相关的定义进行了修改(上面已说明)。

若后面又要将App.xaml文件“包括在项目中”来作为WPF应用启动,F5运行时会报错误“不包含适合于入口点的静态‘Main’方法”。这个错误是由于Visual
Studio把项目文件(*.csproj)中原来自动生成的app.xaml相关的定义进行了修改(上面已说明)。

名称

说明

Activated

当应用程序成为前台应用程序时触发。

Deactivated

当应用程序不再是前台应用程序时触发。

DispatcherUnhandledException

如果异常是由应用程序引发,但未处理,触发。

Exit

在应用程序关闭之前,触发,而且不能撤消。

FragmentNavigation

发生在应用程序的一个浏览器启动导航到内容片段导航时,会立即发生,如果所需片段在当前目录,或者,在源 XAML 目录加载后,如果所需片段在其他内容。

LoadCompleted

在导航到在应用程序中的一个浏览器的目录加载的分析完成并已呈现时触发。

Navigated

当导航到在应用程序中使用的浏览器已找到的内容时触发,这时它可能还没有完成加载。

Navigating

在一个新的导航由应用程序,一个浏览器请求发生。

NavigationFailed

出现问题,则错误,当应用程序的一个浏览器导航到所请求的内容时。

NavigationProgress

定期发生在应用程序中使用浏览器管理提供导航进度信息的下载过程。

NavigationStopped

发生在一个浏览器的 StopLoading 方法在应用程序的调用,或者,如果新的导航由浏览器请求,在当前导航正在进行的。

SessionEnding

当用户在注销或关闭操作系统关闭 Windows 会话时发生。

Startup

当 Application 对象的 Run 方法调用,发生。

添加App.xaml进来后,项目文件(*.csproj)自动会生成如下代码:

添加App.xaml进来后,项目文件(*.csproj)自动会生成如下代码:

在应用程序中添加事件的方式有如下三种。

  <ItemGroup>
    <Page Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
    </Compile>
  </ItemGroup>
  <ItemGroup>
    <Page Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
    </Compile>
  </ItemGroup>

第一种方式:

第一段代码中App.xaml在项目文件里面用ApplicationDefinition标签定义。第二段代码中App.xaml在项目文件里面用Page标签定义,这种定义是指App.xaml只是一个页面而已。因此,只需要把项目文件中将App.xaml的配置由Page修改成ApplicationDefinition即可。

第一段代码中App.xaml在项目文件里面用ApplicationDefinition标签定义。第二段代码中App.xaml在项目文件里面用Page标签定义,这种定义是指App.xaml只是一个页面而已。因此,只需要把项目文件中将App.xaml的配置由Page修改成ApplicationDefinition即可。

1、在App.xaml中做事件的绑定,在App.xaml.cs文件中添加事件的处理方法

第二步:现在中添加一个新类,类名为App.cs。

第二步:现在中添加一个新类,类名为App.cs。

  
在App.xaml文件中,具体添加方法见下图。

可以写入以下三种方法启动WPF。 

可以写入以下三种方法启动WPF。 

 图片 3

    class App
    {
        [STAThread]
        static void Main()
        {
            f1();
        }
        static void f1()
        {
            // 定义Application对象作为整个应用程序入口
            Application app = new Application();
            MainWindow win = new MainWindow();
            //ShutdownMode选项,注意这个设置必须要写在app.Run()方法之前
            app.ShutdownMode = ShutdownMode.OnMainWindowClose; //非必须
            //调用Run方法
            app.Run(win);
        }
        static void f2()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            MainWindow win = new MainWindow();
            //是必须的,否则无法显示窗体  
            win.Show();
            //指定Application对象的MainWindow属性为启动窗体,然后调用无参数的Run方法  
            app.MainWindow = win;
            app.Run();
        }
        static void f3()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            // 通过Url的方式启动
            app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
            app.Run();
        }
    }
    class App
    {
        [STAThread]
        static void Main()
        {
            f1();
        }
        static void f1()
        {
            // 定义Application对象作为整个应用程序入口
            Application app = new Application();
            MainWindow win = new MainWindow();
            //ShutdownMode选项,注意这个设置必须要写在app.Run()方法之前
            app.ShutdownMode = ShutdownMode.OnMainWindowClose; //非必须
            //调用Run方法
            app.Run(win);
        }
        static void f2()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            MainWindow win = new MainWindow();
            //是必须的,否则无法显示窗体  
            win.Show();
            //指定Application对象的MainWindow属性为启动窗体,然后调用无参数的Run方法  
            app.MainWindow = win;
            app.Run();
        }
        static void f3()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            // 通过Url的方式启动
            app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
            app.Run();
        }
    }

2、添加完事件之后的app.xml文件代码如下

三、WPF应用程序的关闭

三、WPF应用程序的关闭

<Application x:Class="WpfApp1.App"

             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

             StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" Activated="Application_Activated" Exit="Application_Exit">

    <Application.Resources>



    </Application.Resources>

</Application>

WPF应用程序的关闭只有在应用程序的 Shutdown
方法被调用时,应用程序才停止运行。 ShutDown
是隐式或显式发生,可以通过指定 ShutdownMode 的属性值来进行设置。

WPF应用程序的关闭只有在应用程序的 Shutdown
方法被调用时,应用程序才停止运行。 ShutDown
是隐式或显式发生,可以通过指定 ShutdownMode 的属性值来进行设置。

 

方式一:如上面写在代码里

方式一:如上面写在代码里

3、在App.xaml.cs文件的代码如下:

方式二:写在App.xaml里

方式二:写在App.xaml里

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_Activated(object sender, EventArgs e)

        {



        }



        private void Application_Exit(object sender, ExitEventArgs e)

        {



        }

    }

}
<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
             StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown">
    <Application.Resources>

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

    </Application.Resources>
</Application>

 

四、Application对象事件

四、Application对象事件

 

1、第一种方式,在App.xaml文件添加事件,如Activated事件(当应用程序成为前台应用程序时触发)

1、第一种方式,在App.xaml文件添加事件,如Activated事件(当应用程序成为前台应用程序时触发)

4.在使用以上方式添加事件之后,如果在Visual
Studio中按F5
执行应用程序时,报以下错误“不包含适合于入口点的静态‘Main’方法”。这个错误是由于Visual
Studio把项目文件(*.csproj)中原来自动生成的app.xaml相关的定义进行了修改。具体区别如下:

此方法也可以在Visual Studio(ide)中的App.xaml属性窗口(按F4)中设置。

此方法也可以在Visual Studio(ide)中的App.xaml属性窗口(按F4)中设置。

 1)
直接新建的WPF项目中的有关App.xaml的定义如下:

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
             StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" Activated="Application_Activated">
    <Application.Resources>

    </Application.Resources>
</Application>
<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
             StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" Activated="Application_Activated">
    <Application.Resources>

    </Application.Resources>
</Application>
<ApplicationDefinition Include="App.xaml">

      <Generator>MSBuild:Compile</Generator>

      <SubType>Designer</SubType>

    </ApplicationDefinition>

在App.xaml.cs文件的代码如下:

在App.xaml.cs文件的代码如下:

 2) Visual
Studio把修改后的App.xaml的配置代码如下:

namespace WpfApplication1
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        private void Application_Activated(object sender, EventArgs e)
        {

        }
    }
}
namespace WpfApplication1
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        private void Application_Activated(object sender, EventArgs e)
        {

        }
    }
}
   <Page Include="App.xaml">

      <SubType>Designer</SubType>

      <Generator>MSBuild:Compile</Generator>

    </Page>

2、第二种方式,定义一个App类写Main方法和其他事件等。

2、第二种方式,定义一个App类写Main方法和其他事件等。

 

namespace WpfApplication1
{
    class App
    {
        [STAThread]
        static void Main()
        {
            f1();
        }
        static void f1()
        {
            // 定义Application对象作为整个应用程序入口
            Application app = new Application();
            MainWindow win = new MainWindow();
            //ShutdownMode选项,注意这个设置必须要写在app.Run()方法之前
            app.ShutdownMode = ShutdownMode.OnMainWindowClose;
            //调用Run方法
            app.Run(win);
            app.Activated += App_Activated;
        }
        static void App_Activated(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }
    }
}
namespace WpfApplication1
{
    class App
    {
        [STAThread]
        static void Main()
        {
            f1();
        }
        static void f1()
        {
            // 定义Application对象作为整个应用程序入口
            Application app = new Application();
            MainWindow win = new MainWindow();
            //ShutdownMode选项,注意这个设置必须要写在app.Run()方法之前
            app.ShutdownMode = ShutdownMode.OnMainWindowClose;
            //调用Run方法
            app.Run(win);
            app.Activated += App_Activated;
        }
        static void App_Activated(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }
    }
}

  第一段代码中App.xaml在项目文件里面用ApplicationDefinition标签定义。第二段代码中App.xaml在项目文件里面用Page标签定义,这种定义是指App.xaml只是一个页面而已。

五、WPF应用程序生存周期

五、WPF应用程序生存周期

  因此,只需要把项目文件中将App.xaml的配置由Page修改成ApplicationDefinition即可。

WPF应用程序的生命周期与执行顺序,用MSDN上的一张图片进行说明。

WPF应用程序的生命周期与执行顺序,用MSDN上的一张图片进行说明。

 

图片 4

图片 4

 

Continue…

Continue…

第二种方式

 1、可以像是在WinForm中的Program类中写Main方法一样,在WPF中一样可以自定义一个app类中写main及其他相关事件。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;



namespace WpfApp1

{

    class App

    {

 [STAThread]

        static void Main()

        {

            // 定义Application对象作为整个应用程序入口 

            Application app = new Application();



            MainWindow win = new MainWindow();

            app.ShutdownMode = ShutdownMode.OnMainWindowClose;

            app.MainWindow = win;

            //是必须的,否则无法显示窗体      

            win.Show();



            app.Run();

            app.Activated += app_Activated;

            app.Exit += app_Exit;



        }



 static void app_Activated(object sender, EventArgs e)

 {

     throw new NotImplementedException();

 }



 static void app_Exit(object sender, ExitEventArgs e)

 {

     throw new NotImplementedException();

 }

    }

}

 

第三种方式

  1. 在App.xaml界面中,如下图位置1处,输入Exit事件名称,Visual
    Studio 2013会弹出一个菜单“新建事件处理程序”,双击这个菜单,Visual
    Studio
    2013就会自动创建一个“Application_Exit”事件,如下图位置2处。

 图片 6

 

五、WPF应用程序生存周期

WPF应用程序的生命周期与执行顺序,用MSDN上的一张图片进行说明。下图显示了窗口的生存期中的主体事件的顺序。

 图片 7

 

 

相关文章