当WPF数据绑定正在进行时如何显示加载图形/动画

12
我有一个包含 DataGrid 的 WPF 用户控件。我将一个 ObservableCollection 视图模型绑定到它上面。每个视图模型都有另一个视图模型的集合,我使用它来绑定另一个 DataGrid。因此,效果是一个带有嵌套 DataGridDataGrid,该嵌套在行详情模板中。
通常情况下,绑定非常快,但是当有大量数据时,它可能会挂起 UI,而绑定/绘制正在进行。
有没有一种方法可以在绑定/绘制进行时显示加载动画或进度条?
2个回答

2

我遇到了同样的问题,以下是我的解决方法。

我发现DataGrid仅在显示网格时开始创建控件。在我的情况下,这是耗时的过程。经过一些跟踪,我发现控件的创建发生在测量期间!

我的解决方案是重写MeasureOverride并在基类调用周围放置等待光标。我将我的等待光标设置封装在一个类中。因此,代码看起来像这样。

    protected override Size MeasureOverride(Size availableSize)
    {
        using (new DisposableWaitCursor(this))
        {
            return base.MeasureOverride(availableSize);
        }
    }

2

可能有更正式或至少更简单的解决方案,但您可以使用模态弹出窗口,在工作线程中显示该窗口,并在网格加载完成后异步关闭:

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会阻塞)。我不知道这种情况发生的可能性有多大(如果可能的话),但我认为安全起见比引入一个罕见且难以追踪的错误更重要。 - Mike Pateras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接