Почему ActivityIndicator изменяет состояние после завершения всего метода?
Я хотел бы показать объект ActivityIndicator после того, как пользователь коснется кнопки входа в систему на странице. К сожалению, для этого существует небольшая проблема, поскольку кажется, что состояние ActivityIndicator изменяется после завершения всего метода. Это код, который я написал до сих пор:
private void Login(object sender, EventArgs ev)
{
BusyIndicator.IsVisible = true; //<- here I want to show indicator
try
{
//some input validation, connection opening etc
ConnectionHandler.OpenConnection(ServerIP, "dmg", false);
}
catch (Exception e)
{
Logging.Error(e.Message, "Connection", e);
}
}
Когда я устанавливаю точку останова после BusyIndicator.IsVisible = true;
в приложении нет абсолютно никаких изменений. Однако я заметил, что когда метод завершен, индикатор отображается. Это правильное поведение этого элемента управления?
Зачем мне это нужно? Потому что проверка поля и соединение с сервером занимает некоторое время, и мне нужно показать пользователю, что что-то происходит в фоновом режиме. Функция входа занимает ~1 сек, поэтому индикатор быстро отображается и скрывается, и я даже не вижу изменений.
Как я могу показать индикатор сразу после нажатия пользователем кнопки?
1 ответ
Ваша проблема в том, что метод Login() выполняется в потоке пользовательского интерфейса. Итак, несмотря на настройку BusyIndicator.IsVisible = true;
поток продолжает выполнять метод для получения данных, поэтому пользовательский интерфейс не отвечает.
Решение, запустите OpenConnection в другом потоке:
private async void Login(object sender, EventArgs ev)
{
BusyIndicator.IsVisible = true; //<- here I want to show indicator
try
{
//some input validation, connection opening etc
await Task.Run(() => { ConnectionHandler.OpenConnection(ServerIP, "dmg", false);});
}
catch (Exception e)
{
Logging.Error(e.Message, "Connection", e);
}
}