WPF 版本 4.5 的新增功能

本主题包含有关 Windows Presentation Foundation (WPF) 版本 4.5 中的新增功能和增强功能的信息。

本主题包含以下各节:

功能区控件

WPF 4.5 附带承载快速访问工具栏、应用程序菜单和选项卡的 Ribbon 控件。 有关详细信息,请参阅功能区概述

显示大型分组数据集时增强的性能

当根据哪些项在屏幕上可见来从大量数据项中生成用户界面 (UI) 元素的子集时,将发生 UI 虚拟化。 VirtualizingPanel 定义 IsVirtualizingWhenGrouping 附加属性,该属性支持分组数据的 UI 虚拟化。 有关对数据进行分组的详细信息,请参阅如何:使用 XAML 中的视图对数据进行排序和分组。 有关虚拟化分组数据的详细信息,请参阅 IsVirtualizingWhenGrouping 附加属性。

VirtualizingPanel 的新增功能

  1. 可以使用 ScrollUnit 附加属性指定 VirtualizingPanel(例如 VirtualizingStackPanel)是否显示部分项。 如果 ScrollUnit 设置为 ItemVirtualizingPanel 将仅显示完全可见的项。 如果 ScrollUnit 设置为 Pixel,则 VirtualizingPanel 可以显示部分可见的项。

  2. VirtualizingPanel 通过 CacheLength 附加属性虚拟化时,可以指定视区前后缓存的大小。 缓存是视区(其中的项未虚拟化)上方或下方的空间量。 使用缓存避免生成 UI 元素(因为系统会将它们滚动到视图中)可以提高性能。 在较低优先级填充缓存,以便应用程序在操作期间能够响应。 VirtualizingPanel.CacheLengthUnit 属性确定 VirtualizingPanel.CacheLength 使用的度量单位。

绑定到静态属性

可以将静态属性用作数据绑定的源。 如果属性值更改时引发了静态事件,数据绑定引擎将会识别。 例如,如果类 SomeClass 定义了名为 MyProperty 的静态属性,则 SomeClass 可以定义 MyProperty 的值发生更改时所引发的静态事件。 静态事件可以使用以下签名之一。

  • public static event EventHandler MyPropertyChanged;

  • public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

请注意,在第一种情况下,类将公开名为 PropertyNameChanged 的静态事件,该静态事件将 EventArgs 传递到事件处理程序。 在第二种情况下,此类将公开名为 StaticPropertyChanged 的静态事件,该静态事件将 PropertyChangedEventArgs 传递到事件处理程序。 实现静态属性的类可以选择使用任一方法引发属性更改通知。

访问非 UI 线程上的集合

WPF 允许访问和修改线程上的数据集合,创建该集合的线程除外。 这可允许使用后台线程接收来自外部源(例如数据库)的数据,并在 UI 线程上显示该数据。 通过使用另一线程来修改该集合,用户界面将仍可继续响应用户交互。

同步和异步验证数据

INotifyDataErrorInfo 接口使数据实体类能够实现自定义验证规则并以异步方式公开验证结果。 此接口还支持自定义错误对象、每个属性具有多个错误、跨属性错误和实体级别的错误。 有关详细信息,请参阅 INotifyDataErrorInfo

自动更新数据绑定源

如果使用数据绑定来更新数据源,可以使用 Delay 属性来指定在目标上更改属性后和在更新源之前要经过的时间。 例如,假设有一个 Slider,其 Value 属性数据双向绑定到数据对象的属性,并且 UpdateSourceTrigger 属性设置为 PropertyChanged。 在此示例中,当用户移动 Slider 时,Slider 移动的每个像素的源都会更新。 源对象通常仅在滑块的 Value 停止更改时才需要滑块的值。 若要防止对源进行过于频繁的更新,请使用 Delay 指定仅在缩略图停止移动一定时间后才更新源。

绑定到实现 ICustomTypeProvider 的类型

WPF 支持将数据绑定到实现 ICustomTypeProvider(也称为自定义类型)的对象。 在以下情况下,可以使用自定义类型。

  1. 作为数据绑定中的 PropertyPath。 例如,BindingPath 属性可以引用自定义类型的属性。

  2. 作为 DataType 属性的值。

  3. 作为确定 DataGrid 中自动生成的列的类型。

从绑定表达式中检索数据绑定信息

在某些情况下,可能会获得 BindingBindingExpression,并且需要有关绑定的源对象和目标对象的信息。 使用已添加新的 API 可获取源或目标对象或关联的属性。 如果具有 BindingExpression,请使用以下 API 来获取有关目标和源的信息。

查找绑定的值 使用此 API
目标对象 BindingExpressionBase.Target
目标属性 BindingExpressionBase.TargetProperty
源对象 BindingExpression.ResolvedSource
源属性 BindingExpression.ResolvedSourcePropertyName
BindingExpression 是否属于 BindingGroup BindingExpressionBase.BindingGroup
BindingGroup 的所有者 Owner

检查有效的 DataContext 对象

在某些情况下,ItemsControl 中的项容器的 DataContext 会断开连接。 项容器是在 ItemsControl 中显示项的 UI 元素。 当 ItemsControl 是到集合的数据绑定时,将为每个项生成项容器。 在某些情况下,会从可视化树中删除项容器。 有两种删除项容器的典型情况:从基础集合中删除项和在 ItemsControl 上启用虚拟化。 在这些情况下,项容器的 DataContext 属性将被设置为 BindingOperations.DisconnectedSource 静态属性返回的 sentinel 对象。 在访问项容器的 DataContext 之前,应检查 DataContext 是否等于 DisconnectedSource 对象。

在数据值发生更改时重新定位数据(实时数据整理)

可以对数据集合进行分组、排序或筛选。 WPF 4.5 允许在修改数据时重新排列数据。 例如,假设应用程序使用 DataGrid 列出股票市场中的股票,且股票按股票值排序。 如果在股票的 CollectionView 上启用了实时排序,则当股票值大于或小于另一股票值时,DataGrid 中该股票的位置将移动。 有关详细信息,请参阅 ICollectionViewLiveShaping 接口。

对建立事件的弱引用的增强支持

现在实现弱事件模式更加容易,因为可以借助事件的订阅服务器并且无需实现附加接口。 如果没有特定事件的专用 WeakEventManager,泛型 WeakEventManager 类还允许订阅服务器参与弱事件模式。 有关详细信息,请参阅弱事件模式

用于调度程序类的新方法

调度程序类定义同步和异步操作的新方法。 同步 Invoke 方法定义采用 ActionFunc<TResult> 参数的重载。 新的异步方法 InvokeAsync 也将 ActionFunc<TResult> 作为回调参数,并返回 DispatcherOperationDispatcherOperation<TResult>DispatcherOperationDispatcherOperation<TResult> 类定义 Task 属性。 调用 InvokeAsync 时,可以将 await 关键字与 DispatcherOperation 或关联的 Task 配合使用。 如果需要同步等待 DispatcherOperationDispatcherOperation<TResult> 返回的 Task,请调用 DispatcherOperationWait 扩展方法。 如果操作在调用线程上排队,调用 Task.Wait 将导致死锁。 有关使用 Task 执行异步操作的详细信息,请参阅任务并行(任务并行库)

事件的标记扩展

WPF 4.5 支持事件的标记扩展。 虽然 WPF 未定义用于事件的标记扩展,但第三方能够创建可与事件配合使用的标记扩展。

另请参阅