Показывать счетчик, пока программа Windows Forms выполняет «обработку», похожую на ajaxStart / ajaxStop? - PullRequest
19 голосов
/ 25 января 2012

Да, да.Я знаю, что это две совершенно разные технологии.Недавно я перешел к разработке FAT с использованием C # и Windows Forms.Я всегда думал, что было очень легко показать счетчик с помощью ajaxStart и ajaxStop, поэтому пользователь знает, что что-то происходит, и продолжает ждать.

Существует ли такой же простой метод для C # Windows Forms, который может быть реализован глобально?Например, если я запрашиваю БД и жду каких-то результатов, обычно программа перестает отвечать на запросы в течение нескольких секунд, а затем снова начинает работать после «обработки».Есть ли какой-нибудь глобальный способ отображения спиннера, пока моя программа «обрабатывает» вместо определения всех возможных точек в программе, которые могут привести к тому, что она перестает отвечать и просто отрывает новые потоки?

Пожалуйста, дайте мне знатьесли мне неясно.

Ответы [ 8 ]

48 голосов
/ 25 января 2012

Стандартный способ Windows Forms: Cursor.Current = Cursors.WaitCursor;.

Это работает для вас, или это должен быть образ?

11 голосов
/ 16 июня 2016

Я использую 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
}
10 голосов
/ 13 марта 2013

Могу ли я добавить этот CodeProject ссылка ?

Все, что вам нужно, это построить, перетащить с панели инструментов и использовать. Компонент LoadingCircle работает без каких-либо проблем. Работает как шарм, вы даже можете настроить его!

5 голосов
/ 22 октября 2016

Это то, что мне нравится использовать, когда мне нужен курсор ожидания; вместо написания кода для попытки.

    #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())
{
  ...
}
1 голос
/ 30 декабря 2015

до обработки: Cursor.Current = Cursors.WaitCursor;

ProcessesSomething ();

После обработки: Cursor.Current = Cursors.AppStarting;

1 голос
/ 25 января 2012

Если ваша программа перестает отвечать на запросы, то это потому, что вы действительно работаете с потоком пользовательского интерфейса. Переместите работу в фоновый поток, при необходимости отключите взаимодействие с пользовательским интерфейсом, чтобы пользователь не касался чего-либо во время выполнения работы, затем, когда фоновая работа завершится, переправьте результаты обратно в поток пользовательского интерфейса с помощью Control.Invoke, а затем обновите пользовательский интерфейс с результатов, затем снова включите все.

Для реализации прядильщика я использую PictureBox с гифкой прядильщика в нем. Я отключаю его, когда пользовательский интерфейс простаивает, и включаю его, когда запускаю фоновый рабочий.

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

0 голосов
/ 24 марта 2017

Начиная с .NET 4.5 (VS 2015+), вы можете использовать сочетание асинхронности и ожидания с Progress для отправки обновлений в поток пользовательского интерфейса:

нажмите, чтобы открыть Похожие статьи

0 голосов
/ 25 января 2012

да, есть.

Легко было сделать два служебных метода, один для включения индикатора "загрузка", а другой для отключения этого состояния загрузки.

При всех начальных ajaxвызовы (или любые другие длительные вызовы) автоматически вызывают метод enable.

, как только сработает обратный вызов oncomplete, вызовите метод disable из обратного вызова oncomplete.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...