Zoeken…


ContentPresenter

Een lay-outmanager voor sjabloonweergaven. Gebruikt in een ControlTemplate om aan te geven waar de te presenteren inhoud wordt weergegeven.

ContentPresenter Layout (afbeelding door Xamarin)

inhoudAlle

Een element met een enkele inhoud. ContentView heeft heel weinig eigen gebruik. Het doel is om te dienen als een basisklasse voor door de gebruiker gedefinieerde samengestelde weergaven.

ContentView Layout (afbeelding door Xamarin)

XAML

<ContentView>
<Label Text="Hi, I'm a simple Label inside of a simple ContentView"
HorizontalOptions="Center"
VerticalOptions="Center"/>
</ContentView>

Code

var contentView = new ContentView {
Content = new Label {
 Text = "Hi, I'm a simple Label inside of a simple ContentView",
 HorizontalOptions = LayoutOptions.Center,
 VerticalOptions = LayoutOptions.Center
}
};

Kader

Een element met een enkel kind, met enkele kaderopties. Frame hebben een standaard Xamarin.Forms.Layout.Padding van 20.

Frame-indeling (afbeelding door Xamarin)

XAML

<Frame>
<Label Text="I've been framed!"
HorizontalOptions="Center"
VerticalOptions="Center" />
</Frame>

Code

var frameView = new Frame {
Content = new Label {
 Text = "I've been framed!",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center
},
OutlineColor = Color.Red
};

ScrollView

Een element dat kan scrollen als het Content vereist.

ScrollView bevat lay-outs en stelt hen in staat om offscreen te scrollen. ScrollView wordt ook gebruikt om weergaven automatisch naar het zichtbare gedeelte van het scherm te verplaatsen wanneer het toetsenbord wordt weergegeven.

ScrollView-indeling (afbeelding door Xamarin)

Opmerking: ScrollViews mogen niet worden genest. Bovendien mogen ScrollViews niet worden genest met andere besturingselementen die scrollen bieden, zoals ListView en WebView .

Een ScrollView is eenvoudig te definiëren. In XAML:

<ContentPage.Content>
    <ScrollView>
        <StackLayout>
            <BoxView BackgroundColor="Red" HeightRequest="600" WidthRequest="150" />
            <Entry />
        </StackLayout>
    </ScrollView>
</ContentPage.Content>

Dezelfde definitie in code:

var scroll = new ScrollView();
Content = scroll;
var stack = new StackLayout();
stack.Children.Add(new BoxView { BackgroundColor = Color.Red,   HeightRequest = 600, WidthRequest = 600 });
stack.Children.Add(new Entry());

TemplatedView

Een element dat inhoud weergeeft met een besturingssjabloon en de basisklasse voor ContentView .

TemplatedView Layout (afbeelding door Xamarin)

AbsoluteLayout

AbsoluteLayout posities en maten onderliggende elementen evenredig met zijn eigen grootte en positie of door absolute waarden. Onderliggende weergaven kunnen worden gepositioneerd en gedimensioneerd met behulp van proportionele waarden of statische waarden, en proportionele en statische waarden kunnen worden gemengd.

AbsoluteLayout (afbeelding door Xamarin)

Een definitie van een AbsoluteLayout in XAML ziet er zo uit:

<AbsoluteLayout>
    <Label Text="I'm centered on iPhone 4 but no other device"
        AbsoluteLayout.LayoutBounds="115,150,100,100" LineBreakMode="WordWrap"  />
    <Label Text="I'm bottom center on every device."
        AbsoluteLayout.LayoutBounds=".5,1,.5,.1" AbsoluteLayout.LayoutFlags="All"
        LineBreakMode="WordWrap"  />
    <BoxView Color="Olive"  AbsoluteLayout.LayoutBounds="1,.5, 25, 100"
        AbsoluteLayout.LayoutFlags="PositionProportional" />
    <BoxView Color="Red" AbsoluteLayout.LayoutBounds="0,.5,25,100"
        AbsoluteLayout.LayoutFlags="PositionProportional" />
    <BoxView Color="Blue" AbsoluteLayout.LayoutBounds=".5,0,100,25"
        AbsoluteLayout.LayoutFlags="PositionProportional" />
    <BoxView Color="Blue" AbsoluteLayout.LayoutBounds=".5,0,1,25"
        AbsoluteLayout.LayoutFlags="PositionProportional, WidthProportional" />
