2016-03-23 33 views
5

Ho una pagina di accesso utilizzando uno StackLayout per il contenuto (nome utente, password, pulsante di accesso). Dopo che l'utente fa clic sul pulsante di accesso, desidero impostare un blocco di "caricamento" nel centro assoluto della pagina, in cima al contenuto StackLayout esistente. Per qualche motivo fastidioso, questo non è semplice. Sembra una cosa semplice e comune da fare - come è fatto?Xamarin.Forms - come centrare assolutamente un elemento nella pagina?

risposta

11

Hai utilizzato un tag corretto: AbsoluteLayout.


var loadingView = new StackLayout 
{ 
    Padding = 6, 
    Orientation = StackOrientation.Horizontal, 
    BackgroundColor = Color.Gray, 
    Children = 
    { 
     new ActivityIndicator 
     { 
      Color = Color.White, 
      IsRunning = true, 
      VerticalOptions = LayoutOptions.Center, 
      WidthRequest = 20, 
      HeightRequest = 20 
     }, 
     new Label 
     { 
      TextColor = Color.White, 
      Text = "Loading...", 
      VerticalOptions = LayoutOptions.Center 
     } 
    } 
}; 

var layout = new AbsoluteLayout 
{ 
    Padding = 0, 
    HorizontalOptions = LayoutOptions.FillAndExpand, 
    VerticalOptions = LayoutOptions.FillAndExpand, 
    Children = 
    { 
     { 
      new BoxView {Color = Color.Green}, 
      new Rectangle(0, 0, 1, 1), 
      AbsoluteLayoutFlags.All 
     }, 
     { 
      loadingView, 
      new Rectangle(0.5, 0.5, -1, -1), 
      AbsoluteLayoutFlags.PositionProportional 
     } 
    } 
}; 

O XAML:

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="ArtiSO.LoadingPage"> 
    <ContentPage.Content> 
     <AbsoluteLayout Padding="0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"> 
      <BoxView Color="Lime" AbsoluteLayout.LayoutBounds="0, 0, 1, 1" AbsoluteLayout.LayoutFlags="All" /> 
      <StackLayout Padding="6" Orientation="Horizontal" BackgroundColor="Gray" AbsoluteLayout.LayoutBounds="0.5, 0.5, -1, -1" AbsoluteLayout.LayoutFlags="PositionProportional"> 
       <ActivityIndicator Color="White" IsRunning="true" VerticalOptions="Center" WidthRequest="20" HeightRequest="20" /> 
       <Label TextColor="White" Text="Loading..." VerticalOptions="Center" /> 
      </StackLayout> 
     </AbsoluteLayout> 
    </ContentPage.Content> 
</ContentPage> 

Risultato:

Preview

+0

C'è un modo per farlo senza rendere il livello più alto di un AbsoluteLayout? B/c ora che influisce sul contenuto principale che voglio lì. Ad esempio, se il contenuto principale all'interno di AbsoluteLayout è uno StackLayout, non riesco a centrarlo impostando VerticalOptions e HorizontalOptions su Layout.Center (b/c quelle proprietà non avranno alcun effetto; dovrei impostare i limiti di layout e flag di layout quando si aggiunge il layout dello stack al layout assoluto). – jbyrd

+0

Non sono sicuro di aver capito bene. Se vuoi centrare un bambino in un AbsoluteLayout, puoi farlo fornendo i parametri "bounds" e "flags": https://gist.github.com/lassana/effb87970c54f2097c0f –