WPF_Application

24 篇文章 21 订阅


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线程中执行,这在跨线程操作中非常有用。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值