介绍

这篇文中通过常见的问题开始 WPF 之旅。我们从理解为什么使用 WPF 开始?为了更好的理解 WPF ,我们将使用 WPF 创建一个简单的“ Hello World ”项目。

已经有 GDI 、 GDI+ 和 DirectX 为什么还需要 WPF ?

首先,我们了解一下微软显示技术的发展。

User32 它提供了窗体和按钮、文本框和其他 UI 元素的外观。 User32 缺乏绘制能力。

GDI ( Graphics Device Interface ): Microsoft 引入了 GDI 绘图功能。 GDI 不仅提供了绘图功能,而且在硬件显示上提供高水平抽象。换句话说,它封装了所有硬件复杂性到 GDI 的 API 。

GDI+ GDI+ 被认为是 GDI 的扩展,提供了扩展功能像支持 JPG 和 PNG ,渐变阴影和图像保真。 GDI 的 API 最大的问题是它没有使用硬件加速,不支持动画和 3D 。

注意: 硬件加速过程中,我们使用硬件执行一些功能,而不是使用 CPU 上运行的软件来执行这些功能。

DirectX GDI 和它的扩展 GDI+ 最大的问题是硬件加速和动画支持。这对于游戏开发者来说是最大的缺点。为了回应游戏服务开发者微软开发的 DirectX 。 DirectX 利用硬件加速支持 3D ,全彩图像,流媒体设备等。当它进入游戏产业时这个 API 还不成熟。

WPF 微软已经有 3 、 4 个显示技术的 API ,那为什么好需要多一个显示技术呢。 DirectX 显著特点是使用硬件加速。微软希望能利用硬件加速技术开发像文本框、按钮、表格等 UI 元素。 WPF 标准是在 DirectX 之上的,你不仅可以使用它创建简单的 UI 元素也可以进一步开发特殊像 Grid 、 FlowDocument 、 Ellipse 等 UI 元素。你也可以进一步创建动画。 WPF 并不是为了游戏开发。 DirectX 仍然将引领游戏开发。如果你在寻找动画开发的道路(而不是游戏编程) WPF 将是一个选择。你可以使用 XML 表示 WPF ,也被称为 XAML 。换句话说 WPF 是建立在 DirectX 上的包装。因此,让我们来定义 WPF 。

WPF 是一个简化建立动态用户界面类的集合。这些类包括一系列新的空间,一些模拟旧的 UI 元素(例如, Label 、 TextBox 、 Button ),和一些新 UI 元素(例如, Grid 、 FlowDocument 和 Ellipse )。

使用 WPF 如何进行硬件加速 ?

硬件加速过程是使用硬件执行一些功能,而不是使用运行在 CPU 上的软件来执行这些功能。

WPF 利用硬件加速有两层方式。

WPF API 首先使用量视频卡的内存,像素值等参数检测硬件加速的级别。根据渲染模式分为 0 级、 1 级和 2 级。

Tier 0: - 如果视频卡不支持硬件加速, WPF 使用 0 级渲染模式。换句话说,使用软件加速。相当于 DirectX 7.0 以前版本。

Tier 1: - 如果视频卡支持部分硬件加速, WPF 使用 1 级渲染模式。 相当于 DirectX7.0 和 9.0 之间的版本。

Tier 2: - 如果视频卡支持硬件加速, WPF 使用 2 级渲染模式模式。 相当于 DirectX9.0 及更高版本。

是否意味着 WPF 可以代替 DirectX ?

不, WPF 没有替代 DirectX 。做尖端游戏仍然需要 DirectX 。 DirectX 执行视频性能比 WPF API 高很多倍。因此,当涉及到游戏开发时总是使用 DirectX 而不是 WPF 。开发游戏 WPF 不是最佳的解决方法,但可以开发一些像 TIC TAC TOE 等动画效果不高的游戏。

有一点需要记住 WPF 是代替 Windows 形式而不是 DirectX 。

我们可能给 WPF 一个确定的定义?

Windows Presentation Framework 是新的显示 API 。 WPF 是二维和三维图形引擎。它具有以下功能:

