WPF for .NET Framework 4.5 中的新增功能

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

本主题包含以下部分:

功能区控件

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

改进了显示大型分组数据集时的性能

当用户界面 (UI) 元素的子集基于屏幕上可见的项从更多数据项生成时,会发生 UI 虚拟化。 VirtualizingPanel 定义 IsVirtualizingWhenGrouping 附加属性,该属性为分组数据启用 UI 虚拟化。 有关对数据进行分组的详细信息,请参阅如何:使用 XAML 中的视图对数据进行排序和分组。 有关虚拟化分组数据的详细信息,请参阅 IsVirtualizingWhenGrouping 附加属性。

VirtualizingPanel 的新功能

  1. 可以使用ScrollUnit附加属性来指定VirtualizingPanel(例如 VirtualizingStackPanel)是否显示部分项目。 如果 ScrollUnit 设置为 ItemVirtualizingPanel 则只会显示完全可见的项目。 如果 ScrollUnit 被设置为 PixelVirtualizingPanel 可以显示部分可见的项目。

  2. 可以使用CacheLength附加属性在VirtualizingPanel进行虚拟化时指定视口之前和之后缓存的大小。 缓存是视区上方或下方未进行虚拟化处理的空间。 使用缓存避免在 UI 元素滚动到视图中时生成 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 。 例如, Path 某个 Binding 属性可以引用自定义类型的属性。

  2. 作为属性的值 DataType

  3. 作为一种类型,用于确定自动生成的 DataGrid列。

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

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

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

检查有效的 DataContext 对象

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

随着数据值的变化重新定位数据(实时调整)

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

改进了对建立对事件的弱引用的支持

现在,实现弱事件模式更容易,因为事件订阅者可以参与该模式,而无需实现额外的接口。 如果针对某个事件不存在专用WeakEventManager事件,泛型WeakEventManager类也使订阅者能够参与弱事件模式。 有关详细信息,请参阅 弱事件模式

Dispatcher 类的新方法

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

用于事件的标记扩展

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

另请参阅