Индикатор активности не меняет видимое свойство и не показывает всю страницу

Я разрабатываю приложение форм xamarin и хотел добавить отображение состояний «загрузки». Но я столкнулся с этой проблемой прямо сейчас. Когда я открываю эту страницу, отображается нижний стек, но он никогда ничего не меняет и не показывает мою главную страницу.

КСАМЛ:

ContentPage xmlns = "http://xamarin.com/schemas/2014/forms"
         xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local = "clr-namespace:İdaServis.ViewModels"
         x:Class = "İdaServis.View.SamplePage">

<ContentPage.BindingContext>
    <local:SamplePageViewModel/>
</ContentPage.BindingContext>
<ContentPage.Content >
    <StackLayout >
        <Label Text = "Sample Page"
            VerticalOptions = "CenterAndExpand" 
            HorizontalOptions = "CenterAndExpand" />

       
    </StackLayout>
</ContentPage.Content>

<StackLayout IsVisible = "{Binding Isloading}"   VerticalOptions = "CenterAndExpand" HorizontalOptions = "Center" >
    <Label Text = "Yükleniyor..." TextColor = "Black" FontSize = "Medium" />

    <ActivityIndicator  Color = "SpringGreen"  IsRunning = "True" />
</StackLayout>

Я пишу вьюмодель так:

public class SamplePageViewModel : INotifyPropertyChanged
{

    private bool _isloading, showPage;
    
    public SamplePageViewModel ()
    {
        _isloading = true;
        showPage = false;
        manageLoadings();
    }

    private async void manageLoadings()
    {
        await Task.Delay(2500);
        _isloading = false;
        showPage = true;
        OnPropertyChanged();

    }

    public bool Isloading { get => _isloading; set { _isloading = value; OnPropertyChanged(); } }

    public bool ShowPage { get => showPage; set { showPage = value; OnPropertyChanged(); } }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
64
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, это связано со свойством IsRunning.

<ActivityIndicator IsRunning = "true" />

Также проверьте документацию https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/activityindicator

Вы установили неправильный OnPropertyChanged метод.

Сначала вам нужно задать имя метода OnPropertyChanged вот так OnPropertyChanged("Isloading");.

Вот правильный код, на который вы можете сослаться:

  public bool Isloading { get => _isloading; set { _isloading = value; OnPropertyChanged("Isloading"); } }

  public bool ShowPage { get => showPage; set { showPage = value; OnPropertyChanged("ShowPage"); } }

  public event PropertyChangedEventHandler PropertyChanged;
  protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }

Во-вторых, вам следует изменить Isloading вместо _isloading, а также ShowPage.

Вот правильный код:

  private async void manageLoadings()
  {
      await Task.Delay(2500);
      Isloading = false;
      ShowPage = true;
      OnPropertyChanged();

  }

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

Вам нужно поместить все StackLayouts в ContentPage.Content и не размещать элементы за пределами ContentPage.Content. ContentPage можно установить только один раз: если вы разместите элементы за пределами ContentPage.Content, он закроет элементы в старом ContentPage.Content.

Вот код, на который вы можете сослаться:

  <ContentPage.Content >

      <StackLayout>
          <StackLayout IsVisible = "{Binding ShowPage}">
              <Label Text = "Sample Page"
                 VerticalOptions = "CenterAndExpand" 
                 HorizontalOptions = "CenterAndExpand" />
              <Button Clicked = "Button_Clicked"></Button>
          </StackLayout>
          <StackLayout IsVisible = "{Binding Isloading}"   VerticalOptions = "CenterAndExpand" HorizontalOptions = "Center" >
              <Label Text = "Yükleniyor..." TextColor = "Black" FontSize = "Medium" />

              <ActivityIndicator  Color = "SpringGreen"  IsRunning = "True" />
          </StackLayout>
       </StackLayout> 
      
  </ContentPage.Content>

Извините, но это не решает проблему. По-прежнему нижнее свойство stacklayouts isvisible не меняется.

Mert Altiparmak 08.03.2024 07:30

Я обновил ответ, и вы можете проверить код.

Guangyu Bai - MSFT 08.03.2024 07:40

Я попробовал это, я хочу, чтобы индикатор активности накладывался на эту страницу, как всплывающее окно. Вы делите страницу на 2 части, и 1 из них - экран загрузки, 1 из них - моя главная страница. Мне не нужен этот стиль. Я исследовал некоторые из них и обнаружил, что у UserDialogs есть всплывающее окно загрузки. Я использовал этот. Напишу ответ на свой вопрос. Спасибо за ваш быстрый ответ и усилия.

Mert Altiparmak 08.03.2024 09:07

Пожалуйста. Если у вас все еще есть вопрос, вы можете задать его напрямую.

Guangyu Bai - MSFT 08.03.2024 09:12
Ответ принят как подходящий

Я нашел очень простой способ получить это «всплывающее окно загрузки». Я собираюсь использовать пакет nuget UserDialogs.

Чтобы отобразить всплывающее окно:

UserDialogs.Instance.ShowLoading("Loading...");

Чтобы скрыть всплывающее окно:

UserDialogs.Instance.HideLoading();

Вы можете использовать этот код перед вызовами API, а затем скрыть его, когда получите результат.

Другие вопросы по теме