l  具有所有像按钮、复选框等普通用户控件。

l  固定和流动的文档格式。

l  具有 HTML 和 Flash 的所有功能。

l  支持 2D 和 3D 矢量图。

l  动画功能。

l  多媒体功能。

l  数据绑定。

能否解释 WPF 整体架构?

上述图形显示 WPF 整体架构。它有三个核心部分 Presentation 核心, Presentation 框架和 milcore 。在同一图中显示了其他部分如何直接和操作系统交互。所有,一段一段的去了解每段的工作。

User32: - 决定显示在屏幕上的位置。

DirectX: - 正如前面所说的 WPF 使用内部 DirectX 。 DirectX 与驱动交互。

Milcore: - Mil 表示媒体集成库。这部分是非托管代码因为它充当着托管 WPF 和非托管 DirectX / User32 API 之间的桥梁。

Presentation core :- 这部分是暴露给 WPF 低层次的 API 提供了 2D 、 3D 和几何等特性。

Presentation framework:- 这部分是想应用控件、布局等高层次特性。这些内容帮助建立应用程序。

WPF 中有那些命名空间?

这里显示了 WPF 中有十个重要的命名空间 / 类。

System.Threading.DispatcherObject

所有 WPF 对象都是从 DispatcherObject 继承而来。 WPF 工作在 STA 模式上即单线程单元模式。这个对象主要任务是处理并发和线程。任何像鼠标点击、按钮点击等消息初始化后被发送到 DispatcherObject 确认代码是否允许在当前线程。接下来的部分将研究 WPF 线程工作的细节。

System.Windows.DependencyObject

WPF 认为是基于框架的属性设计。换言之,使用使用属性而不是对象的方法、事件等行为进行交互。现在我们仅限于这个定义。

System.Windows.Media.Visual

Visual 类是绘图对象,是画图指令和画像裁剪、图像透明度等其他功能的抽象类。 Visual 类充当非托管 MilCore.dll 和土管 WFP 类的桥梁。任何从 Visual 继承的类都能在窗体上显示。如果创建自定义界面可以在程序中使用那个 Visual 对象。

System.Windows.UIElement

UIElement 执行三个重要方面 – 布局、输入和事件。

System.Windows.FrameworkElement

FrameWorkElement 以 UIElement 为基础。它添加了 HorizontalAlignment 、 VerticalAlignment 、 margins 等关键属性。

System.Windows.Shapes.Shape

这个类帮我们创建像矩形、多边形、椭圆形、线和路径等基本图形。

System.Windows.Controls.Control

这个类有像 TextBox 、 Button 、 ListBox 等控件。它添加了一些像字体、前景色和背景色等属性。

System.Windows.Controls.ContentControl

它拥有单一的内容。它可以包括从简单的标签到使用形状的布局面板级。

System.Windows.Controls.ItemsControl

是所有显示项集合的类的基类,例如 ListBox 和 TreeView 。

System.Windows.Controls.Panel

这个类用于所有布局容器元素包含一个或多个子元素并按一定的布局规则安排他们。这些容器是 WPF 布局系统的基础,使用它们能更有吸引力、灵活的布局内容。

什么是 XAML ?

XAML (发音 Zammel )是一种基于 XML 的语言,可以在 XML 中都有对象和属性。 XAML 文档是由 XAML 分析器加载的。 XAML 解析器实例化对象并设置他们的属性。 XAML 描述对象、属性以及他们之间的关系。使用 XAML 可以创建任何对象包括图形对象和非图形对象。 WPF 解析 XAML 文档,根据 XAML 的定义实例化对象并创建 XAML 中定义的关系。

因此, XAML 是一个 XML 文档用于定义对象和属性并有 WPF 在实际内存中加载这些文档。

那么,是否意味着 XAML 仅供 WPF 使用呢 ?

不, XAML 不只是供 WPF 使用。 XAML 是基于 XML 的语言,是 XML 的变体。

