我有一个用户控件,其中包含一个带有gridview的列表视图。 我正在使用后台工作者开始加载动画,获取数据并停止加载动画。一切都很好,但问题是在我获取数据并将其绑定到网格之后,在这段时间内渲染网格和加载动画冻结需要很长时间。
BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true };
public FormUserControl()
{
InitializeComponent();
presenter = new FormPresenter(this);
bw.DoWork += new DoWorkEventHandler(LoadInfo);
bw.RunWorkerCompleted += LoadInfo_RunWorkerCompleted;
Dispatcher.Invoke(new Action(() =>
{
EnableLoading(true);
}), DispatcherPriority.ContextIdle);
bw.RunWorkerAsync();
}
void LoadInfo(object sender, DoWorkEventArgs e)
{
presenter.LoadFormInformation();
}
private void LoadInfo_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
Dispatcher.Invoke(new Action(() =>
{
//here animation freezes
this.AjmStoreLog = this.GridInfo;
EnableLoading(false);
}), DispatcherPriority.ContextIdle);
}
我需要调用EnableLoading(false);网格渲染完成时不在LoadInfo_RunWorkerCompleted事件中的此函数。
感谢您的帮助。
答案 0 :(得分:1)
在很多情况下,性能会因为工作量太大而受到影响,并且很多工作必须在UI线程上进行。没有可以帮助的灵丹妙药解决方案 - 如果您的数据源中有很多项目,或者您的模板非常复杂......
我建议首先考虑UI虚拟化,假设有很多项目,这是性能问题的主要原因。如果没有UI虚拟化,列表控件需要呈现数据源中的每个项目,但启用它将使得只有可见项目才能在屏幕上实际呈现,这会产生巨大的差异。