2012-12-18 37 views
0

我有一個有1000行的數據網格。 ItemsSource是一個CollectionViewSource。我的CollectionViewSource的源代碼是一個包含我稱之爲RowTypes的對象的BindingList。我的RowType對象實現INotifyPropertyChanged。每個RowType的一個屬性每兩秒鐘更改一次。這意味着我的數據網格的其中一列中的值每兩秒更改一次。如何在GUI更新期間保持WPF窗口不被凍結?

我的問題是此更新會影響用戶體驗。此更新大約需要一秒鐘,在此期間用戶無法對GUI執行任何操作。如果此更新在用戶滾動瀏覽數據網格記錄時發生,則滾動將停止(凍結),然後稍後再跳轉。這很讓人分心。

有沒有辦法在更新執行此更新時阻止我的窗口凍結?

+1

你如何適應屏幕上的1000行?爲什麼不顯示和更新你實際看到的?問題是你正在做的事情可能沒有必要。查找虛擬化,也許閱讀關於BackgroundWorker。要阻止窗戶凍結,您必須減少主線程上的負載。 – dowhilefor

+0

發佈您的代碼和XAML –

+0

我正在使用虛擬化(請參閱我的其他評論)。我有一個後臺線程實時更新股市信息。我獲取市場數據,運行一些計算,更新業務對象中的某些字段,然後從INotifyPropertyChanged調用PropertyChangedEventHandler事件。數據網格知道此時該做什麼。此過程不專門使用BackgroundWorker,但它確實使用後臺線程。 – user1214135

回答

0

確保您的DataGrid的虛擬化已啓用。隨着這一點,它應該只實際更新屏幕上顯示的內容,而不是全部1000行。這不應該花一整秒時間,除非你在那裏有瘋狂的行數。

+0

我將EnableRowVirtualization和VirtualizingStackPanel.IsVirtualizing設置爲true。我還將VirtualizingStackPanel.VirtualizationMode設置爲「回收」和「標準」。我仍然看到相同的行爲。 – user1214135

1

只是在單獨的線程(而不是UI線程)中執行讀取操作。 WPF將完美地改變視圖上的標量屬性。您可以輕鬆啓動新任務:

System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    try 
    { 
     // This method is heavy call - to the DataBase or to the WebService 
     ReadData(); 
     // In this method, do the updates of the properties of 
     // your RowType collection. You can do it in previous method. 
     UpdateData(); 
    } 
    catch (Exception e) 
    { 
     // you can log the errors which occurs during data updating 
     LogError(e); 
    } 
}); 
0

您試過DeferRefresh()

var view = CollectionViewSource.GetDefaultView(RowTypesList); 
using (view.DeferRefresh()) 
{ 
    // perform updates here 
}