WPF 的 XAML 是用于描述 WPF 内容,例如 WPF 对象、控件和文档。在 WPF 中的 XAML 也有定义一个 XML 表示的电子文档的 XPS 的 XAML 。

Silverlight 应用程序使用的 Silverlight 的 XAML 是 WPF 的 XAML 的一个子集。 Silverlight 是跨平台浏览器插件帮助创建富客户端内容包括 2D 图形、动画、音频和视频。

WWF 的 XAML 并于描述 Windows Workflow Foundation 的内容。 WWF 引擎使用这种 XAML 调用相应的工作流。

能否解释 WPF 应用程序涉及的各种元素?

为了理解 WPF 中的不同元素,我们将做一个小的 “ hello world ”示例,在这个过程中将理解 WPF 中不同的元素。

注意:这个示例我们使用 VS 2008 Express Edition

因此,打开 VS 2008 Express 并从模板中选择 WPf 应用程序如下图所示。

一旦我们创建了 WPF 应用程序项目,你可以看到两个文件类型,一个是 XAML 文件,一个是后置代码即 .XAML 和 .cs 。 XAML 并没有其他是 XML 文件包含显示在 Windows UI 上的所有所需的元素。每个 XAML 元素对应于类。例如,在 XAML 文件中的“ Window ”元素对应于“ WpfApplication.Window1 ”类,在 XAML 文件中的“ Button ”元素对应于“ System.Windows.Control.Button ”类,在 XAML 文件中的“ Grid ” XAML 元素对应于“ System.Windows.Control.Grid ”类。

“ App.XAML ”和“ App.XAML.CS ”是入口文件。如果看到“ App.XAML.CS ”代码,将看到一个需要加载的 XAML 的引用。因为,在应用程序中首先运行的是“ App.XAML.CS ”中的代码“ void Main() ”方法,加载“ Window1.XAML ”文件。

现在我们连接到 XAML 文件元素的后置代码中事件中的方法。

可以从上面的代码段中看出,按钮元素点击事件是如何连接到“ MyButton_Click ”方法。“ MyButton_Click ”是定义在后置代码 XAML.CS 中的方法。

如果运行这段代码可以看到一个按钮,如果点击它可以看到一个消息框,如下图所示。

什么是依赖属性?

依赖属性属于一个类但可以被另一个类使用。

看下面代码:

<Rectangle Height="72" Width="131" Canvas.Left="74" Canvas.Top="77" />

高和宽是矩形常规的属性。但 Canvas.Top 和 Canvas.Left 是依赖属性,是属于 Canvas 类的。用在矩形中指定进行在 Canvas 中的位置。

XAML 文件是译还是运行时创建的?

XAML 文件通常是编译而不是运行时解析。当运行基于 XAML 的项目时,可以看到它在 obj/Debug 文件夹中创建一个 g.cs 扩展文件。因此,对美国 XAML 文件都将找到一个 g.cs 文件。例如, Shiv.XAML 在 obj/Debug 文件夹中有一个 Shiv.g.cs 文件。总而言之,在运行时,实际上是看不到 XAML 文件的。如果想在运行时,解析 XAML 文件也是允许的。

能否解释如何拆分代码和 XAML ?

从代码中将 XAML 分离出来执行是 WPF 中一个重要特征。因此,设计人员能够独立设计应用程序的节目,开发人员可以编写实现功能的逻辑代码。

XAML 和后置代码

上面代码显示 XAML 文件和代码从 XAML 示例中分离。为了关联 XAML 文件的类需要指定 x:Class 属性。在 XAML 对象中任何事件可以通过定义具有发送者和事件值的方法来关联。可以从上面代码段看到连接 MyClickEvent 到后置代码中的一个事件。

在后置代码中如何访问 XAML 对象?

在后置代码中访问 XAML 对象需要定义它们和 XAML 文档中名字相同。例如下面代码段定义了一个名为 objtext 对象并且在后置代码中也定义相同的名字。

访问 XAML 对象

什么样的文档支持 WPF ?

支持 WPF 有两类主要的格式,固定格式文档和流格式文档。固定格式文档看起来像 PDF 格式。它们显示内容不管屏幕大小和分辨率。但流格式文档根据屏幕大小和分辨率进行调整。

