Как установить занятый курсор для медленных элементов управления WPF

Кажется, есть много ресурсов для показа занятого курсора.

Но все решения, которые мне удалось найти, основаны на установке курсора через модель представления. (т.е. свойство IsBusy, одноразовый WaitCursor).

Эти методы хорошо работают, когда я знаю, когда мои модели привязки / просмотра данных будут работать долго.

Но я не знаю, как сделать это автоматически в тех случаях, когда узким местом является сам пользовательский элемент управления WPF?

Например:

Загрузка элемента управления изначально без задержек. Но как только используется сторонний элемент управления, он каждый раз загружается с задержкой в ​​500 мс.

Сама привязка является быстрой, поэтому добавление waitcursor/IsBusy в модель представления бесполезно, поскольку оно не будет знать, когда элемент управления (или любой из его логических / визуальных дочерних элементов) завершит рендеринг. Он также не должен знать, поскольку реализация представления не должна затрагивать модель.

Возможно ли, чтобы приложение автоматически установило курсор на "занят", когда один или несколько элементов управления WPF занят / работает медленно?

2 ответа

Вам может понадобиться что-то вроде этого,

            var busytimer = new DispatcherTimer(
            TimeSpan.FromSeconds(1),
            DispatcherPriority.Normal,
            delegate
            {
                Process application = null;
                foreach (var process in Process.GetProcesses())
                {
                    if (process.ProcessName == "Your process name")
                    {
                        application = process;
                        break;
                    }
                }

                if (!application.Responding)
                {
                    this.Cursor = Cursors.Wait;
                }
                else
                {
                    this.Cursor = Cursors.Arrow;
                }
            },
            Application.Current.Dispatcher);

Возможно ли, чтобы приложение автоматически установило курсор на "занят", когда один или несколько элементов управления WPF занят / работает медленно?

На самом деле, нет. Если ваш поток пользовательского интерфейса блокируется, вы не сможете обновить курсор, пока он все равно не разблокируется, что противоречит цели.

Сама привязка является быстрой, поэтому добавление waitcursor/IsBusy в модель представления бесполезно, поскольку оно не будет знать, когда элемент управления (или любой из его логических / визуальных дочерних элементов) завершит рендеринг. Он также не должен знать, поскольку реализация представления не должна затрагивать модель.

Если вы идете с IDisposable ждать решения курсора, вы можете попробовать запланировать Dispose() вызов происходит после следующего прохода макета:

Dispatcher.CurrentDispatcher.BeginInvoke(
    DispatcherPriority.Loaded,
    new Action(() => waitCursor.Dispose()));
Другие вопросы по тегам