天天看点

WPF 基础到企业应用系列4——WPF千年轮回1.开篇前言2.本文提纲3.Application4.Window5.Dispatcher及多线程6.类继承结构7.WPF的逻辑树和视觉树8.本文总结9.系列进度(红色标示已发布)

     首先很高兴这个系列能得到大家的关注和支持,基于对大家负责和对自己负责的态度,我会不断努力写好这个系列,分享自己的微薄技术和经验,希望在帮助别人的 同时也不断提升自己。由于这篇文章很多(现已拆分成2篇,今天这篇只是其中之一),一共花了几个个晚上的休息时间才完成,所以读者花的时间长了一些,也希 望大家能够见谅,这个系列以后会每周发三到四篇左右(主要是写一篇差不多要花几晚上,感觉思维比较发散),除了讲WPF技术本身之外,也会讲一些项目具体 开发,所以敬请关注。     本篇文章取名为WPF千年轮回只因为两个原因: WPF和当年Win32、WinForm等的到来颇为相似,只是在功能和体验上上进行了提高,所以这是微软产品上的一个轮回; WPF的学习过程和其他技术一样,譬如ASP.NET,我们在学习的时候会先要了解Asp.Net构架(Http请求处理流程)、 Pipeline、HttpHandler 和 HttpModule 等内容,这和WPF的Application生命周期相对应,再如WPF的Window生命周期可以和ASP.NET的页面生命周期相对应等。当然你也可 以拿WinForm或者其他技术来举例,这里这是阐述观点。 在前三篇文章中我们对WPF有了一个比较全面的认识,并且也通过一个基本的例子对比了WPF和之前的WinForm程序的区别和联系。那么在本篇文 章当中,除了讲一些理论知识外,更多的是用实际的代码来验证这些理论。
· 1.开篇前言 · 2.本文提纲 · 3.Application · 4.Window · 5.Dispatcher及多线程 · 6.类继承结构 · 7.WPF的逻辑树和视觉树 · 8.本文总结 . 9.系列进度

<b>二.创建WPF应用程序</b> 创建WPF应用程序有两种方式: 1、Visual Studio和Expression Blend默认的方式,使用App.xaml文件定义启动应用程序     App.xaml文件的内容大致如下所示:

2、可以自已定义类,定义Main方法实现对WPF应用程序的启动     在项目中添加一个类,类的代码如下,在项目选项中,设定此类为启动项。