下面是固定格式的代码段。可以看到文档外观像 PDF 阅读器。第一步定义文档标签,第二部显示文档外观。

文档浏览器

Windows Presentation Foundation 初学者 FAQ相关推荐

  1. Windows Presentation Foundation(介绍外连接)

    Windows Presentation Foundation 2011/08/12 更新:2010 年 12 月 Windows Presentation Foundation (WPF) 为开发人 ...

  2. Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)

    原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) ------------------------------ ...

  3. Windows Presentation Foundation (WPF)中的命令(Commands)简述

    Windows Presentation Foundation (WPF)中的命令(Commands)简述 原文:Windows Presentation Foundation (WPF)中的命令(C ...

  4. 演练:在 Windows 窗体中承载 Windows Presentation Foundation 复合控件 【转载】

    http://msdn.microsoft.com/zh-cn/library/ms745781.aspx 更新:2007 年 11 月 本演练演示如何创建 WPF 复合控件,并通过使用 Elemen ...

  5. Windows Presentation Foundation 开始介绍

    This portal provides links to information intended for developers that are new to Windows Presentati ...

  6. WPF(Windows Presentation Foundation)用户界面框架

    WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模 ...

  7. Windows Presentation Foundation 用户指南

    Microsoft Windows Presentation Foundation(以前的代号称为"Avalon")为构建高度投入,且在视觉效果上与众不同的应用程序提供了一个集成的 ...

  8. Windows Presentation Foundation 巡游

    发布日期: 11/10/2005 | 更新日期: 11/10/2005 Tim Sneath Microsoft Corporation 适用于: WinFX Runtime Components S ...

  9. Implementing the 3DVIA Composer Player ActiveX in Windows Presentation Foundation

    2019独角兽企业重金招聘Python工程师标准>>> In this post I want to address a technological issue related to ...

最新文章

  1. Bitmap too larget to be uploaded into a texture的解决方法
  2. PDF转换图片,图片的切割,图片转换PDF以及PDF加水印等记录贴
  3. 以太坊智能合约简介(Solidity)
  4. 【定区管理功能】定区列表分页条件查询
  5. 关于8位AD_DA转换芯片的采样率问题
  6. 大学留级两年不敢和家人说_您说什么:如何与家人保持联系?
  7. 二叉排序树删除子节点以及遍历
  8. 几种php 删除数组元素方法
  9. Java笔记-DH密钥交换获取密钥及AES加解密
  10. JDBC模板对象是多例的
  11. linux0.11中断描述符,Linux 0.11总结
  12. (转)关于中国的互联网
  13. 运动目标跟踪(五)--搜索算法预测模型之PF,KF,EKF,UKF比较总结
  14. Apache基本设置
  15. JAVA 注解示例 详解
  16. 来给PPT添加一个进度条和页码吧
  17. lora与NB-IoT无线通讯技术在消防产品上的应用-lora烟感/NB烟感
  18. 讯图科技数据网关解决方案
  19. 【python】filetype根据内容推测文件类型
  20. 业务数据分析最佳案例!旅游业数据分析!⛵

热门文章

  1. 妙用Java 8中的 Function接口,消灭if...else(非常新颖的写法)
  2. 活动回顾 谷露招聘沙龙VOL.6 解锁校招人才获取新玩法
  3. Hyperledger Fabric 1.0 快速搭建 -------- 多机部署 Fabric CA节点服务
  4. 【Crash】C++程序崩溃排查方法
  5. 大学生实习就业调研报告:8个共性问题与企业CTO/CEO/HR管理者探讨
  6. python数字1 3怎么表示_Python3数据类型之数字
  7. 123部奥斯卡影片名称中英文对照
  8. faithful原版高清java_我的世界Faithful材质包下载【1.6-1.8.x】【32x/64x】
  9. 语音库构建_在10分钟内构建一个多功能语音助手
  10. 初级开发和中级,高级的区别_如何从初级开发人员过渡到中级开发人员