</AbsoluteLayout>

Dezelfde lay-out zou er in code als volgt uitzien:

Title = "Absolute Layout Exploration - Code";
var layout = new AbsoluteLayout();

var centerLabel = new Label {
Text = "I'm centered on iPhone 4 but no other device.",
LineBreakMode = LineBreakMode.WordWrap};

AbsoluteLayout.SetLayoutBounds (centerLabel, new Rectangle (115, 159, 100, 100));
// No need to set layout flags, absolute positioning is the default

var bottomLabel = new Label { Text = "I'm bottom center on every device.", LineBreakMode = LineBreakMode.WordWrap };
AbsoluteLayout.SetLayoutBounds (bottomLabel, new Rectangle (.5, 1, .5, .1));
AbsoluteLayout.SetLayoutFlags (bottomLabel, AbsoluteLayoutFlags.All);

var rightBox = new BoxView{ Color = Color.Olive };
AbsoluteLayout.SetLayoutBounds (rightBox, new Rectangle (1, .5, 25, 100));
AbsoluteLayout.SetLayoutFlags (rightBox, AbsoluteLayoutFlags.PositionProportional);

var leftBox = new BoxView{ Color = Color.Red };
AbsoluteLayout.SetLayoutBounds (leftBox, new Rectangle (0, .5, 25, 100));
AbsoluteLayout.SetLayoutFlags (leftBox, AbsoluteLayoutFlags.PositionProportional);

var topBox = new BoxView{ Color = Color.Blue };
AbsoluteLayout.SetLayoutBounds (topBox, new Rectangle (.5, 0, 100, 25));
AbsoluteLayout.SetLayoutFlags (topBox, AbsoluteLayoutFlags.PositionProportional);

var twoFlagsBox = new BoxView{ Color = Color.Blue };
AbsoluteLayout.SetLayoutBounds (topBox, new Rectangle (.5, 0, 1, 25));
AbsoluteLayout.SetLayoutFlags (topBox, AbsoluteLayoutFlags.PositionProportional | AbsoluteLayout.WidthProportional);

layout.Children.Add (bottomLabel);
layout.Children.Add (centerLabel);
layout.Children.Add (rightBox);
layout.Children.Add (leftBox);
layout.Children.Add (topBox);

Met het besturingselement AbsoluteLayout in Xamarin.Forms kunt u opgeven waar precies op het scherm de onderliggende elementen moeten worden weergegeven, evenals hun grootte en vorm (grenzen).

Er zijn een paar verschillende manieren om de grenzen van de onderliggende elementen in te stellen op basis van de opsomming van AbsoluteLayoutFlags die tijdens dit proces worden gebruikt. De opsomming van AbsoluteLayoutFlags bevat de volgende waarden:

  • Alle : alle afmetingen zijn evenredig.
  • HeightProportional: Hoogte is evenredig met de lay-out.
  • Geen : er wordt geen interpretatie uitgevoerd.
  • PositionProportional : combineert XProportional en YProportional.
  • Grootteproportioneel : combineert breedteproportioneel en hoogteproportioneel.
  • WidthProportional: breedte is evenredig met de lay-out.
  • XProportional : X eigenschap is evenredig met de lay-out.
  • YProportional : Y-eigenschap is evenredig met de lay-out.

