Sök…


ContentPresenter

En layouthanterare för mallade vyer. Används i ett ControlTemplate för att markera var innehållet som ska presenteras visas.

ContentPresenter Layout (bild av Xamarin)

ContentView

Ett element med ett enda innehåll. ContentView har mycket liten egen användning. Syftet är att tjäna som en basklass för användardefinierade sammansatta vyer.

ContentView Layout (bild av Xamarin)

XAML

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

Koda

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
}
};

Ram

Ett element som innehåller ett enda barn, med några inramningsalternativ. Ram har en standard Xamarin.Forms.Layout.Padding på 20.

Ramlayout (bild av Xamarin)

XAML

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

Koda

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

ScrollView

Ett element som kan rulla om Content kräver det.

ScrollView innehåller layouter och gör det möjligt för dem att bläddra utanför skärmen. ScrollView används också för att tillåta vyer att automatiskt flytta till den synliga delen av skärmen när tangentbordet visas.

ScrollView Layout (bild av Xamarin)

Obs: ScrollViews ska inte kapslas. Dessutom ska ScrollViews inte kapslas med andra kontroller som tillhandahåller rullning, som ListView och WebView .

En ScrollView är lätt att definiera. I XAML:

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

Samma definition i kod:

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

Ett element som visar innehåll med en kontrollmall och basklassen för ContentView .

TemplatedView Layout (bild av Xamarin)

AbsoluteLayout

AbsoluteLayout positioner och -storlekar barnelement som är proportionella mot sin egen storlek och position eller med absoluta värden. Barnvyer kan placeras och dimensioneras med hjälp av proportionella värden eller statiska värden, och proportionella och statiska värden kan blandas.

AbsoluteLayout (bild av Xamarin)

En definition av en AbsoluteLayout i XAML ser ut så här:

<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>

Samma layout skulle se ut så här i kod:

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);

AbsoluteLayout-kontrollen i Xamarin.Forms låter dig ange var exakt på skärmen du vill att barnelementen ska visas, liksom deras storlek och form (gränser).

Det finns några olika sätt att ställa in gränserna för barnelementen baserat på AbsoluteLayoutFlags-uppräkningen som används under denna process. AbsoluteLayoutFlags- uppräkningen innehåller följande värden:

  • Alla : Alla dimensioner är proportionella.
  • HöjdProportionell : Höjden är proportionell mot layouten.
  • Inget : Ingen tolkning görs.
  • PositionProportional : Kombinerar XProportional och YProportional.
  • StorlekProportionell : Kombinerar breddProportionell och HöjdProportionell.
  • BreddProportionell : Bredd är proportionell mot layouten.
  • XProportionell : X-egenskapen är proportionell mot layouten.
  • YProportionell : Y-egenskapen är proportionell mot layouten.

Processen att arbeta med layouten på AbsoluteLayout-behållaren kan tyckas vara lite motsatt i början, men med lite användning kommer den att bli bekant. När du har skapat dina barnelement måste du följa tre steg för att ställa dem på en absolut position i behållaren. Du vill ställa in de flaggor som tilldelats elementen med hjälp av metoden AbsoluteLayout.SetLayoutFlags () . Du kommer också att vilja använda metoden AbsoluteLayout.SetLayoutBounds () för att ge elementen sina gränser. Slutligen vill du lägga till barnelementen i barnkollektionen. Eftersom Xamarin.Forms är ett abstraktionslager mellan Xamarin och de enhetsspecifika implementeringarna, kan positionsvärdena vara oberoende av enhetspixlarna. Det är här de tidigare nämnda layoutflaggorna spelas in. Du kan välja hur layoutprocessen för Xamarin.Forms-kontrollerna ska tolka värdena du definierar.

Rutnät

En layout som innehåller vyer ordnade i rader och kolumner.

Rutnätlayout (bild av Xamarin)

Detta är en typisk Grid i 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>

Samma Grid definierat i kod ser så här ut:

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) });

Så här lägger du till objekt i rutnätet: I 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>

I C # -kod:

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);

För Height och Width ett antal enheter tillgängliga.

  • Auto - storlekar automatiskt för att passa innehåll i raden eller kolumnen. Anges som GridUnitType.Auto i C # eller som Auto i XAML.
  • Proportional - storlekar kolumner och rader som en del av det återstående utrymmet. Anges som ett värde och GridUnitType.Star i C # och som # * i XAML, där # är ditt önskade värde. Om du anger en rad / kolumn med * kommer den att fylla det tillgängliga utrymmet.
  • Absoluta - storlekar kolumner och rader med specifika, fast höjd och breddvärden. Anges som ett värde och GridUnitType.Absolute i C # och som # i XAML, med # som ditt önskade värde.

Obs: Breddvärdena för kolumner ställs in som Auto som standard i Xamarin.Forms, vilket innebär att bredden bestäms utifrån storleken på barnen. Observera att detta skiljer sig från implementeringen av XAML på Microsoft-plattformar, där standardbredden är *, vilket kommer att fylla det tillgängliga utrymmet.

RelativeLayout

En Layout som använder Constraints att utforma sina barn.

RelativeLayout används för att placera och storleksvyer i förhållande till layoutens eller syskonvyernas egenskaper. Till skillnad från AbsoluteLayout har RelativeLayout inte konceptet med det rörliga ankaret och har inte möjligheter att placera element relativt nedre eller högra kanter på layouten. RelativeLayout stöder positioneringselement utanför sina egna gränser.

RelativeLayout (bild av Xamarin)

En RelativeLayout i XAML, är så här:

<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>

Samma layout kan åstadkommas med denna kod:

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 organiserar vyer i en endimensionell linje ("stack"), antingen horisontellt eller vertikalt. Views i en StackLayout kan dimensioneras baserat på utrymmet i layouten med hjälp av layoutalternativ. Positioneringen bestäms av ordningsvyerna som lagts till layouten och layoutalternativen för vyerna.

StackLayout (bild av Xamarin)

Användning i XAML

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

Användning i kod

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow