在显示加载动画时,我使用后台工作程序来加载非常大的项目集。在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;
}发布于 2012-11-12 05:47:11
一种方法是在运行在不同UI线程下的当前窗口之上创建一个覆盖窗口,并在此窗口中显示加载动画,并设置适当的属性以使窗口看起来是加载窗口的一部分。
这本质上是一个闪屏。
https://stackoverflow.com/questions/13104160
复制相似问题