Как отобразить курсор "Занят" в течение x раз, а затем на экране-заставке?

У меня есть приложение в WPF с C#.net, в котором у нас много дорогих операций. Недавно мы получили это требование: для длительных процессов отображать курсор занятости до 3 секунд, если операция превышает 3 секунды, отображать заставку до завершения операции. Я много искал по сети, но, похоже, ничего не актуально. Любая поддержка будет высоко оценена.

Мы что-то пробовали, это работает, но в немногих случаях это не дает ожидаемых результатов. Любая помощь будет высоко оценен. Когда моя внутренняя логика отображает какое-либо предупреждающее сообщение и ждет ввода пользователя, таймер функции Busy Cursor продолжает работать, мы тоже получаем всплеск.

    public class BusyCursor:IDisposable
    {
        private Cursor _previousCursor;
        System.Timers.Timer _timer     
        public BusyCursor()
        {
            _previousCursor = Mouse.OverrideCursor;
            Mouse.OverrideCursor = Cursors.Wait;
           _timer = new System.Timers.Timer(); 
           _timer.Interval = 3000;
           _timer.Elapsed += timer_Tick;
           _timer.Start();
        }
        public void timer_Tick(object sender, ElapsedEventArgs e)
        {           
            Application.Current.Dispatcher.Invoke((new Action(() =>
                {
                    if (!DXSplashScreen.IsActive)
                    {
                        DXSplashScreen.Show<TrippsSplashScreen>();
                    }
                    Mouse.OverrideCursor = Cursors.Arrow;
                    _timer.Stop();

                })), DispatcherPriority.ApplicationIdle);            

        }
        #region IDisposable Members
        public void Dispose()
        {            
                _timer.Stop();
                if (DXSplashScreen.IsActive)
                {
                    DXSplashScreen.Close();
                }
                Mouse.OverrideCursor = Cursors.Arrow;               
        }
        #endregion
    }

Usage:

using (new BusyCursor())
{
       //logic ---
}

Спасибо

1 ответ

bool calculating = false;
bool showingSplash = false;
void Meth(Task[] expensiveCalls)
{
    Task.Factory.StartNew(() =>
    {
        calculating = true;
        Task.Factory.StartNew(() =>
        {
            Task.Delay(3000).Wait();
            if (calculating)
            {
                showingSplash = true;
                //Application.Current.Dispatcher.Invoke(() => show_sphlash());
            }
        });
        Task.WaitAll(expensiveCalls);
        calculating = false;
        if (showingSplash)
        {
            //Application.Current.Dispatcher.Invoke(() => hide_sphlash());
            showingSplash = false;
        }
    }
    );
}
Другие вопросы по тегам