2016-03-23 3 views
2

Я создал индикатор активности и добавил его в StackLayout, и когда я его запускаю, в эмуляторе он отображается в правом верхнем углу Android 4.4, а в iOS no show и на телефоне Android 6 он не отображается.Как показать ActivityIndicator в середине экрана?

var indicator = new ActivityIndicator() 
      { 
       Color = Color.Blue, 
      }; 
      indicator.SetBinding(ActivityIndicator.IsVisibleProperty, "IsBusy", BindingMode.OneWay); 
      indicator.SetBinding(ActivityIndicator.IsRunningProperty, "IsBusy", BindingMode.OneWay); 
AbsoluteLayout.SetLayoutFlags(indicator, AbsoluteLayoutFlags.PositionProportional); 
      AbsoluteLayout.SetLayoutBounds(indicator, new Rectangle(0.5, 0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize)); 
mainLayout.Children.Add(indicator); 

Я хочу показать индикатор активности в центре экрана, потому что для завершения операции требуется время.

ответ

8

Индикатор, который вы видите в строке состояния, является поведением свойства IsBusy базового класса страницы. Причина, по которой ваш код не работает, заключается в том, что вы пытаетесь связать видимость своего ActivityIndicator с этим свойством, но вы не указали источник привязки. Если вы посмотрите в журнале вывода приложения отладчика, вы, вероятно, увидите сообщения в строках «Свойство IsBusy», не найденное в типе «Объект».

Чтобы исправить это, вам просто нужно указать контекст привязки каждого привязки к форме. Задайте этот вопрос:

public partial class App : Application 
{ 
    public App() 
    { 
     var mainLayout = new AbsoluteLayout(); 
     MainPage = new ContentPage { 
      Content = mainLayout 
     }; 

     var containerPage = Application.Current.MainPage; 

     var indicator = new ActivityIndicator() { 
      Color = Color.Blue, 
     }; 
     indicator.SetBinding(VisualElement.IsVisibleProperty, new Binding("IsBusy", BindingMode.OneWay, source: containerPage)); 
     indicator.SetBinding(ActivityIndicator.IsRunningProperty, new Binding("IsBusy", BindingMode.OneWay, source: containerPage)); 
     AbsoluteLayout.SetLayoutFlags(indicator, AbsoluteLayoutFlags.PositionProportional); 
     AbsoluteLayout.SetLayoutBounds(indicator, new Rectangle(0.5, 0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize)); 
     mainLayout.Children.Add(indicator); 

     containerPage.IsBusy = true; 
    } 
} 
0

Вы добавляете индикатор активности в макет стека, но вы устанавливаете Абсолютный макет LayoutFlags, они не будут работать.

, чтобы быть в состоянии добиться того, что вы хотите, вам нужно сосать структурировать

AbsoluteLayout 
     StackLayout 
     ActivityIndicator 

mainLayout должен быть AbsoluteLayout, все содержание должно содержаться в вложен StackLayout.

Смежные вопросы