Ответ 1
Стандартный способ Windows Forms для этого - Cursor.Current = Cursors.WaitCursor;
.
Это работает для вас, или это должно быть изображение?
Да, да. Я знаю, что это 2 совершенно разные технологии. Недавно я перешел на разработку FAT с С# и Windows Forms из веб-разработки. Я всегда думал, что очень просто показать spinner, используя ajaxStart и ajaxStop, поэтому пользователь знает, что что-то происходит и продолжает ждать.
Существует ли простой способ для С# Windows Forms, который можно реализовать глобально? Например, если я запрашиваю DB и жду некоторых результатов, обычно программа перестает отвечать на несколько секунд и затем снова начинает работать после "обработки". Есть ли какой-то глобальный способ отображения счетчика, в то время как моя программа "обрабатывает" вместо того, чтобы идентифицировать все возможные точки в программе, которые могут заставить ее перестать отвечать на запросы и просто срывать новые потоки?
Пожалуйста, дайте мне знать, если я неясен.
Стандартный способ Windows Forms для этого - Cursor.Current = Cursors.WaitCursor;
.
Это работает для вас, или это должно быть изображение?
Можно ли добавить ссылку CodeProject ?
Все, что вам нужно, это построить, перетащить с панели инструментов и использовать. Компонент LoadingCircle
работает без каких-либо проблем. Работает как шарм, вы даже можете его настроить!
Я использую Visual Studio Enterprise 2015. Предлагаемые стили/типы курсора, приведенные здесь, ни один из них не работал со мной.
Тот, кто работает со мной, это:
private async void button_Click(object sender, RoutedEventArgs e)
{
Cursor = Cursors.Wait; // change cursor to hourglass type
ThatProcessThatTookVeryLongTime();
Cursor = Cursors.Arrow; // change cursor to normal type
}
Это то, как я люблю использовать, когда мне нужен курсор ожидания; вместо написания кода try-finally.
#region WaitCursor
public static IDisposable BeginWaitCursorBlock()
{
return ((!_waitCursorIsActive) ? (IDisposable)new waitCursor() : null);
}
private static bool _waitCursorIsActive;
private class waitCursor : IDisposable
{
private Cursor oldCur;
public waitCursor()
{
_waitCursorIsActive = true;
oldCur = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
}
public void Dispose()
{
Cursor.Current = oldCur;
_waitCursorIsActive = false;
}
}
#endregion
Пример использования:
using (BeginWaitCursorBlock())
{
...
}
Если ваша программа перестает отвечать на запросы, это потому, что вы делаете настоящую работу над потоком пользовательского интерфейса. Переместите работу в фоновый поток, отключите взаимодействие с пользовательским интерфейсом по мере необходимости, чтобы пользователь не прикасался к материалу во время выполнения работы, а затем, когда фоновая работа заканчивается, отправляйте результаты обратно в поток пользовательского интерфейса с помощью Control.Invoke, затем обновите свой интерфейс с помощью результаты, а затем снова включить все.
Чтобы внедрить spinner, я использую PictureBox со встроенным gif в нем. Я отключу его, когда пользовательский интерфейс простаивает, и включите его, когда я запускаю фона рабочего.
Альтернативой является изменение курсора мыши на "ожидающий" курсор, который я не большой поклонник.
Перед обработкой: Cursor.Current = Cursors.WaitCursor;
ProcessesSomething();
После обработки: Cursor.Current = Cursors.AppStarting;
да есть.
Легко было сделать два метода утилиты: один для включения индикатора загрузки, а другой - для отключения этого состояния загрузки.
При всех начальных вызовах ajax (или любых других длинных вызовах) автоматически вызывается метод enable.
как только будет запущен неполный обратный вызов, вызовите метод disable из неполного обратного вызова.
Начиная с .NET 4.5 (VS 2015+) вы можете использовать комбинацию async и ждать с Progress для отправки обновлений в поток пользовательского интерфейса: