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;
}