Share via


WPF 4.5 版的新功能

本主題包含 Windows Presentation Foundation 4.5 版中新功能和增強功能的相關資訊。

本主題包含下列幾節:

功能區控制項

WPF 4.5 隨附于 Ribbon 裝載快速存取工具列、應用程式功能表和索引標籤的控制項。 如需詳細資訊,請參閱功能區概觀

顯示大型群組資料集合時改善效能

UI 虛擬化會在使用者介面 (UI) 元素的子集從大量資料項目,根據可在畫面上看到的項目來產生時發生。 VirtualizingPanelIsVirtualizingWhenGrouping 定義附加屬性,以啟用群組資料的 UI 虛擬化。 如需群組資料的詳細資訊,請參閱「如何:使用 XAML 中的檢視排序和分組資料」。 如需虛擬化群組資料的詳細資訊,請參閱 IsVirtualizingWhenGrouping 附加屬性。

VirtualizingPanel 的新功能

  1. 您可以使用附加屬性來指定 ,例如 ,是否 VirtualizingPanel 顯示部分專案 ScrollUnitVirtualizingStackPanel 如果 ScrollUnit 設定為 ItemVirtualizingPanel 則只會顯示完全可見的專案。 如果 ScrollUnit 設定為 PixelVirtualizingPanel 則可以顯示部分可見的專案。

  2. 當 使用附加屬性虛擬化 CacheLengthVirtualizingPanel ,您可以在檢視區前後指定快取的大小。 快取是不虛擬化項目之高於或低於檢視區的空間量。 使用快取以避免產生 UI 元素,因為它們捲動至檢視中可以改善效能。 填入快取的優先順序較低,讓應用程式在作業期間不會變成沒有回應。 屬性 VirtualizingPanel.CacheLengthUnit 會決定 所使用的 VirtualizingPanel.CacheLength 度量單位。

繫結至靜態屬性

您可以使用靜態屬性做為資料繫結的來源。 資料繫結引擎會辨識當引發靜態事件時,屬性的值何時變更。 例如,如果類別 SomeClass 定義靜態屬性,稱為 MyPropertySomeClass 可以定義為靜態事件,該事件在 MyProperty 的值變更時引發。 靜態事件可以使用下列簽章。

  • public static event EventHandler MyPropertyChanged;

  • public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

請注意,在第一個案例中,類別會公開名為 PropertyName Changed 的靜態事件,該事件會傳遞 EventArgs 至事件處理常式。 在第二個案例中,類別會公開名為 StaticPropertyChanged 的靜態事件,該事件會傳遞 PropertyChangedEventArgs 至事件處理常式。 實作靜態屬性的類別,可以選擇使用任一種方法引發屬性變更通知。

存取非 UI 執行緒上的集合

WPF 可讓您存取和修改在執行緒上的資料集合,不是建立集合的執行緒。 這可讓您使用背景執行緒從外部來源 (例如資料庫) 接收資料,並且在 UI 執行緒上顯示資料。 藉由使用另一個執行緒來修改集合,您的使用者介面仍然能夠保持對使用者互動回應。

同步和非同步驗證資料

介面 INotifyDataErrorInfo 可讓資料實體類別實作自訂驗證規則,並以非同步方式公開驗證結果。 此介面也支援自訂錯誤物件、每個屬性多個錯誤、跨屬性錯誤,以及實體層級錯誤。 如需詳細資訊,請參閱INotifyDataErrorInfo

自動更新資料繫結的來源

如果您使用資料系結來更新資料來源,您可以使用 Delay 屬性來指定在來源更新之前,在目標上的屬性變更之後傳遞的時間量。 例如,假設您有 Slider ,其 Value 屬性資料雙向系結至資料物件的 屬性,且 UpdateSourceTrigger 屬性設定為 PropertyChanged 。 在此範例中,當使用者移動 Slider 時,來源會更新移動的每個圖元 Slider 。 只有在滑杆停止變更時,來源物件通常才需要滑 Value 杆的值。 若要防止更新來源太頻繁,請使用 Delay 來指定來源應該在拇指停止移動之後經過一定的時間才會更新。

