WPF用户控件实现类似WinForm的子窗口
1、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 标记和代码隐藏
1.1.1 标记
XAML 是一种基于 XML 的标记语言,用于以声明的方式实现应用程序的外观。它通常用于创建窗口、对话框、页面和用户控件,并用控件、形状和图形填充它们。
由于 XAML 基于 XML,因此使用它来编写的 UI 被组合到称为“元素树”的嵌套元素层次结构中。 元素树为创建和管理 UIs 提供了一种逻辑且直观的方式。
1.1.2 代码隐藏
应用程序的主要行为是实现响应用户交互的功能,包括处理事件(如,单击菜单、工具栏或按钮),并调用业务逻辑和数据访问逻辑作为响应。 在 WPF 中,此行为通常在与标记关联的代码中实现。 此类代码称为“代码隐藏”。
1.2 应用程序
.NET Framework
标记和代码隐藏
打包此内容并将其作为“应用程序”发送给用户
对于独立应用程序,您可以使用 Window 类创建可从菜单栏和工具栏上访问的窗口和对话框。 下图演示了带有一个主窗口和一个对话框的独立应用程序。
此外,您还可以使用以下 WPF 对话框:MessageBox、OpenFileDialog、SaveFileDialog 和 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 控件
此处列出了内置的 WPF 控件。
-
按钮:Button 和 RepeatButton。
-
日期显示和选择:Calendar 和 DatePicker。
-
数字墨迹:InkCanvas 和 InkPresenter。
-
文档:DocumentViewer、FlowDocumentPageViewer、FlowDocumentReader、FlowDocumentScrollViewer 和 StickyNoteControl。
-
输入:TextBox、RichTextBox 和 PasswordBox。
- 布局:
- Border、BulletDecorator、Canvas、DockPanel、Expander、Grid、GridView、GridSplitter、GroupBox、Panel、ResizeGrip、Separator、ScrollBar、ScrollViewer、
- StackPanel、Thumb、Viewbox、VirtualizingStackPanel、Window 和 WrapPanel。
-
菜单:ContextMenu、Menu 和 ToolBar。
-
选择:CheckBox、ComboBox、ListBox、RadioButton 和 Slider。
-
用户信息:AccessText、Label、Popup、ProgressBar、StatusBar、TextBlock 和 ToolTip。
应用程序通常具有复杂的输入要求。 WPF 提供了一个命令系统,它将用户输入操作与响应这些操作的代码相分离。 有关更多信息,请参见命令概述。
1.5 布局
布局系统的基础是相对定位,它提高了适应窗口和显示条件变化的能力。 此外,布局系统还管理控件之间的协商以确定布局。 协商过程分为两步:第一步,控件向父控件通知它所需的位置和大小;第二步,父控件通知该控件它可以具有多大空间。
布局系统通过基本 WPF 类公开给子控件。对于通用的布局,如网格、堆叠和停靠,WPF 包括了几个布局控件:
-
Canvas :子控件提供其自己的布局。
-
DockPanel :子控件与面板的边缘对齐。
-
Grid :子控件按行和列放置。
-
StackPanel :子控件垂直或水平堆叠。
-
VirtualizingStackPanel :子控件被虚拟化,并沿水平或垂直方向排成一行。
-
WrapPanel :子控件按从左到右的顺序放置,如果当前行中的控件数多于该空间所允许的控件数,则换至下一行。
注意 |
---|
由父控件实现的、供子控件使用的属性是一种 WPF 构造,称为“附加属性”(请参见附加属性概述)。 |
1.6 数据绑定
创建大多数应用程序的目的是为用户提供查看和编辑数据的方式。 对于 WPF 应用程序,存储和访问数据的工作已经由 Microsoft SQL Server 和 ADO.NET 之类的技术提供。 访问数据并将数据加载到应用程序的托管对象中后,WPF 应用程序的复杂工作才开始。 实质上它涉及到两个步骤:
-
将数据从托管对象复制到控件中,在控件上可以显示和编辑数据。
-
确保将使用控件对数据进行的更改复制回托管对象。
为了简化应用程序开发,WPF 提供了一个数据绑定引擎以自动执行这些步骤。数据绑定引擎的核心单元是 Binding 类,它的任务是将控件(绑定目标)绑定到数据对象(绑定源)。 下图说明了这种关系。
1.7 图形、动画、媒体
(略)
1.8 文本和版式
-
OpenType 字体支持。
-
ClearType 增强。
-
利用硬件加速优势的高性能。
-
文本与媒体、图形和动画的集成。
-
国际字体支持和回退机制。
为了说明文本与图形的集成,下图演示了文本效果的应用。
有关更多信息,请参见 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
下面的示例演示了结果。
有关更多信息,请参见流文档概述。
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 文档。
有关更多信息,请参见 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 文件格式的一个组件是打印处理器语言和页面描述语言。 这项支持有助于减少打印后台文件的大小和网络打印机的负载。
有关更多信息,请参见打印概述。
参考文献
http://www.cnblogs.com/pilang/archive/2010/05/05/1728112.html
WPF从后台动态加载控件