Как я могу заставить мой индикатор занятости отображаться? (WPF) - PullRequest
7 голосов
/ 16 сентября 2010

Я создал индикатор занятости - в основном анимация вращения логотипа.Я добавил его в окно входа в систему и привязал свойство Visibility к свойству BusyIndicatorVisibility моей viewmodel.

Когда я нажимаю кнопку входа в систему, я хочу, чтобы во время входа в систему отображался счетчик (он вызывает веб-службу, чтобы определить,логин и пароль верны).Однако, когда я устанавливаю видимость видимым, а затем продолжаю вход в систему, счетчик не появляется, пока вход в систему не будет завершен.В старомодном кодировании Winforms я бы добавил Application.DoEvents.Как сделать так, чтобы блесна появилась в WPF в приложении MVVM?

Код:

        private bool Login()
        {
            BusyIndicatorVisibility = Visibility.Visible;
            var result = false;
            var status = GetConnectionGenerator().Connect(_model);
            if (status == ConnectionStatus.Successful)
            {
                result = true;
            }
            else if (status == ConnectionStatus.LoginFailure)
            {
                ShowError("Login Failed");
                Password = "";
            }
            else
            {
                ShowError("Unknown User");
            }
            BusyIndicatorVisibility = Visibility.Collapsed;
            return result;
        }

Ответы [ 3 ]

8 голосов
/ 16 сентября 2010

Вы должны сделать свой логин асинхронным. Вы можете использовать BackgroundWorker , чтобы сделать это. Что-то вроде:

BusyIndicatorVisibility = Visibility.Visible; 
// Disable here also your UI to not allow the user to do things that are not allowed during login-validation
BackgroundWorker bgWorker = new BackgroundWorker() ;
bgWorker.DoWork += (s, e) => {
    e.Result=Login(); // Do the login. As an example, I return the login-validation-result over e.Result.
};
bgWorker.RunWorkerCompleted += (s, e) => {
   BusyIndicatorVisibility = Visibility.Collapsed;  
   // Enable here the UI
   // You can get the login-result via the e.Result. Make sure to check also the e.Error for errors that happended during the login-operation
};
bgWorker.RunWorkerAsync();

Только для полноты: Существует возможность дать интерфейсу пользователя время для обновления до входа в систему. Это сделано над диспетчером. Однако это взлом, и IMO никогда не должен использоваться. Но если вы заинтересованы в этом, вы можете искать в StackOverflow wpf doevents .

2 голосов
/ 16 сентября 2010

Вы можете попытаться запустить индикатор занятости в отдельном потоке, как объясняется в этой статье: Создание индикатора занятости в отдельном потоке в WPF

Или попробуйте запустить новый BusyIndicatorиз расширенного инструментария WPF

Но я вполне уверен, что вам не повезет, если вы не разместите логику в фоновом потоке.

0 голосов
/ 16 сентября 2010

Ваш логин-код выполняется в потоке пользовательского интерфейса?Это может заблокировать обновления данных.

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