Как показать загрузочную графику / анимацию при привязке данных wpf - PullRequest
12 голосов
/ 22 января 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 26 апреля 2012

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

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

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

    protected override Size MeasureOverride(Size availableSize)
    {
        using (new DisposableWaitCursor(this))
        {
            return base.MeasureOverride(availableSize);
        }
    }
2 голосов
/ 22 января 2010

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

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

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

1 голос
/ 18 мая 2010

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

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

...