wpf数据绑定发生时如何显示加载图形/动画
Posted
技术标签:
【中文标题】wpf数据绑定发生时如何显示加载图形/动画【英文标题】:How to show a loading graphic/animation when wpf data binding is taking place 【发布时间】:2011-01-08 00:39:14 【问题描述】:我有一个包含DataGrid
的 WPF 用户控件。我将一个ObservableCollection
的视图模型绑定到它。每个视图模型都有另一个视图模型集合,我用来将另一个 DataGrid
绑定到。所以效果是一个DataGrid
,在行详细信息模板中包含一个嵌套的DataGrid
。
通常绑定很快,但有时当有大量数据时,它可能会在绑定/绘图发生时挂起 UI。
有没有一种方法可以在绑定/绘图过程中显示加载动画或进度条?
【问题讨论】:
【参考方案1】:可能有更正式的,或者至少更简单的解决方案,但您可以使用在工作线程中显示的模式弹出窗口,并在您的网格加载完成时异步关闭:
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 替换为类似于加载栏的东西,并且可以通过参数化处理网格加载的对象并将其传递给常用方法来使代码可重用。
我希望这对你有用。
【讨论】:
我将 ShowDialog 调用放在工作线程的 DoWork 委托中,以处理在打开窗口之前加载数据的情况(显示工作人员外部的窗口需要在结束,因为 ShowDialog 块)。我不知道这种事情发生的可能性有多大(如果有可能的话),但我认为我会谨慎行事,而不是引入一个罕见的、难以跟踪的错误。【参考方案2】:我遇到了同样的问题,我就是这样解决的。
我发现 DataGrid 只有在显示网格时才会开始创建控件。就我而言,这是一个耗时的过程。经过一些跟踪,我发现创建控件是在测量过程中发生的!
我的解决方案是覆盖 MeasureOverride 并将等待光标放在基类调用周围。我将等待光标设置封装在一个类中。所以代码看起来像这样。
protected override Size MeasureOverride(Size availableSize)
using (new DisposableWaitCursor(this))
return base.MeasureOverride(availableSize);
【讨论】:
以上是关于wpf数据绑定发生时如何显示加载图形/动画的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何对 contenteditable div 进行双向绑定,以便我们可以在 onclick 事件发生时访问内容并进行更改?