2012-10-27 75 views
1

我使用後臺工作負載一個非常大的一組物品,同時顯示加載動畫。在run worker completed事件中,我將所有加載的項目設置爲可觀察集合,然後關閉加載屏幕。問題在於進度條能夠平滑地進行動畫,直到項目設置爲可觀察集合,然後停止動畫。我想這是因爲這些項目的渲染干擾了動畫。在渲染階段有什麼方法可以使動畫平滑嗎?運行應用程序時,我得到的時間爲:加載屏幕動畫口吃

負荷= 1000毫秒
設置屬性= 43毫秒
渲染= 5083毫秒

渲染提高了19毫秒當我打開虛擬化上。我將它關閉以演示渲染時間較長的場景。

public ObservableCollection<string> Items { get; set; } 
    private IEnumerable<string> _items; 
    private BackgroundWorker _worker; 
    private long _loadTime; 
    private long _renderTime; 
    private long _setPropertiesTime; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Items = new ObservableCollection<string>(); 
     _itemsGrid.DataContext = this; 
     _worker = new BackgroundWorker(); 
     _worker.DoWork += DoWork; 
     _worker.RunWorkerCompleted += RunWorkerCompleted; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     _renderLabel.Content = string.Empty; 
     _loadLabel.Content = string.Empty; 
     _loadingBorder.Visibility = Visibility.Visible; 
     _worker.RunWorkerAsync();    
    } 

    void DoWork(object sender, DoWorkEventArgs e) 
    { 
     _items = LoadItems();    
    } 

    void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     var setItemsTimer = Stopwatch.StartNew(); 
     Items.Clear(); 

     foreach (var item in _items) 
     { 
      Items.Add(item); 
     } 

     setItemsTimer.Stop(); 
     _setPropertiesTime = setItemsTimer.ElapsedMilliseconds; 

     var timer = Stopwatch.StartNew(); 

     Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => 
     { 
      timer.Stop(); 
      _loadLabel.Content = string.Format("Loading took {0} ms, Set properties took {1} ms", _loadTime, _setPropertiesTime); 
      _renderLabel.Content = string.Format("Rendering took {0} ms", timer.ElapsedMilliseconds); 
      _loadingBorder.Visibility = Visibility.Collapsed; 
     })); 
    } 

    IEnumerable<string> LoadItems() 
    { 
     var timer = Stopwatch.StartNew(); 
     var items = new List<string>(); 
     for (int i = 0; i < 5000; i++) 
     { 
      items.Add("Testing"); 
     } 

     Thread.Sleep(1000); 

     timer.Stop(); 
     _loadTime = timer.ElapsedMilliseconds; 
     return items; 
    } 

回答

0

一種方法是建立在你一個不同的UI線程中運行當前窗口的頂部覆蓋窗口,並顯示在此窗口中加載動畫,並設置相應屬性,使裝載的窗口外觀部分窗口。

這本質上是一個閃屏。