Я новичок в 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 нигде, кроме этого.
Любое понимание будет оценено.