WPF 开发人员需要知道的一切
31 – UIElement 类
UIElement 类继承自 Visual 并添加了对基本用户交互行为的支持,包括:
- 布局行为
- 亲子关系
- 测量/安排通过
- 响应用户输入
- 来自键盘/鼠标等设备的输入事件
- 命令绑定
- 管理焦点
- 引发(并响应)路由事件
- 事件冒泡(向上)或隧道(向下)元素树
32 – 框架元素(FrameworkElement)
FrameworkElement 类继承自 UIElement,反过来又是 WPF 中所有控件的父类。
FrameworkElement 基于 UIElement 构建并添加了以下功能:
- 布局 – 通过实现 HorizontalAlignment、MinWidth 和 Margin 等属性来实现布局模型
- 通过 BeginStoryboard 方法支持动画
- 数据绑定
- 样式
FrameworkElement 也是将添加到逻辑树(构成用户界面的可视对象的层次结构)的对象的主要基类。
33 – Control 类
Control 类继承自 FrameworkElement,是用户与之交互的所有控件的基类。控件的示例包括:TextBox、Label、ListBox、ComboBox 和 Button。 Panel 和 Grid 等容器元素不是控件。
Control 类通过添加以下功能来扩展 FrameworkElement:
- 通过使用模板更改控件的视觉外观
- 支持字体、边框和背景颜色等视觉元素
34 – ContentControl
内容控件是一类控件,可以容纳单个嵌套元素,该元素表示其内容。由于嵌套元素可以是任何内容,从 ContentControl 派生的控件可以存储各种不同类型的内容。
内容控件有一个 Content 属性,它指向它们包含的单个元素。该元素通常是 UIElement,但可以是任何 .NET 对象。
这是一个示例,CheckBox 使用 DatePicker 作为其内容。
<CheckBox Height="31" HorizontalAlignment="Center" Name="checkBox1" VerticalAlignment="Center">
<DatePicker Name="datePicker1" />
</CheckBox>
请注意,由于 Window 类是一个内容控件,因此一个 Window 可能只有一个子元素。
通过将单个容器对象作为其内容包含在内,您可以有效地在内容控件中包含一组控件,该容器对象又包含其他元素。 (例如,一个 Button 可以包含一个 StackPanel,然后它会包含其他元素)。
35 – ItemsControl
ItemsControl 是另一个 WPF 类,它继承自 Control 并用作其他控件的基类。从 ItemsControl 继承的控件显示项目的集合。
从 ItemsControl 派生的控件通常使用数据绑定获取要显示的项目列表,绑定到实现 IEnumerable 的对象。
直接或间接从 ItemsControl 继承的控件包括:Menu、ContextMenu、ComboBox、ListBox、ListView、TabControl、DataGrid、StatusBar、ToolBar 和 TreeView。
36 – 五种类型的 WPF 应用程序
您可以开发五种主要类型的 WPF 应用程序:
- 独立应用程序 - 标准窗口客户端应用程序,在 Windows 上运行
- XAML 浏览器应用程序 (XBAP) – 在浏览器中运行的基于页面的应用程序
- 自定义控件库 - 包含从 Control 派生的自定义控件的库,打包为 DLL
- 用户控件库 - 包含从 UserControl 派生的自定义控件的库,打包为 DLL
- 类库 - 包含可用于其他项目的通用类的库,打包为 DLL
37 – 选择目标版本的 .NET Framework
默认情况下,当您使用 Visual Studio 2010 构建 WPF 应用程序时,您的目标是 .NET Framework 4 Client Profile。客户端配置文件是完整的 .NET Framework 4 的子集,其中仅包含 Windows 客户端应用程序通常需要的部分。例如,它不包括对 ASP.NET 应用程序的支持。
可以通过查看“项目属性”窗口的“应用程序”选项卡来验证或更改 WPF 项目面向的框架版本。
您可以更改您的项目以面向较旧版本的 .NET Framework。如果您的应用程序不需要较新版本的框架中存在的功能,并且您希望部署到已安装较旧版本的系统,避免下载较新版本的框架,则您可以这样做。
38 – 应用程序类
Application 是一个类,它表示在 Windows 中作为独立客户端应用程序运行的 WPF 应用程序。每个正在运行的应用程序最多包含一个 Application 实例。
使用 Visual Studio 2013 新建项目向导创建的 WPF 应用程序将在 App.xaml 文件中包含 Application 对象的定义。
<Application x:Class="WpfApplication9.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
Application 对象负责:
- 管理应用程序生命周期(例如响应启动/关闭事件)
- 窗口、财产和资源管理
- 命令行处理
- 导航
39 – 窗口类
Window 类表示 WPF 中的一个窗口。它派生自 ContentControl,这意味着它可以包含表示其内容的单个嵌套元素。它直接从 Control 继承,并间接从 FrameworkElement、UIElement、Visual、DependencyObject 和 DispatcherObject 继承。
窗口在视觉上由客户区(窗口内部)和非客户区(标题栏、框架和最小化/最大化/关闭按钮)组成。它表示用户与 WPF 独立应用程序交互的主要(外部)视觉元素。
可以通过 Activate、Close、Hide 和 Show 等方法以及 Activated、Closed、Closing 和 Deactivated 等事件来管理窗口的生命周期。
以下 XAML:
<Window x:Class="WpfApplication9.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="200" Width="250">
<Grid>
<Label Content="I'm a WPF Window!" Height="28" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</Window>
运行时在此窗口中的结果:
40 – 应用程序生命周期
下图显示了 WPF 应用程序生命周期的简化视图,由 Application 类触发的事件定义。 (事件有下划线)。单击图表可查看全尺寸版本。
从 Application 触发的主要事件包括:
- 启动 - 应用程序正在启动。
- 退出 - 当应用程序关闭时触发。关机不能取消。
- Activated – 当应用程序获得焦点时触发,即成为前台应用程序
- 停用 - 当应用程序失去焦点时触发,即不再是前台应用程序
- DispatcherUnhandledException – 在抛出异常但尚未处理时触发。您可以选择是否处理异常
- SessionEnding – 由于注销或 Windows 关闭而关闭 Windows 时触发。您可以取消关机序列。
您可以通过覆盖应用程序派生类中的 OnEventName 方法来为这些事件中的任何一个添加自定义代码,例如在启动。