繫結至實作 ICustomTypeProvider 的型別

WPF 支援將資料系結至實 ICustomTypeProvider 作 的物件,也稱為自訂類型。 您可以在下列情況下使用自訂型別。

  1. PropertyPath作為資料系結中的 。 例如, PathBinding 屬性可以參考自訂類型的屬性。

  2. 做為 屬性的值 DataType

  3. 做為型別,決定 中 DataGrid 自動產生的資料行。

從繫結運算式擷取資料繫結資訊

在某些情況下,您可能會取得 BindingExpressionBinding ,並需要系結來源和目標物件的相關資訊。 新的 API 已新增,可讓您取得來源或目標物件或相關聯的屬性。 當您有 BindingExpression 時,請使用下列 API 來取得目標和來源的相關資訊。

若要尋找繫結的此值 使用此 API
目標物件 BindingExpressionBase.Target
目標屬性 BindingExpressionBase.TargetProperty
來源物件 BindingExpression.ResolvedSource
來源屬性 BindingExpression.ResolvedSourcePropertyName
是否 BindingExpression 屬於 BindingGroup BindingExpressionBase.BindingGroup
的擁有者 BindingGroup Owner

檢查有效的 DataContext 物件

DataContext在某些情況下,中的專案容器 ItemsControl 會中斷連線。 專案容器是 UI 元素,可在 中 ItemsControl 顯示專案。 ItemsControl當 系結至集合的資料時,會為每個專案產生專案容器。 在某些情況下,項目容器會從視覺化樹狀結構移除。 移除專案容器的兩個典型案例是在專案從基礎集合中移除,以及在 上 ItemsControl 啟用虛擬化時。 在這些情況下, DataContext 專案容器的 屬性會設定為 static 屬性所傳回的 BindingOperations.DisconnectedSource sentinel 物件。 您應該先檢查 是否 DataContext 等於 物件, DisconnectedSource 再存取 DataContext 專案容器的 。

隨著資料值變更重新調整資料的位置 (即時繪圖)

資料的集合可以分組、排序或篩選。 WPF 4.5 可讓資料在修改時重新排列。 例如,假設應用程式使用 DataGrid 來列出股市中的股票,而股票則依股票值排序。 如果在股票 CollectionView 上啟用即時排序,當股票的值大於或小於另一隻股票的值時,股票在 DataGrid 移動中的位置。 如需詳細資訊,請參閱 ICollectionViewLiveShaping 介面。

建立事件弱式參考的加強支援

實作弱式事件模式現在更加容易,因為事件訂閱者可以參與它而不用實作額外的介面。 如果特定事件不存在專用 WeakEventManager ,泛型 WeakEventManager 類別也可讓訂閱者參與弱式事件模式。 如需詳細資訊,請參閱弱式事件模式

Dispatcher 類別的新方法

Dispatcher 類別會定義同步和非同步作業的新方法。 同步 Invoke 方法會定義採用 ActionFunc<TResult> 參數的多載。 新的非同步方法 InvokeAsync ,也會接受 ActionFunc<TResult> 作為回呼參數,並傳 DispatcherOperation 回 或 DispatcherOperation<TResult>DispatcherOperationDispatcherOperation<TResult> 類別會定義 Task 屬性。 當您呼叫 InvokeAsync 時,可以使用 await 關鍵字搭配 DispatcherOperation 或相關聯的 Task 。 如果您需要同步 Task 等候 或 DispatcherOperation<TResult>DispatcherOperation 傳回的 ,請呼叫 DispatcherOperationWait 擴充方法。 如果作業在呼叫執行緒上排入佇列,呼叫 Task.Wait 將會導致死結。 如需使用 Task 來執行非同步作業的詳細資訊,請參閱 工作平行處理原則(工作平行程式庫)。

事件的標記延伸

WPF 4.5 支援事件的標記延伸。 WPF 不會定義要用於事件的標記延伸,協力廠商可以建立可與事件一起使用的標記延伸。

另請參閱