Загрузчик не запускается во время работы приложения - PullRequest
0 голосов
/ 07 января 2019

Я новичок в WPF и создаю приложение, использующее элемент управления Mahapps ProgressRing для отображения анимации загрузки во время процесса входа в систему и последующего извлечения данных.

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

В моей ViewModel есть свойство для привязки флага ProgressRing IsActive:

private bool loaderActive;
    public bool LoaderActive
    {
        get { return loaderActive; }
        set
        {
            loaderActive = value;
            RaisePropertyChangedEvent("LoaderActive");
        }
    }

Элемент управления XAML в представлении:

<Controls:ProgressRing IsActive="{Binding LoaderActive}" Panel.ZIndex="1"/>

Метод в той же ViewModel, которая запускается из команды кнопки, имеет флаг loaderActive, установленный на true, а затем определяет BackgroundWorker для работы с процессами, во время которых я хочу, чтобы загрузчик показывал:

private void Login()
    {
        loaderActive = true;

        bwLogin = new BackgroundWorker();
        bwLogin.DoWork += BwLogin_DoWork;
        bwLogin.RunWorkerCompleted += BwLogin_RunWorkerCompleted;

        if (!bwLogin.IsBusy)
            bwLogin.RunWorkerAsync();
    }

Метод запускает и вызывает часть DoWork:

private void BwLogin_DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(5000); // making sure this takes longer
        var token = ServerDataRepo.GetAuthorizationToken(userName, password);

        if (!string.IsNullOrEmpty(token.Token))
        {
            GetServerList(token.Token);
        }
    }

Наконец, я отключаю загрузчик в другом событии:

private void BwLogin_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        loaderActive = false;
    }

Моя ViewModel наследует от:

public abstract class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChangedEvent(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

А загрузчик не показывает, когда должен. Я попробовал привязку TwoWay в XAML (которая в любом случае не нужна), попытался реализовать процесс выгрузки в другой поток, используя async Task методы вместо BackgroundWorker, попытался включить загрузчик loaderActive = true; в конструкторе ViewModel, просто чтобы убедиться в этом на самом деле работает - это работает, так что привязка работает.

Я также попытался заменить элемент управления простым TextBLock с его текстовым значением, связанным со свойством ViewModel, которое я затем заполнил аналогичным образом - тоже не показывается.

Поток пользовательского интерфейса не заблокирован - я проверил. И, насколько я могу судить, я устанавливаю свойство loaderActive в потоке пользовательского интерфейса - я не использую BackgroundWorker нигде, кроме этого.

Любое понимание будет оценено.

1 Ответ

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

Решение от elgonzo:

Обратите внимание, что установщик свойства выполняется только во время присвоения значения свойству. Выполнение присваивания непосредственно вспомогательному полю свойства не будет выполнять установку свойства (естественно, поскольку само свойство не задействуется, если вы непосредственно манипулируете полем). Если установщик свойства не выполняется, PropertyChangedEvent не вызывается, и, следовательно, привязка не обновляет ProgressRing.IsActive ... - elgonzo

Изменено присвоение свойству bool LoaderActive, и оно сработало.

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