Het proces van werken met de lay-out van de AbsoluteLayout-container lijkt op het eerste gezicht misschien een beetje intuïtief, maar met een beetje gebruik komt het bekend voor. Nadat u uw onderliggende elementen hebt gemaakt, moet u drie stappen volgen om ze op een absolute positie in de container te plaatsen. U wilt de vlaggen instellen die aan de elementen zijn toegewezen met de methode AbsoluteLayout.SetLayoutFlags () . U wilt ook de methode AbsoluteLayout.SetLayoutBounds () gebruiken om de elementen hun grenzen te geven. Ten slotte wilt u de onderliggende elementen toevoegen aan de collectie Kinderen. Aangezien Xamarin.Forms een abstractielaag is tussen Xamarin en de apparaatspecifieke implementaties, kunnen de positionele waarden onafhankelijk zijn van de apparaatpixels. Hier komen de eerder genoemde layoutvlaggen om de hoek kijken. U kunt kiezen hoe het lay-outproces van de Xamarin.Forms-besturingselementen de waarden moet interpreteren die u definieert.

rooster

Een lay-out met weergaven gerangschikt in rijen en kolommen.

Grid Layout (afbeelding door Xamarin)

Dit is een typische Grid in XAML.

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="2*" />
    <RowDefinition Height="*" />
    <RowDefinition Height="200" />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
    
  <ContentView Grid.Row="0" Grid.Column="0"/>
  <ContentView Grid.Row="1" Grid.Column="0"/>
  <ContentView Grid.Row="2" Grid.Column="0"/>

  <ContentView Grid.Row="0" Grid.Column="1"/>
  <ContentView Grid.Row="1" Grid.Column="1"/>
  <ContentView Grid.Row="2" Grid.Column="1"/>

</Grid>

Hetzelfde Grid gedefinieerd in code ziet er zo uit:

var grid = new Grid();
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength(2, GridUnitType.Star) });
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength (1, GridUnitType.Star) });
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength(200)});
grid.ColumnDefinitions.Add (new ColumnDefinition{ Width = new GridLength (200) });

Items toevoegen aan het raster: In XAML :

<Grid>
      
   <--DEFINITIONS...--!>
        
   <ContentView Grid.Row="0" Grid.Column="0"/>
   <ContentView Grid.Row="1" Grid.Column="0"/>
   <ContentView Grid.Row="2" Grid.Column="0"/>

   <ContentView Grid.Row="0" Grid.Column="1"/>
   <ContentView Grid.Row="1" Grid.Column="1"/>
   <ContentView Grid.Row="2" Grid.Column="1"/>

</Grid>

In C # code:

var grid = new Grid();
//DEFINITIONS...
var topLeft = new Label { Text = "Top Left" };
var topRight = new Label { Text = "Top Right" };
var bottomLeft = new Label { Text = "Bottom Left" };
var bottomRight = new Label { Text = "Bottom Right" };
grid.Children.Add(topLeft, 0, 0);
grid.Children.Add(topRight, 0, 1);
grid.Children.Add(bottomLeft, 1, 0);
grid.Children.Add(bottomRight, 1, 1);

Voor Height en Width een aantal eenheden beschikbaar.

  • Auto - past automatisch de grootte aan zodat deze in de rij of kolom past. Opgegeven als GridUnitType.Auto in C # of als Auto in XAML.
  • Proportioneel - maten kolommen en rijen als een deel van de resterende ruimte. Opgegeven als een waarde en GridUnitType.Star in C # en als # * in XAML, waarbij # de gewenste waarde is. Als u één rij / kolom opgeeft met *, vult deze de beschikbare ruimte.
  • Absoluut - maten kolommen en rijen met specifieke, vaste hoogte- en breedtewaarden. Opgegeven als een waarde en GridUnitType.Absolute in C # en als # in XAML, waarbij # de gewenste waarde is.

Opmerking: de breedtewaarden voor kolommen zijn standaard ingesteld op Auto in Xamarin.Forms, wat betekent dat de breedte wordt bepaald op basis van de grootte van de kinderen. Merk op dat dit verschilt van de implementatie van XAML op Microsoft-platforms, waar de standaardbreedte * is, die de beschikbare ruimte zal vullen.

Relatieve layout

Een Layout die Constraints gebruikt om de Constraints te maken.

RelativeLayout wordt gebruikt om weergaven te positioneren en te formaat ten opzichte van eigenschappen van de lay-out of broer- of zusweergaven. In tegenstelling tot AbsoluteLayout heeft RelativeLayout niet het concept van het bewegende anker en heeft het geen voorzieningen voor het positioneren van elementen ten opzichte van de onderste of rechter randen van de lay-out. RelativeLayout ondersteunt positioneringselementen buiten zijn eigen grenzen.

