2010-01-22 46 views
12

我有一個包含DataGrid的WPF用戶控件。我將視圖模型的ObservableCollection綁定到它。每個視圖模型都有另一個視圖模型集合,我正用它來綁定另一個DataGrid。所以效果是DataGrid,行詳細信息模板中包含嵌套DataGrid如何在wpf數據綁定發生時顯示加載圖形/動畫

通常情況下,綁定非常快,但有時當有大量數據時,它可以在綁定/繪圖發生時掛起UI。

有沒有一種方法可以在裝訂/繪圖過程中顯示加載動畫或進度條?

回答

2

有可能是一個更正式的,或至少簡單的解決方案,但你可以使用在一個工作線程所示,當你在網格進行加載異步關閉的模式彈出窗口:

Window waitWindow = new Window { Height = 100, Width = 200, WindowStartupLocation = WindowStartupLocation.CenterScreen, WindowStyle = WindowStyle.None }; 
waitWindow.Content = new TextBlock { Text = "Please Wait", FontSize = 30, FontWeight = FontWeights.Bold, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; 

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += delegate 
{ 
    Dispatcher.BeginInvoke(new Action(delegate { waitWindow.ShowDialog(); })); 

    DataLoader dataLoader = new DataLoader(); // I made this class up 
    dataLoader.DataLoaded += delegate 
    { 
     Dispatcher.BeginInvoke(new Action(delegate() { waitWindow.Close(); })); 
    }; 

    dataLoader.LoadData(); 
}; 

worker.RunWorkerAsync(); 

你可以用一個非常類似於加載條的東西來代替TextBlock,並且可以通過參數化處理加載網格並將其傳遞給常用方法的對象來使代碼重新可用。

我希望這對你有用。

+0

我把調用ShowDialog的工作線程的DoWork的委託內部處理,其中數據被打開的窗口前加載的情況下(顯示工人的窗外要求它在年底完成,因爲ShowDialog塊)。我不知道這樣的事情發生的可能性如何(如果甚至可能的話),但我認爲我會安全起見,而不是引入罕見的難以追蹤的錯誤。 – 2010-01-22 05:47:43

1

您可以使用數據觸發器打開/關閉等待光標。我發表了一些代碼here

2

我有同樣的問題,這就是我解決它的方法。

我發現DataGrid只會在顯示網格時開始創建控件。在我的情況下,這是一個耗時的過程。在進行一些跟蹤之後,我發現在測量過程中會創建控件!

我的解決方案是重寫MeasureOverride並將等待光標放在基類調用周圍。我將等待遊標設置封裝在一個類中。所以代碼看起來像這樣。

protected override Size MeasureOverride(Size availableSize) 
    { 
     using (new DisposableWaitCursor(this)) 
     { 
      return base.MeasureOverride(availableSize); 
     } 
    } 
相關問題