MYBLOG

欢迎来到小马哥的个人博客~

[转载]WPF入门教程系列二(Application介绍)

2020-03-08学海无涯

一.Application介绍

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

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

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


二.WPF应用程序的启动


关于如何在Visual Studio中创建一个“WPF应用程序”,前面的文章中已经说过了。请参见WPF入门教程系列一——基础。

1、在Visual Studio 2013中创建一个“WPF应用程序”,使用App.xaml文件定义启动应用程序。XAML从严格意义上说并不是一个纯粹的 XML 格式文件,它更像是一种 DSL(Domain Specific Language,领域特定语言),它的所有定义都会由编译器最后编译成代码。App.xaml文件默认内容如下图:

2、当然,如果你习惯了把启动写在代码中。你也可以跟WinForm中一样,在类中定义一个Main方法来实现对WPF应用程序的启动。

第一步:如下图,在“解决方案资源管理器”中使用鼠标左键选中App.xaml文件,然后鼠标右键,弹出“弹出菜单—》从项目中排除”,这样就在项目中去掉了我们刚才建立的App.xaml文件。

第二步:现在中添加一个新类,类名为App.cs。如下图。在“解决方案资源管理器”中使用鼠标左键选中“WpfApp1”项目,然后点击鼠标右键,弹出“弹出菜单”,按下图中所示操作。

第三步:在弹出的“添加新项”界面中,选中“类”,把名称修改为“App.cs”。如下图。

第四步:在“解决方案资源管理器”中双击App.cs(如下图),打开文件,然后可以分别写入以下三种方式的代码,进行启动效果的调试。

第一种启动应用程序的代码


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
 
namespace WpfApp1
{
    class App
    {
        [STAThread]
        static void Main()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            // 方法一:调用Run方法 ,这种方式跟winform的调用一样,注意WindowGrid是要启动的窗口
            WindowGrid win = new WindowGrid();
            app.Run(win);
        }
    }
}


备忘:[STAThread]的含义

[STAThread]
STAThread:Single Thread Apartment Thread.(单一线程单元线程)
[]是用来表示Attributes;

[STAThread]
是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用AspCompat = “true” 来达到同样的效果。这个属性只在 Com Interop 有用,如果全部是 managed code 则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free Thread(自由线程)。

[STAThread] attribute指示应用程序的 COM 线程模型是单线程单元。
而于此对应的多线程单元则是 [MTAThread] (多线程单元线程)

COM 线程模型只适用于使用 COM interop 的应用程序。如果将此属性应用到不使用 COM interop 的应用程序,将没有任何效果。

COM 线程模型可设置为单线程单元或多线程单元。如果应用程序线程实际调用了 COM 组件,则仅为 COM interop 初始化该线程。如果没有使用 COM interop,则不初始化该线程。

第二种启动应用程序的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
 
namespace WpfApp1
{
    class App
    {
        [STAThread]
        static void Main()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            // 指定Application对象的MainWindow属性为启动窗体,然后调用无参数的Run方法  
            WindowGrid win = new WindowGrid();
            app.MainWindow = win;
            // 是必须的,否则无法显示窗体
            win.Show();
            app.Run();
        }
    }
}
第三种启动应用程序的代码



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
 
namespace WpfApp1
{
    class App
    {
 [STAThread]
        static void Main()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            // 通过Url的方式启动
            app.StartupUri = new Uri("WindowGrid.xaml", UriKind.Relative);
            app.Run();
        }
    }
}
3. 上面的方法,最后执行的效果,如下图。