RelativeLayout (afbeelding door Xamarin)

Een RelativeLayout in XAML is als volgt:

<RelativeLayout>
    <BoxView Color="Red" x:Name="redBox"
        RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,
            Property=Height,Factor=.15,Constant=0}"
        RelativeLayout.WidthConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Width,Factor=1,Constant=0}"
        RelativeLayout.HeightConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Height,Factor=.8,Constant=0}" />
    <BoxView Color="Blue"
        RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView,
            ElementName=redBox,Property=Y,Factor=1,Constant=20}"
        RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView,
            ElementName=redBox,Property=X,Factor=1,Constant=20}"
        RelativeLayout.WidthConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Width,Factor=.5,Constant=0}"
        RelativeLayout.HeightConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Height,Factor=.5,Constant=0}" />
</RelativeLayout>

Dezelfde lay-out kan worden bereikt met deze code:

layout.Children.Add (redBox, Constraint.RelativeToParent ((parent) => {
        return parent.X;
    }), Constraint.RelativeToParent ((parent) => {
        return parent.Y * .15;
    }), Constraint.RelativeToParent((parent) => {
        return parent.Width;
    }), Constraint.RelativeToParent((parent) => {
        return parent.Height * .8;
    }));
layout.Children.Add (blueBox, Constraint.RelativeToView (redBox, (Parent, sibling) => {
        return sibling.X + 20;
    }), Constraint.RelativeToView (blueBox, (parent, sibling) => {
        return sibling.Y + 20;
    }), Constraint.RelativeToParent((parent) => {
        return parent.Width * .5;
    }), Constraint.RelativeToParent((parent) => {
        return parent.Height * .5;
    }));

stackLayout

StackLayout organiseert weergaven in een eendimensionale lijn ("stapel"), horizontaal of verticaal. Views in een StackLayout kunnen worden aangepast aan de ruimte in de lay-out met behulp van lay- StackLayout . De positionering wordt bepaald door de orderweergaven die aan de lay-out zijn toegevoegd en de lay-outopties van de weergaven.

StackLayout (afbeelding door Xamarin)

Gebruik in XAML

<StackLayout>
    <Label Text="This will be on top" />
    <Button Text="This will be on the bottom" />
</StackLayout>

Gebruik in code

StackLayout stackLayout = new StackLayout
{
    Spacing = 0,
    VerticalOptions = LayoutOptions.FillAndExpand,
    Children = 
    {
        new Label
        {
            Text = "StackLayout",
            HorizontalOptions = LayoutOptions.Start
        },
        new Label
        {
            Text = "stacks its children",
            HorizontalOptions = LayoutOptions.Center
        },
        new Label
        {
            Text = "vertically",
            HorizontalOptions = LayoutOptions.End
        },
        new Label
        {
            Text = "by default,",
            HorizontalOptions = LayoutOptions.Center
        },
        new Label
        {
            Text = "but horizontal placement",
            HorizontalOptions = LayoutOptions.Start
        },
        new Label
        {
            Text = "can be controlled with",
            HorizontalOptions = LayoutOptions.Center
        },
        new Label
        {
            Text = "the HorizontalOptions property.",
            HorizontalOptions = LayoutOptions.End
        },
        new Label
        {
            Text = "An Expand option allows one or more children " +
                   "to occupy the an area within the remaining " +
                   "space of the StackLayout after it's been sized " +
                   "to the height of its parent.",
            VerticalOptions = LayoutOptions.CenterAndExpand,
            HorizontalOptions = LayoutOptions.End
        },
        new StackLayout
        {
            Spacing = 0,
            Orientation = StackOrientation.Horizontal,
            Children = 
            {
                new Label
                {
                    Text = "Stacking",
                },
                new Label
                {
                    Text = "can also be",
                    HorizontalOptions = LayoutOptions.CenterAndExpand
                },
                new Label
                {
                    Text = "horizontal.",
                },
            }
        }
    }
};


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow