ActivityIndicator запускается после нажатия кнопки BackButton

У меня есть страница со списком элементов, и когда некоторые из них выбраны, ActivityIndicator включается и переходит на другую страницу, выключаясь. Когда я нахожусь на этой новой странице и нажимаю кнопку «Назад» на NavigationPage, я возвращаюсь на страницу со списком элементов, но проблема в том, что ActivityIndicator включен (сохраняется). Как я могу это исправить?

[Страница списка]

public partial class ResultadosBuscados : ContentPage
    {
        public ResultadosBuscados(IEnumerable dadosPesquisados)
        {
            IsBusy = false;
            InitializeComponent();
            BindingContext = this;
            ListaBuscados.ItemsSource = dadosPesquisados;

        }

        public void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            IsBusy = true;
            stackActivity.IsVisible = true;
            Envolvido envolvSelec = (Envolvido)e.SelectedItem;
                if (envolvSelec == null)
                    return;

            IsBusy = false;
            stackActivity.IsVisible = false;
            this.Navigation.PushAsync(new EnvolvidoDetalhe(envolvSelec));

            this.ListaBuscados.SelectedItem = null;
        }

    }

[часть кода XAML]

<StackLayout x:Name="stackActivity" IsVisible="False" Padding="12"
            AbsoluteLayout.LayoutFlags="PositionProportional"
            AbsoluteLayout.LayoutBounds="0.5,0.5,-1,-1">
    <Frame Padding="50" OutlineColor="Black" HasShadow="true" AbsoluteLayout.LayoutFlags="PositionProportional" Opacity="0.8" BackgroundColor="Black" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
        <StackLayout>
          <ActivityIndicator  IsRunning="{Binding IsBusy}" Color ="#F4B400"/>
          <Label Text="Aguarde..." TextColor="#F4B400"/>
        </StackLayout>
      </Frame>
  </StackLayout>

person MC Fer    schedule 28.11.2016    source источник
comment
Возможно ли, что вы установили IsBusy = true; где-то на своей EnvolvidoDetalhe странице или в ее ViewModel, и вы никогда не устанавливали его обратно на false до того, как пользователь нажмет кнопку «Назад»? Я бы предложил либо установить IsBusy = false; вEnvolvidoDetalhe.OnDisappearing(), либо сделать это в верхней части ResultadosBuscados.OnAppearing(). Это исправит? Если это так, выясните, где вы устанавливаете IsBusy на true, а не устанавливаете обратно на false.   -  person hvaughan3    schedule 28.11.2016
comment
@hvaughan3 Значение по умолчанию неверно! На других страницах, которые не используют ListView и OnItemSelected, это работает хорошо! Я могу нормально ходить вперед и назад. Проблема возникает только тогда, когда она находится в OnItemSelected! Я попытался выполнить отладку после нажатия кнопки BackButton, но на странице ResultadosBuscados предполагается, что isbusy = false по умолчанию.   -  person MC Fer    schedule 28.11.2016
comment
Я не уверен, сбрасывается ли IsBusy при смене страницы или остается ли IsBusy одним и тем же значением независимо от того, на какую страницу вы переходите. Вы пытались установить IsBusy на false в ResultadosBuscados.OnAppearing()? На самом деле, читая примечания к комментариям IsBusy, он говорит, что установка IsBusy в true на нескольких страницах одновременно приведет к тому, что индикатор глобальной активности будет работать до тех пор, пока оба не будут установлены обратно в false. Задача авторов — снять флаг IsBusy перед очисткой страницы.   -  person hvaughan3    schedule 28.11.2016
comment
Мои ActivityIndicator также всегда связывают IsVisible вот так: <ActivityIndicator IsVisible="{Binding IsBusy}" IsRunning="{Binding IsBusy}" Color ="#F4B400"/>   -  person hvaughan3    schedule 28.11.2016
comment
@hvaughan3 я сделал это! IsVisible={Binding IsBusy} IsRunning={Binding IsBusy}, но не работает. Кроме того, кто такой .OnAppearing()?   -  person MC Fer    schedule 30.11.2016
comment
См. мой ответ ниже для примера переопределения OnAppearing()   -  person hvaughan3    schedule 30.11.2016


Ответы (1)


Как я уже сказал в комментарии, проверьте, где IsBusy устанавливается на true и не устанавливается обратно на false. Привязки не исчезают при изменении страницы и ее резервном копировании.

Кроме того, я нашел этот замечательный код, который хорошо работал для меня большую часть времени и делает так, что вам не нужно беспокоиться о настройке IsBusy на false (хотя имейте в виду, что они делают некоторые причудливые вещи, чтобы это можно было сделать). установленный в ViewModel, вместо этого вы можете добавить код в базу ContentPage, из которой происходят все ваши страницы, если вы не хотите, чтобы он работал в вашей ViewModel).

Код для работы: https://github.com/xamarin/Sport/blob/4abddfab1e1cb0e7d14925aa27cae7685dbd5f38/Sport.Mobile.Shared/ViewModels/BaseViewModel.cs#L138

Пример его использования: https://github.com/xamarin/Sport/blob/04f6b99cec752a106d51566ed96231beacfd2568/Sport.Mobile.Shared/ViewModels/AvailableLeaguesViewModel.cs#L41

*Редактировать:

Пример переопределения OnAppearing:

public partial class ResultadosBuscados : ContentPage {

    public ResultadosBuscados(IEnumerable dadosPesquisados) {
        IsBusy = false;
        InitializeComponent();
        BindingContext = this;
        ListaBuscados.ItemsSource = dadosPesquisados;
    }

    protected override void OnAppearing() {
        base.OnAppearing();
        IsBusy = false;
    }
}
person hvaughan3    schedule 28.11.2016
comment
Нииииииис!! Сработало... Большое спасибо за внимание! - person MC Fer; 30.11.2016
comment
@MCFer Нет проблем, рад помочь. Но, как я уже сказал, если это сработало, это означает, что где-то вы устанавливаете IsBusy на true, а не на false, поэтому вам следует поискать свое решение во всех местах, где вы используете IsBusy, чтобы выяснить, где это может происходить. . - person hvaughan3; 30.11.2016
comment
Я сделал это ! Нет... Возможно, это ошибка, когда есть ViewCell и используется ItemSelected! Потому что на других страницах этого не происходит. Я искал каждый IsBusy. - person MC Fer; 30.11.2016