Подтвердить что ты не робот

Как показать графику/анимацию загрузки, когда происходит привязка данных wpf

У меня есть пользовательский элемент управления WPF, содержащий DataGrid. Я привязываю к нему модели ObservableCollection. Каждая модель просмотра имеет еще один набор моделей представлений, которые я использую для привязки другого DataGrid to. Таким образом, эффект представляет собой DataGrid с вложенным DataGrid, содержащимся в шаблоне деталей строки.

Обычно привязка выполняется довольно быстро, но иногда, когда есть много данных, он может повесить пользовательский интерфейс, когда происходит привязка/рисование.

Есть ли способ показать анимацию загрузки или индикатор выполнения во время выполнения привязки/чертежа?

4b9b3361

Ответ 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 чем-то вроде панели загрузки, и вы можете сделать код повторно используемым, параметризуя объект, который обрабатывает загрузку сетки (grid) и передает ее в широко используемый метод.

Я надеюсь, что это сработает для вас.

Ответ 2

У меня была та же проблема, и я решил это.

Я обнаружил, что DataGrid начнет создавать элементы управления только при отображении сетки. В моем случае это был трудоемкий процесс. После некоторой трассировки я обнаружил, что создание элементов управления происходит во время измерения!

Мое решение - переопределить MeasureOverride и поместить курсор ожидания вокруг вызова базового класса. Я инкапсулировал настройку курсора в классе. Таким образом, код выглядит следующим образом.

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

Ответ 3

Вы можете использовать курсор ожидания, включенный/выключенный, с помощью триггера данных.

Я разместил код здесь.