文章目录
- Application
- 1 Application类
- 1.1 定义
- 1.2 示例
- 1.3 附注
- 2 Application常用属性
- 2.1 Current
- 2.2 Dispatcher
- 3 总结
Application
1 Application类
1.1 定义
该类封装了一个WPF应用程序。
该类派生自DispatcherObject,实现了IQueryAmbient接口。
1.2 示例
以下代码展示了用标签定义一个标准的Application:
<!--在WPF应用程序工程模板的App.xaml中可以看到类似代码-->
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"/>
下面代码展示了如何用代码来定义一个标准的Application:
using System;
using System.Windows;
namespace SDKSample
{
public class AppCode : Application
{
// Entry point method
[STAThread]
public static void Main()
{
AppCode app = new AppCode();
app.Run();
}
}
}
下面代码展示了标签结合后台代码来定义一个标准的Application,WPF模板程序就是这种方式,
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App" />
using System.Windows;
namespace SDKSample
{
public partial class App : Application { }
}
1.3 附注
Application是一个类,它封装了WPF程序特有的功能,包含以下这些:
- 应用程序的生命周期 :Activated, Current, Deactivated, DispatcherUnhandledException, Exit, Run, SessionEnding, Shutdown, ShutdownMode, Startup.
- 应用程序域/范围的窗口、属性和资源管理 :FindResource, GetContentStream, GetResourceStream, LoadComponent, MainWindow, Properties, Resources, StartupUri, Windows.
- 命令行参数和退出代码处理 :Application.Startup, Application.Exit, Application.Shutdown.
- 导航 :FragmentNavigation, LoadCompleted, Navigated, Navigating, NavigationProgress, NavigationStopped, NavigationFailed, SetCookie, GetCookie.
Application实现了单例模式(singleton pattern),以提供对其窗口、属性和资源作用域服务的共享访问。因此,每个AppDomain只能创建一个Application类的实例。
AppDomain(应用程序域)
应用程序域由 AppDomain 对象表示,它们为执行托管代码提供隔离、卸载和安全边界。
似乎在你的工程代码中看不到它,因为它是CLR的执行单元。
应用程序域是每个应用程序独立的一块区域,它为Application执行提供了隔离环境,暂时理解到这就行。
你可以使用标签(Markup)、标签结合后台代码或者仅用代码来实现一个Application。若Application是用标签实现的,无论是标签还是标签结合后台代码,标签文件必须配置为Microsoft构建引擎(MSBuild) ApplicationDefinition 项。
注意
独立应用程序不需要Application对象;可以实现一个自定义的static入口点方法(Main),打开一个窗口而不创建应用程序实例。不过,XAML浏览器应用程序(XBAPs)需要一个Application对象。
2 Application常用属性
2.1 Current
它表示当前正在运行的WPF应用程序的Application实例,用于获取当前AppDomain的Application对象。
Application是每个AppDomain的单例类型,它实现了静态的Current属性,为当前AppDomain提供对Application实例的共享访问。这种设计确保了状态(包括共享资源和状态)由Application管理,可以从单个共享位置访问。
该属性是线程安全的,并且可以从任何线程访问。
2.2 Dispatcher
先看下继承关系:
Application是DispatcherObject的子类,且每个DispatcherObject都有关联的Dispatcher,而Dispatcher是用于管理线程工作项队列的调度器。
因此该属性的作用是获取该DispatcherObject(即Application)关联的Dispatcher。
那么问题来了,
Application封装了一个WPF应用程序,与之关联的Dispatcher是啥呢?
如果你看过WPF的线程模型,应该不难猜到,该Dispatcher是用来管理UI线程的工作项队列的(WPF是单线程模型)。再结合Application实现了单例模式,我们通常可以用Application.Current.Dispatcher在后台线程中要求UI线程代表其执行操作。
3 总结
- Application类封装了一个WPF应用程序。
- Application实现了单例模式(Singleton Pattern),以提供对其窗口、属性和资源作用域服务的共享访问。通过Application.Current访问。
- 通过Application.Current.Dispatcher可以将操作排队到UI线程中执行,这在跨线程操作中非常有用。