1、WPF 介绍

1、WPF 介绍

.NET Framework 4
 
WPF 是下一代显示系统,用于生成Windows 客户端应用程序。 使用 WPF可以创建广泛的独立应用程序以及浏览器承载的应用程序

WPF 的核心是一个与分辨率无关并且基于向量的呈现引擎,旨在利用现代图形硬件的优势。WPF 通过一整套应用程序开发功能扩展了这个核心,这些功能包括Extensible Application Markup Language (XAML)、控件、数据绑定、布局、2-D和3-D图形、动画、样式、模板、文档、媒体、文本和版式。

WPF 包含在 Microsoft .NET Framework 中,使您能够生成融入了 .NET Framework 类库的其他元素的应用程序。

WPF 作为 .NET Framework 类型的一个子集存在,这些类型大多位于 System.Windows 命名空间。如果您以前已使用 .NET Framework 通过诸如 ASP.NET 和 Windows Forms之类的托管技术生成应用程序,那么您应该熟悉 WPF 的基本编程体验;您可以使用您最喜爱的 .NET Framework 编程语言(如 C# 或 Visual Basic)实例化类、设置属性、调用方法以及处理事件。为了支持某些更强大的 WPF 功能并简化编程体验,WPF 包括了更多编程构造,这些编程构造增强了属性和事件:依赖项属性路由事件

1.1 标记和代码隐藏

WPF 为 Windows 客户端应用程序开发提供了更多编程增强功能。 一个明显的增强功能就是使用标记代码隐藏开发应用程序的功能。 您通常使用Extensible Application Markup Language (XAML) 标记实现应用程序的外观,而使用托管编程语言(代码隐藏)实现其行为

1.1.1 标记

XAML 是一种基于 XML 的标记语言,用于以声明的方式实现应用程序的外观。它通常用于创建窗口、对话框、页面和用户控件,并用控件、形状和图形填充它们。

由于 XAML 基于 XML,因此使用它来编写的 UI 被组合到称为“元素树”的嵌套元素层次结构中。 元素树为创建和管理 UIs 提供了一种逻辑且直观的方式。

1.1.2 代码隐藏

应用程序的主要行为是实现响应用户交互的功能,包括处理事件(如,单击菜单、工具栏或按钮),并调用业务逻辑和数据访问逻辑作为响应。 在 WPF 中,此行为通常在与标记关联的代码中实现。 此类代码称为“代码隐藏”。 

1.2 应用程序

.NET Framework、System.Windows、标记和代码隐藏构成了 WPF 应用程序开发体验的基础。 此外,WPF 还为创造具有丰富内容的用户体验提供了全面的功能。 为了打包此内容并将其作为“应用程序”发送给用户,WPF 提供了一些类型和服务,它们统称为“应用程序模型”。 该应用程序模型既支持开发独立应用程序,也支持开发浏览器承载的应用程序

            .NET Framework

            System.Windows

            标记和代码隐藏

            打包此内容并将其作为“应用程序”发送给用户

 1.2.1 独立应用程序

对于独立应用程序,您可以使用 Window 类创建可从菜单栏和工具栏上访问的窗口和对话框。 下图演示了带有一个主窗口和一个对话框的独立应用程序。

此外,您还可以使用以下 WPF 对话框:MessageBoxOpenFileDialogSaveFileDialog 和 PrintDialog

1.2.2 浏览器承载的应用程序(XBAPs )

(略)

1.2.3 应用程序类(Application 类)

XBAPs 和独立应用程序通常非常复杂,需要额外的应用程序范围的服务,包括启动和生存期管理、共享属性以及共享资源。Application 类封装了这些服务以及更多内容,并且只需使用 XAML 即可实现,如下面的示例所示。

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    StartupUri="MainWindow.xaml" />

此标记是独立应用程序的应用程序定义,并指示 WPF 创建一个在应用程序启动时自动打开 MainWindow 的 Application 对象。

理解 Application 的一个关键概念在于,它为独立应用程序和浏览器承载的应用程序提供了一个通用的支持平台。 例如,浏览器承载的应用程序可以使用前面的 XAML,以便在 XBAP 启动时自动导航到某个页面,如下面的示例所示。

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" StartupUri="HomePage.xaml" />

有关更多信息,请参见应用程序管理概述

1.3 控件

应用程序模型提供的用户体验是构造控件。 在 WPF 中,“控件”是一个总括性术语,适用于窗口或页面中承载的、具有user interface (UI) 并且实现某些行为的一种 WPF 类。

按功能分类的 WPF 控件

此处列出了内置的 WPF 控件。

1.4 输入和命令

控件通常检测和响应用户输入。 WPF 输入系统使用直接事件和路由事件来支持文本输入、焦点管理和鼠标定位。 有关更多信息,请参见输入概述

应用程序通常具有复杂的输入要求。 WPF 提供了一个命令系统,它将用户输入操作与响应这些操作的代码相分离。 有关更多信息,请参见命令概述

1.5 布局

创建 UI 时,您通过按位置和大小排列控件来形成一种布局。 任何布局的主要要求都是适应窗口大小和显示设置的变化。 WPF 为您提供了一个一流的可扩展布局系统,而不是强制您编写代码以使布局适应这些情况。

布局系统的基础是相对定位,它提高了适应窗口和显示条件变化的能力。 此外,布局系统还管理控件之间的协商以确定布局。 协商过程分为两步:第一步,控件向父控件通知它所需的位置和大小;第二步,父控件通知该控件它可以具有多大空间。

布局系统通过基本 WPF 类公开给子控件。对于通用的布局,如网格、堆叠和停靠,WPF 包括了几个布局控件:

  • Canvas :子控件提供其自己的布局。

  • DockPanel :子控件与面板的边缘对齐。

  • Grid :子控件按行和列放置。

  • StackPanel :子控件垂直或水平堆叠。

  • VirtualizingStackPanel :子控件被虚拟化,并沿水平或垂直方向排成一行。

  • WrapPanel :子控件按从左到右的顺序放置,如果当前行中的控件数多于该空间所允许的控件数,则换至下一行。

注意注意

由父控件实现的、供子控件使用的属性是一种 WPF 构造,称为“附加属性”(请参见附加属性概述)。

1.6 数据绑定

创建大多数应用程序的目的是为用户提供查看和编辑数据的方式。 对于 WPF 应用程序,存储和访问数据的工作已经由 Microsoft SQL Server 和 ADO.NET 之类的技术提供。 访问数据并将数据加载到应用程序的托管对象中后,WPF 应用程序的复杂工作才开始。 实质上它涉及到两个步骤:

  1. 将数据从托管对象复制到控件中,在控件上可以显示和编辑数据。

  2. 确保将使用控件对数据进行的更改复制回托管对象。

为了简化应用程序开发,WPF 提供了一个数据绑定引擎以自动执行这些步骤。数据绑定引擎的核心单元是 Binding 类,它的任务是将控件(绑定目标)绑定到数据对象(绑定源)。 下图说明了这种关系。

基本数据绑定示意图

1.7 图形、动画、媒体

(略)

1.8 文本和版式

 为了加快高质量的文本呈现,WPF 提供了以下功能:
  • OpenType 字体支持。

  • ClearType 增强。

  • 利用硬件加速优势的高性能。

  • 文本与媒体、图形和动画的集成。

  • 国际字体支持和回退机制。

为了说明文本与图形的集成,下图演示了文本效果的应用。

具有各种文本修饰的文本

有关更多信息,请参见 WPF 中的版式

1.8.1 文档

 WPF 本身支持使用三种类型的文档:流文档、固定文档和 XML Paper Specification (XPS) 文档。 WPF 还提供了用于创建、查看、管理、批注、打包和打印文档的服务。

1.8.1.1 流文档

流文档的设计用途是,当窗口大小和显示设置发生变化时,通过动态调整和回流内容来优化查看和可读性。 下面的 XAML 标记演示了FlowDocument的定义。

 
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">

  <Paragraph FontSize="18" FontWeight="Bold">Flow Document</Paragraph>

  <Paragraph>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
    nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi
    enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
    nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.
  </Paragraph>


...


</FlowDocument>

下面的示例演示如何将流文档加载到 FlowDocumentReader 中以进行查看、搜索和打印。
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.FlowDocumentReaderWindow"
    Title="Flow Document Reader">
  <FlowDocumentReader Name="flowDocumentReader" />
</Window>
Imports System.Windows 'Window
Imports System.Windows.Documents 'FlowDocument
Imports System.IO 'FileStream, FileMode
Imports System.Windows.Markup 'XamlReader

Namespace SDKSample

    Public Class FlowDocumentReaderWindow
        Inherits Window

        Public Sub New()
            Me.InitializeComponent()
            Using stream1 As FileStream = New FileStream("AFlowDocument.xaml", _
                FileMode.Open, FileAccess.Read)
                Dim document1 As FlowDocument = _
                    TryCast(XamlReader.Load(stream1), FlowDocument)
                Me.flowDocumentReader.Document = document1
            End Using
        End Sub

    End Class

End Namespace

下面的示例演示了结果。

FlowDocumentReader 控件中的 FlowDocument

有关更多信息,请参见流文档概述

1.8.1.2 固定文档

固定文档适用于需要精确的“所见即所得”(WYSIWYG) 演示的应用程序,尤其是对于打印。 固定文档的典型用途包括桌面发布、字处理和窗体布局,在这些情况下,遵循原始页面设计非常关键。

固定文档通过与设备无关的方式维护了文档内容的精确排列。 例如,一个固定文档在 96 dpi 显示器上显示的效果与在 600 dpi 激光打印机或 4800 dpi 照相排字机上打印的效果是一样的。 虽然文档的质量会因每台设备的功能不同而有所不同,但是布局在所有情况下都保持不变。

有关更多信息,请参见 WPF 中的文档

1.8.1.3 XPS 文档

XML Paper Specification (XPS) 文档建立在 WPF 的固定文档基础上。 XPS 文档使用基于 XML 的架构进行描述,该架构本质上就是电子文件的分页表示。 XPS 是一个开放的、跨平台的文档格式,旨在简化分页文档的创建、共享、打印和存档。 XPS 技术的重要功能包括:

  • 将 XPS 文档打包为符合 Open Packaging Conventions(开放打包约定,OPC)的 ZipPackage 文件。

  • 由独立应用程序和基于浏览器的应用程序承载。

  • 从 WPF 应用程序中手动生成和操作 XPS 文档。

  • 通过追求最大化输出设备质量进行高保真呈现。

  • Windows Vista 后台打印。

  • 将文档直接传送到与 XPS 兼容的打印机。

  • UI 与 DocumentViewer 集成。

下图演示由 DocumentViewer 显示的 XPS 文档。

DocumentViewer 控件内的 XPS 文档

DocumentViewer 还允许用户更改视图、搜索和打印 XPS 文档。

有关更多信息,请参见 WPF 中的文档

1.8.1.4 批注

批注是在文档中添加的说明或注释,用于标记信息或突出显示相关项目,以便于以后参考。 尽管在打印文档上编写说明很容易,但在电子文档上“编写”说明的功能常常受到限制或者不可用。 但是,WPF 中提供了一个批注系统,以支持粘滞便筏和突出显示。 此外,这些批注还可应用于 DocumentViewer 控件中承载的文档,如下图所示。

批注样式

有关更多信息,请参见批注概述

1.8.1.5 打包

WPF System.IO.Packaging APIs 允许您的应用程序将数据、内容和资源组织成一个可移植、易于分发和访问的 ZIP 文档。 可以包括数字签名以对程序包中包含的项目进行身份验证,并确定签名的项目未被篡改或修改。 您还可以使用权限管理对软件包进行加密,以限制对受保护信息的访问。

有关更多信息,请参见 WPF 中的文档

1.8.1.6 打印

.NET Framework 包括一个打印子系统,WPF 通过支持更好的打印系统控制对其进行了增强。 打印增强功能包括:

  • 实时安装远程打印服务器和队列。

  • 动态发现打印机功能。

  • 动态设置打印机选项。

  • 打印作业重新路由和重新排列优先级别次序。

XPS 文档还包含一个关键的性能改进功能。 现有的 Microsoft Windows Graphics Device Interface (GDI) 打印路径通常需要两次转换:

  • 第一次是将文档转换成打印处理器格式,如Enhanced Metafile (EMF)。

  • 第二次是转换成打印机的页面描述语言,如打印机控制语言 (PCL) 或 PostScript。

但是,XPS 文档避免了这些转换,因为 XPS 文件格式的一个组件是打印处理器语言和页面描述语言。 这项支持有助于减少打印后台文件的大小和网络打印机的负载。

有关更多信息,请参见打印概述

 1.9 自定义 WPF 应用程序

到目前为止,您已经看到了开发应用程序的核心 WPF 生成块。 您可以使用应用程序模型承载和提供主要由控件构成的应用程序内容。

      若要简化 UI 中的控件排列,并确保在窗口大小和显示设置更改时维护这种排列,请使用 WPF 布局系统。

      由于大多数应用程序都允许用户与数据交互,因此您可以使用数据绑定减少将 UI 与数据相集成的工作量。

      若要改进应用程序的视觉外观,请使用 WPF 提供的各种图形、动画和媒体支持。 

      最后,如果您的应用程序通过文本和文档进行操作,您可以使用 WPF 文本、版式、文档、批注、打包和打印功能。

尽管如此,基本功能通常不足以创建和管理真正与众不同、具有视觉震撼力的用户体验。 标准 WPF 控件可能不能与所需的应用程序外观集成。 数据可能不能以最有效的方式显示。 应用程序的整体用户体验可能不适合 Windows 主题的默认外观。 在很多方面,演示技术需要具有像其他任何扩展性那样多的视觉扩展性。

出于这个原因,WPF 为创建独特的用户体验提供了各种机制,包括一个内容丰富的模型,用于控件、触发器、控件和数据模板、样式、UI 资源以及主题和外观。

1.9.1 内容模型

大多数 WPF 控件的主要目的都是为了显示内容。 在 WPF 中,构成控件内容的项目类型和数量被称为控件的“内容模型”。 

有些控件只能包含一个项目和内容类型;例如,TextBox 的内容为字符串值,该值被分配给 Text 属性。 但是,其他控件可以包含多个具有不同内容类型的项目;Button 的内容(由 Content 属性指定)可以包含各种项目,包括布局控件、文本、图像和形状。

1.9.2 触发器

尽管 XAML 标记的主要目的是实现应用程序的外观,但您也可以使用 XAML 实现应用程序行为的某些方面。 一个示例就是使用触发器根据用户交互更改应用程序的外观。有关更多信息,请参见样式设置和模板化中的“触发器”。

1.9.3 控件模板

WPF 控件的默认 UIs 通常由其他控件和形状构造而来。 例如,一个 Button 由 ButtonChrome 和 ContentPresenter 控件组成。 ButtonChrome 提供标准按钮外观,而ContentPresenter 显示按钮的内容(由 Content 属性指定)。

有时控件的默认外观可能与应用程序的整体外观不一致。 在这种情况下,您可以使用 ControlTemplate 更改控件的 UI 的外观,而无需更改控件的内容和行为。

1.9.4 数据模板

控件模板使您可以指定控件的外观,数据模板则允许您指定控件内容的外观。 数据模板通常用于改进绑定数据的显示方式。 下图演示 ListBox 的默认外观,它被绑定到一个Task 对象集合,该集合中的每个任务都有一个名称、说明和优先级别。

1.9.5 样式

开发人员和设计人员使用样式可以对其产品的特定外观进行标准化处理。 WPF 提供了一个强大的样式模型,其基础是 Style 元素。 下面的示例创建一个样式,该样式将窗口中的每个 Button 的背景色设置为 Orange。

1.9.6 资源

一个应用程序中的各控件应共享相同的外观,包括从字体和背景色到控件模板、数据模板和样式的所有方面。 您可以使用 WPF 对user interface (UI) 资源的支持将这些资源封装到一个位置,以便于重复使用。

1.9.7 主题和外观

从视觉的角度上讲,主题定义 Windows 以及在其中运行的应用程序的全局外观。 Windows 附带了几个主题。 例如,Microsoft Windows XP 附带了 Windows XP 和 Windows 经典主题,而 Windows Vista 附带了 Windows Vista 和 Windows 经典主题。 由主题定义的外观可定义 WPF 应用程序的默认外观。 但是,WPF 并未与 Windows 主题直接集成。

由于 WPF 的外观由模板定义,因此 WPF 为每个已知 Windows 主题包括了一个模板,这些主题包括 Aero (Windows Vista)、Classic (Microsoft Windows 2000)、Luna (Microsoft Windows XP) 和 Royale (Microsoft Windows XP Media Center Edition 2005)。这些主题作为资源字典进行打包,如果未在应用程序中找到资源,则可以解析这些资源字典。许多应用程序依赖于这些主题来定义其视觉外观;与 Windows 外观保持一致有助于用户更轻松地熟悉更多应用程序。

另一方面,某些应用程序的用户体验不一定来自标准主题。 例如,Microsoft Windows Media Player 通过音频和视频数据进行操作,并受益于不同风格的用户体验。 此类 UIs 可以提供自定义的、应用程序特定的主题。 这些主题称为外观,带有外观的应用程序通常提供挂钩,用户可以通过这些挂钩自定义外观的各个方面。Microsoft Windows Media Player 具有多个预制的外观以及大量第三方外观。

WPF 中的主题和外观都可以使用资源字典非常轻松地进行定义。 下面的示例演示示例外观定义。

1.9.8 自定义控件

尽管 WPF 提供了大量自定义项支持,您仍然可能会遇到现有 WPF 控件不能满足应用程序或用户需求的情况。 在以下情况下可能会出现这种情形:

  • 无法通过自定义现有 WPF 实现的外观来创建您需要的 UI。

  • 现有 WPF 实现不支持(或很难支持)您需要的行为。

但是,目前您可以利用三个 WPF 模型之一创建一个新的控件。 每个模型都针对一个特定的方案,并要求您的自定义控件从特定的 WPF 基类派生而来。 此处列出了此三个模型:

  • 用户控件模型。 从 UserControl 派生的自定义控件,由其他一个或多个控件组成。

  • 控制模型。 从 Control 派生的自定义控件,用于生成使用模板将其行为和外观相分离的实现,与多数 WPF 控件非常相似。 从 Control 派生,与用户控件相比,您可以更自由地创建自定义 UI,但可能需要投入更多精力。

  • 框架元素模型。 从 FrameworkElement 派生的自定义控件,其外观由自定义呈现逻辑(而不是模板)定义。

下面的示例演示从 UserControl 派生的自定义数值 up/down 控件。

1.10 WPF 最佳做法

 与任何开发平台一样,可以通过多种方式使用 WPF 以获得所需的结果。 作为确保您的 WPF 应用程序提供所需的用户体验并满足一般用户需求的一种方式,这里有一些推荐的最佳做法以确保可访问性、全球化和本地化以及性能。 有关更多信息,请参见以下内容:

 

 

 

参考文献

http://www.cnblogs.com/pilang/archive/2010/05/05/1728112.html

WPF从后台动态加载控件

posted @ 2015-10-15 12:26  moiska  阅读(1822)  评论(0编辑  收藏  举报