本主题包含有关 Windows Presentation Foundation 版本 4.5 中的新增功能和增强功能的信息。
本主题包含以下部分:
功能区控件
WPF 4.5 附带了 Ribbon 承载快速访问工具栏、应用程序菜单和选项卡的控件。 有关详细信息,请参阅 功能区概述。
改进了显示大型分组数据集时的性能
当用户界面 (UI) 元素的子集基于屏幕上可见的项从更多数据项生成时,会发生 UI 虚拟化。 VirtualizingPanel 定义 IsVirtualizingWhenGrouping 附加属性,该属性为分组数据启用 UI 虚拟化。 有关对数据进行分组的详细信息,请参阅如何:使用 XAML 中的视图对数据进行排序和分组。 有关虚拟化分组数据的详细信息,请参阅 IsVirtualizingWhenGrouping 附加属性。
VirtualizingPanel 的新功能
可以使用ScrollUnit附加属性来指定VirtualizingPanel(例如 VirtualizingStackPanel)是否显示部分项目。 如果 ScrollUnit 设置为 Item, VirtualizingPanel 则只会显示完全可见的项目。 如果 ScrollUnit 被设置为 Pixel,VirtualizingPanel 可以显示部分可见的项目。
可以使用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的对象,也称为自定义类型。 可以在以下情况下使用自定义类型。
作为数据绑定中的一种 PropertyPath 。 例如, Path 某个 Binding 属性可以引用自定义类型的属性。
作为属性的值 DataType 。
作为一种类型,用于确定自动生成的 DataGrid列。
从绑定表达式检索数据绑定信息
在某些情况下,您可能获得Binding的BindingExpression,并需要了解有关绑定的源对象和目标对象的信息。 添加了新的 API,使你能够获取源或目标对象或关联的属性。 如果有 BindingExpression,请使用以下 API 获取有关目标和源的信息。
查找绑定的此值 | 使用此 API |
---|---|
目标对象 | BindingExpressionBase.Target |
目标属性 | BindingExpressionBase.TargetProperty |
源对象 | BindingExpression.ResolvedSource |
源属性 | BindingExpression.ResolvedSourcePropertyName |
是否 BindingExpression 属于 BindingGroup | BindingExpressionBase.BindingGroup |
a 的所有者 BindingGroup | Owner |
检查有效的 DataContext 对象
在某些情况下,DataContext 中的项目容器可能会与 ItemsControl 断开连接。 项容器是 UI 元素,用于在 . 中显示项 ItemsControl。 ItemsControl将数据绑定到集合时,会为每个项生成一个项容器。 在某些情况下,项容器将被从视觉树中删除。 删除项容器的两个典型情况是在从基础集合中删除项并在启用 ItemsControl虚拟化时。 在这些情况下, DataContext 项容器的属性将被设置为通过 BindingOperations.DisconnectedSource 静态属性返回的 sentinel 对象。 在访问DataContext项容器之前,应检查对象DataContext是否等于DisconnectedSource对象。
随着数据值的变化重新定位数据(实时调整)
可以对数据集合进行分组、排序或筛选。 WPF 4.5 允许修改数据时重新排列数据。 例如,假设应用程序使用DataGrid列出股市中的股票,并且股票按照股票价值排序。 如果启用了股票 CollectionView 的实时排序,当股票的价值超过或低于其他股票的价值时,该股票在 DataGrid 中的位置将发生移动。 有关详细信息,请参阅 ICollectionViewLiveShaping 该接口。
改进了对建立对事件的弱引用的支持
现在,实现弱事件模式更容易,因为事件订阅者可以参与该模式,而无需实现额外的接口。 如果针对某个事件不存在专用WeakEventManager事件,泛型WeakEventManager类也使订阅者能够参与弱事件模式。 有关详细信息,请参阅 弱事件模式。
Dispatcher 类的新方法
Dispatcher 类定义同步和异步作的新方法。 同步 Invoke 方法定义采用 Action 或 Func<TResult> 参数的重载。 新的异步方法 InvokeAsync,也采用 Action 或 Func<TResult> 作为回调参数并返回 DispatcherOperation 或 DispatcherOperation<TResult>。
DispatcherOperation和DispatcherOperation<TResult>类定义属性Task。 调用InvokeAsync时,可以将await
关键字与DispatcherOperation关键字或关联的Task关键字一起使用。 如果需要同步等待Task或DispatcherOperation返回的DispatcherOperation<TResult>,请调用DispatcherOperationWait扩展方法。 如果操作被调用线程排队,则调用 Task.Wait 将导致死锁。 关于使用Task执行异步操作的详细信息,请参阅任务并行度(任务并行库)。
用于事件的标记扩展
WPF 4.5 支持事件的标记扩展。 虽然 WPF 未定义用于事件的标记扩展,但第三方能够创建可用于事件的标记扩展。