2014-09-29 2 views
0

Кажется, что есть много ресурсов при отображении курсора занятого.Как установить курсор занятости для медленных элементов управления WPF

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

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

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

Например:

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

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

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

ответ

0

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

  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); 
0

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

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

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

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

Dispatcher.CurrentDispatcher.BeginInvoke(
    DispatcherPriority.Loaded, 
    new Action(() => waitCursor.Dispose())); 
Смежные вопросы