Почему ActivityIndicator изменяет состояние после завершения всего метода? - PullRequest
0 голосов
/ 24 января 2019

Я хотел бы показать объект 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 Ответ

0 голосов
/ 24 января 2019

Ваша проблема в том, что метод 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);
    }
}
...