Я разрабатываю приложение форм 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));
}
}





Я думаю, это связано со свойством 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>
Я обновил ответ, и вы можете проверить код.
Я попробовал это, я хочу, чтобы индикатор активности накладывался на эту страницу, как всплывающее окно. Вы делите страницу на 2 части, и 1 из них - экран загрузки, 1 из них - моя главная страница. Мне не нужен этот стиль. Я исследовал некоторые из них и обнаружил, что у UserDialogs есть всплывающее окно загрузки. Я использовал этот. Напишу ответ на свой вопрос. Спасибо за ваш быстрый ответ и усилия.
Пожалуйста. Если у вас все еще есть вопрос, вы можете задать его напрямую.
Я нашел очень простой способ получить это «всплывающее окно загрузки». Я собираюсь использовать пакет nuget UserDialogs.
Чтобы отобразить всплывающее окно:
UserDialogs.Instance.ShowLoading("Loading...");
Чтобы скрыть всплывающее окно:
UserDialogs.Instance.HideLoading();
Вы можете использовать этот код перед вызовами API, а затем скрыть его, когда получите результат.
Извините, но это не решает проблему. По-прежнему нижнее свойство stacklayouts isvisible не меняется.