Как отобразить курсор "Занят" в течение 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;
}
}
);
}