<b>三、Application应用程序关闭</b>     OnLastWindowClose(默认值): 最后一个窗体关闭或调用Application对象的Shutdown() 方法时,应用程序关闭。 OnMainWindowClose 启动窗体关闭或调用Application对象的Shutdown()方法时,应用程序关 闭。(和C#的Windows应用程序的关闭模式比较类似) OnExplicitShutdown 只有在调用Application对象的Shutdown()方法时,应用程序才会关闭。   对关闭选项更改的时候,可以直接在App.xaml中更改:

<b>四、Application对象的事件</b> 名称 描述 Activated 当应用程序成为前台应用程序时发生,即获取焦点。 Deactivated 当应用程序停止作为前台应用程序时发生,即失去焦点。 DispatcherUnhandledException 在异常由应用程序引发但未进行处理时发生。 Exit 正好在应用程序关闭之前发生,且无法取消。 FragmentNavigation 当应用程序中的导航器开始导航至某个内容片断时发生,如果所需片段位于当前内容中,则导航会立即发生;或者,如果所需片段位于不同 内容中,则导航会在加载了源 XAML 内容之后发生。 LoadCompleted 在已经加载、分析并开始呈现应用程序中的导航器导航到的内容时发生。 Navigated 在已经找到应用程序中的导航器要导航到的内容时发生,尽管此时该内容可能尚未完成加载。 Navigating 在应用程序中的导航器请求新导航时发生。 NavigationFailed 在应用程序中的导航器在导航到所请求内容时出现错误的情况下发生。 NavigationProgress 在由应用程序中的导航器管理的下载过程中定期发生,以提供导航进度信息。 NavigationStopped 在调用应用程序中的导航器的 StopLoading 方法时发生,或者当导航器在当前导航正在进行期间请求了一个新导航时发生(没大用到)。 SessionEnding 在用户通过注销或关闭操作系统而结束 Windows 会话时发生。 Startup 在调用 Application 对象的 Run 方法时发生。 应用程序的事件处理可以: 1、在App.xaml中做事件的绑定,在App.xaml.cs文件中添加事件的处理方法     在App.xaml文件中:

    在App.xaml.cs文件中:

2、在自定义的类中可以做正常的C#的事件绑定:

<b>一、窗体类基本概念</b> 对于WPF应用程序,在Visual Studio和Expression Blend中,自定义的窗体均继承System.Windows.Window类.大家都可能听说过或者看过Applications = Code + Markup: A Guide to the Microsoft Windows Presentation Foundation这本书,它里面就是用XAML和后台代码两种形式来实现同一个功能,那么我们这里定义的窗体也由两部分组成: 1、 XAML文件,在这里面通常全部写UI的东西(希望大家还记得这两幅图)

<a href="http://images.cnblogs.com/cnblogs_com/zenghongliang/WindowsLiveWriter/3cfdd94adeea_E606/7-4-2010%203-08-26%20PM_2.png"></a>

也可以将后台代码放在XAML文件中,上面的例子可以改写为:

WPF窗体的详细的属性、方法、事件请参考MSDN,有很多的属性、方法、事件与Windows应用程序中 System.Windows.Forms.Form类颇为相似,其中常用的一些属性、方法、事件有: 窗体边框模式(WindowStyle属性)和是否允许更改窗体大小(ResizeMode属性) 。 窗体启动位置(WindowStartupLocation属性)和启动状态(WindowState属性) 等。 窗体标题(Title属性)及图标 。 是否显示在任务栏(ShowInTaskbar) 始终在最前(TopMost属性)  

提到这个UI和后台线程交互这个问题,大家都可能在WinForm中遇到过,记得几年前我参加一个外资企业的面试,公司的其中一道题就是说在 WinForm 中如何使用后台线程来操作UI,所以对这个问题比较记忆犹新。 WPF线程分配系统提供一个Dispatcher属性、VerifyAccess  和 CheckAccess 方法来操作线程。线程分配系统位于所有 WPF 类中基类,大部分WPF 元素都派生于此类,如下图的Dispatcher类: <a href="http://images.cnblogs.com/cnblogs_com/zenghongliang/WindowsLiveWriter/WPF4WPF_133B7/image_18.png"></a> WPF 应用程序启动后,会有两个线程: 一个是用来处理UI呈现(处理UI的请求,比如输入和展现等操作)。 一个用来管理 UI的 (对UI元素及整个UI进行管理)。 与 Dispatcher 调度对象想对应的就是 <b>DispatcherObject</b>,在 WPF 中绝大部分控件都继承自 DispatcherObject,甚至包括 Application。这些继承自 DispatcherObject 的对象具有线程关联特征,也就意味着只有创建这些对象实例,且包含了 Dispatcher 的线程(通常指默认 UI 线程)才能直接对其进行更新操作。 当我们尝试从一个非 UI 线程更新一个UI元素,会看到如下的异常错误。   <b>XAML代码</b>:

如果在其他工程或者类中,我们可以用 Application.Current.Dispatcher.Invoke方法来完成同样的操作,它们都指向 UI Thread Dispatcher这个唯一的对象。 Dispatcher 同时还支持 BeginInvoke 异步调用,如下代码:

关于Dispatcher和WPF多线程, 还有很多要讲,由于篇幅有限且精力有限,我这里只讲一些我们最常见的应用,同时包括Freezable 的处理等问题,大家可以查阅MSDN或者查阅国外相关的专题。

在WPF中常用的的控件类继承结构如下图所示(图中圆圈的表示抽象类,方框的表示实体类): System.Object 类:大家都知道在.Net中所有类型的根类型,在图中没有画出来,DispatcherObject 就继承于它,所以它是整个应用系统的基类。 System.Windows.Threading.DispatcherObject 类:WPF 中的绝大多数对象是从 DispatcherObject 派生的,它提供了用于处理并发和线程的基本构造。WPF 是基于调度程序实现的消息系统。 System.Windows.DependencyObject类:WPF基本所有的控件都实现了依赖属性,它表示一个参与依赖项属性系统的对 象。 System.Windows.Media.Visual类:为 WPF 中的呈现提供支持,其中包括命中测试、坐标转换和边界框计算等。 System.Windows.UIElement 类:UIElement 是 WPF 核心级实现的基类,该类建立在 Windows Presentation Foundation (WPF) 元素和基本表示特征基础上。 System.Windows.FrameworkElement类:为 Windows Presentation Foundation (WPF) 元素提供 WPF 框架级属性集、事件集和方法集。此类表示附带的 WPF 框架级实现,它是基于由UIElement定义的 WPF 核心级 API 构建的。 System.Windows.Controls.Control 类:表示 用户界面 (UI) 元素的基类,这些元素使用 ControlTemplate 来定义其外观。 System.Windows.Controls.ContentControl类:表示包含单项内容的控件。 System.Windows.Controls.ItemsControl 类:表示一个可用于呈现项的集合的控件。 System.Windows.Controls.Panel类:为所有 Panel 元素(布局)提供基类。使用 Panel 元素在 Windows Presentation Foundation (WPF) 应用程序中放置和排列子对象。 System.Windows.Sharps.Sharp类:为 Ellipse、Polygon 和 Rectangle 之类的形状元素提供基类。 除了上面的图以外,还有几个命名空间也很重要,如下: System.Windows.Controls.Decorator 类:提供在单个子元素(如 Border 或 Viewbox)上或周围应用效果的元素的基类。 System.Windows.Controls.Image 类:表示显示图像的控件。 System.Windows.Controls.MediaElement类:表示包含音频和 /或视频的控件。
关于这部分的内容讲起来就比较多了,正如上次大家的留言里说的一样,这个内容如果拉开来讲肯定就要开几个篇幅,所以我们今天主要以讲清楚概念为重 点,先看下面的一个XAML代码的例子:

上面这个UI非常的简单,Window是一个根结点,它有一个子结点StackPanel,StackPanel有一个子结点Label。注意 Label下还有一个子结点string(LabelText),它同时也是一个叶子结点。这就构成了窗口的一个逻辑树。逻辑树始终存在于WPF的UI 中,不管UI是用XAML编写还是用代码编写。WPF的每个方面(属性、事件、资源等等)都是依赖于逻辑树的。 视觉树基本上是逻辑树的一种扩展。逻辑树的每个结点都被分解为它们的核心视觉组件。逻辑树的结点对我们来说是不可见的。而视觉树不同,它暴露了视觉 的实现细节。下面是Visual Tree结构就表示了上面四行XAML代码的视觉树结构(下面这幅图片来源于WPF揭秘):

本篇主要对Application、window、多线程、类继承结构、逻辑树与可视树等的理论和实际Demo进行了探讨,通过这一篇文章,我们可 以大概了解WPF在这些元素上的处理,同时也给我后面的内容奠定了基础,后面会逐渐牵涉到实际的一些案例和新的概念,所以如果有不熟悉且对这个专题感兴趣 的朋友可以仔细看一下这篇文章,在文章后面也会把本文用到的代码附加上去,大家可以下载下来进行测试。
<a href="http://www.cnblogs.com/zenghongliang/archive/2010/07/06/1771831.html">· 2. WPF 基础到企业应用系列2——WPF前世今生</a> <a href="http://www.cnblogs.com/zenghongliang/archive/2010/07/09/1774059.html">· 3. WPF 基础到企业应用系列3——WPF开发漫谈</a> <a href="http://www.cnblogs.com/zenghongliang/archive/2010/07/14/1776916.html">· 4. WPF 基础到企业应用系列4——WPF千年轮回</a> · 5. 使用面板做布局(几种布局控件的XAML及CS代码,综合布局等) · 6. 依赖属性、附加属性(基本、继承、元数据) · 7. 路由事件、附加事件 · 8. 命令 · 9. WPF控件分类介绍与使用技巧(ContentControl、HeaderedContentControl…… Decorator) · 10. 尺寸缩放、定位与变换元素 · 11. 资源 · 12. 数据绑定(基本、值转换、验证、集合的筛选、排序、分组、主从、数据提供者) · 13. 样式 · 14. 模板 · 15. 多语言、皮肤和主题 · 16. 2D图形 · 17. 3D图形 · 18. 动画(几种动画的应用) · 19. 音频、视频、语音 · 20. 文档、打印、报表 · 21. 用户控件和自定义控件 · 22. Win32、Windows Form以及ActiveX之间的互用性 · 23. 构建并部署应用程序(ClickOnce部署、微软setup /InstallShield+自动更新组件) · 24. WPF的模式讲解及实例(MVC Demo) · 25. WPF的模式讲解及实例(MVP Demo) · 26. WPF的模式讲解及实例(MVVM Demo) · 27. 性能优化(WPF项目的瓶颈) · 28.一个完整WPF项目(普通架构版) · 39. 一个完整WPF项目(MVVM架构版) · 30. WPF 4.0新功能 本文转自KnightsWarrior51CTO博客,原文链接: http://blog.51cto.com/knightswarrior/349169  ,如需转载请自行联系原作者

继续阅读