WPF 版本 4.5 的新增功能 – 中文

WPF 版本 4.5 的新增功能

.NET Framework 4.5


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

本主题包含以下14节:

1)新增Ribbon控件

WPF 4.5新增控件Ribbon:能快速访问工具栏、应用程序菜单和选项的 Ribbon 控件。 有关更多信息,请参见功能区概述

2)当显示大数据项或大集合时,可设置虚拟分组以改善性能

用户界面(UI)设定虚拟分组的原则:
依据哪些子项需要在屏幕上可见的原则,可将大数据项拆分成由小数据构成的子集。(类似于dir/p/w分页显示文件?)

在VirtualizingPanel 新增 IsVirtualizingWhenGrouping 附加属性。
IsVirtualizingWhenGrouping:是否开启分组数据的UI虚拟化功能。

有关分组的数据的更多信息,请参见如何在XAML中使用视图进行排序和分组数据。 有关有效分组数据的更多信息,请参见 IsVirtualizingWhenGrouping 附加属性。

3)VirtualizingPanel的新功能 ------ 是否显示分项和指定缓存长度

  1.  VirtualizingPanel(比如VirtualizingStackPanel)新增ScrollUnit 附加属性,设置是否显示分项。 如果 ScrollUnit 设置为 ItemVirtualizingPanel 将仅显示完全可见的项。 如果 ScrollUnit 设置为 PixelVirtualizingPanel 显示部分可见项。
  2. VirtualizingPanel新增CacheLength 附加属性,指定在视区之前或之后的缓存范围。 缓存是指在活动视图之上或之下不可见项所占的空间。当滚动视图时,使用缓存可避免生成UI数据以提高性能。但是为了避免应用程序没有响应,将以较低优先级填充缓存。 VirtualizingPanel::CacheLengthUnit 缓存长度单位 VirtualizingPanel::CacheLength缓存长度


4)绑定到静态属性 ------当属性值被更改时,引发静态事件

使用静态属性作为数据绑定源,数据绑定引擎能识别静态属性值被更改而引发静态事件。 例如,如果类SomeClass 定义名为 MyProperty的静态属性, SomeClass 还可以定义当 MyProperty 的值发生更改时,引发的静态事件。 静态事件可使用下面的任意一种签名声明。

请注意在第一种情况下,类使用静态事件PropertyNameChanged传递 EventArgs 到事件处理程序。 在第二种情况下,类使用静态事件StaticPropertyChanged 传递PropertyChangedEventArgs 到事件处理程序。
类可使用上述任何一种方式,引发属性更改通知。

5)在非UI线程访问集合

WPF可使用一个线程访问和修改另外一个线程上的数据集。 您可使用后台线程接收从外部源的数据(如数据库),并将此数据显示在用户界面线程上。 使用另一个线程修改数据集,用户界面无需等待,可实时响应用户交互的要求。 (问:在多线程且要求响应效率越快越好的应用程序中,比invoke效率高吗?耗内存吗?这个功能如何实现的?好奇中,看似很好用)


6)同步和异步验证数据

INotifyDataErrorInfo 接口允许数据实体类执行自定义验证规则和异步导出验证结果。 此接口还支持自定义错误对象,一个属性多个错误,跨属性错误和实体级错误。 有关更多信息,请参见INotifyDataErrorInfo

7)自动更新数据绑定源------新增设定延迟时间更新数据源

如果您使用数据绑定更新数据源,可以使用 Delay 属性设置延迟时间,在目标属性被更改之后,依据特定的延迟时间刷新数据源。例如,假设你有个滑动条Slider,将其Value属性双向绑定到数据对象属性,并将UpdateSourceTrigger 属性设置为 PropertyChanged。 在这个示例中,当用户移动 Slider, 数据源随着Slider 移动的每个像素不断更新。但是仅当滑块的 Value 停止更改时,源对象才需要滑块的值。 若要防止太频繁更新数据源,请使用 Delay 指定特定的时间段,在滚动块停止移动后,才更新数据源。

(类似应用- 解决editbox文本框控件输入一个字符的响应事件的频繁触发)

8)绑定到实现ICustomTypeProvider的类型


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

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


9)用约束表达式检索数据绑定信息

在某些情况下,您可能需要BindingBindingExpression 去获得绑定的源和目标对象的有关信息。 新API提供获取源,目标对象或该关联的属性。 当您有 BindingExpression时,请使用目标与源的以下API获取有关信息。


查找绑定的该值

使用此API

目标对象

BindingExpressionBase::Target

目标属性

BindingExpressionBase::TargetProperty

源对象

BindingExpression::ResolvedSource

源属性

BindingExpression::ResolvedSourcePropertyName

BindingExpression 是否属于 BindingGroup

BindingExpressionBase::BindingGroup

BindingGroup 的所有者

Owner


10)检查 DataContext对象的有效性


ItemsControl 断开连接时,须检查项容器的DataContext的有效性。 项容器是显示在 ItemsControl的项的UI元素。 当 ItemsControl 的数据绑定到集合时,每个项目生成相应的项容器。 在某些情况下,项容器从可视化树中移除,一是项从基础集合中移除,二是在 ItemsControl启用虚拟化。 在这些情况下,项容器的 DataContext 属性将被设置为由 BindingOperations.DisconnectedSource 静态属性返回的sentinel对象。 您在访问项容器的 DataContext 之前,应检查 DataContextDisconnectedSource 对象是否相同。

11)当数据值被更改时重新定位数据 (Live建模)

当支持分组、排序或筛选的数据集被修改时,WPF 4.5能重新排列该数据集。例如,假设应用程序在一个股票市场中使用 DataGrid 作为股票列表,且股票由股票值排序。 如果股票的 CollectionView正以实时排序,当此股票的值大于或小于另一个股票值时,也随之更改股票在DataGrid的相应位置。 有关更多信息,请参见 ICollectionViewLiveShaping 接口。

12)改进事件的弱引用


现在更加容易实现弱事件模式,因为操作的用户可以参与其中,而不再需要实现额外的接口。对于某个特定事件来说,即使专用 WeakEventManager 不存在,泛型 WeakEventManager 类也提供用户能够参与弱事件模式。 有关更多信息,请参见弱事件模式


13) Dispatcher类的新方法 ------同步和异步操作


Dispatcher类定义了同步和异步操作的新方法。 同步 Invoke 方法重载了采用 ActionFunc<TResult> 参数。 新的异步方法InvokeAsync,也采用 ActionFunc<TResult> 作为回调参数并返回 DispatcherOperationDispatcherOperation<TResult>DispatcherOperationDispatcherOperation<TResult> 类还定义了 Task 属性。 当您调用 InvokeAsync时,可以使用 DispatcherOperation 或关联的 Task的 await 关键字。 如果需要同步等待由 DispatcherOperationDispatcherOperation<TResult>返回的Task ,请调用 DispatcherOperationWait 扩展方法。值得注意的是如果操作已在调用线程中排队,调用 Task::Wait 将导致死锁。 有关使用 Task执行异步操作的更多信息,请参见 任务并行(任务并行库)

14)事件的标记扩展


WPF 4.5支持事件的标记扩展。 当WPF没有定义事件的标记扩展,第三方可创建用于事件的标记扩展。

See Also
Concepts
What's New in the .NET Framework 4.5

请参见


概念

.NET Framework 4.5 中的新增功能