Ange storleken på en vy
Det är svårt att utforma ett användargränssnitt som är konsekvent på flera enheter eftersom enheterna kan vara olika storlekar och ha olika pixeltätheter. Tänk på de olika enheter som är tillgängliga: mobil, surfplatta, skrivbord och så vidare. Hur skapar vi ett användargränssnitt som ser likadant ut på var och en?
.NET Multi-Platform App UI (MAUI) innehåller layoutpaneler som hjälper dig att skapa konsekventa användargränssnitt. Layoutpanelen ansvarar för att storleksanpassa och placera vyerna för dess underordnade objekt. I den här lektionen får du lära dig hur layoutsystemet fungerar i .NET MAUI. Vi tittar särskilt på hur vyerna är storleksanpassade som standard och hur du begär en viss storlek och position för en vy vid körning.
Vad är en layoutpanel?
En layoutpanel är en .NET MAUI-container som innehåller en samling underordnade vyer och avgör deras storlek och position. Layoutpanelerna beräknas automatiskt om när appens storlek ändras. till exempel när användaren roterar enheten.
Kommentar
Termen vy eller underordnad vy refererar till en kontroll som placeras på en layoutpanel. En vy kan vara en etikett, en knapp, ett postfält eller någon annan typ av visuellt element som stöds av .NET MAUI.
.NET MAUI har flera layoutpaneler som du kan välja mellan. Varje panel hanterar sina underordnade vyer på olika sätt. Följande bild visar en konceptuell översikt över några av de vanligaste alternativen.
-
StackLayout
: ordnar sina underordnade vyer i en enda rad eller kolumn. FörutomStackLayout
finns det även en optimeradVerticalStackLayout
ochHorizontalStackLayout
när du inte behöver ändra orientering. -
AbsoluteLayout
: ordnar sina underordnade vyer med hjälp av x- och y-koordinater. -
Grid
: ordnar sina underordnade vyer i celler som skapas från skärningspunkten mellan rader och kolumner. -
FlexLayout
: ordnar dess underordnade vyer som enStackLayout
förutom att du kan omsluta dem om de inte får plats i en enda rad eller kolumn.
Kommentar
Det finns också en femte typ av layoutpanel med namnet , RelativeLayout
som gör att du kan ange hur underordnade vyer ska ordnas i förhållande till varandra. Du bör använda FlexLayout
kontrollen i stället för RelativeLayout
eftersom den presterar bättre.
RelativeLayout
ingår i .NET MAUI för bakåtkompatibilitet med äldre Xamarin-appar.
Den typiska processen för att skapa en .NET MAUI-sida är att skapa en layoutpanel och sedan lägga till underordnade vyer i den. När du lägger till en vy i en layout kan du påverka storleken och positionen för den. Panelen har dock det sista inflytandet baserat på dess interna layoutalgoritmer.
Innan du tittar på hur du begär en viss storlek för en vy ska vi se hur layoutsystemstorlekarna visas som standard.
Standardstorlek för en vy
Om du inte anger storleken på en vy blir den automatiskt tillräckligt stor för att passa runt innehållet. Tänk till exempel på det här XAML-språket (Extensible Application Markup Language):
<Label
Text="Hello"
BackgroundColor="Silver"
VerticalOptions="Center"
HorizontalOptions="Center"
FontSize="40"/>
I det här exemplet definieras en etikett för att visa ordet Hello
i en silverbakgrund. Eftersom du inte anger storleken, storleksanpassas etiketten automatiskt för att passa runt ordet Hello
. Följande bild visar etiketten som återges på en Android-enhet:
Kommentar
Du kan ange bakgrundsfärgen för etiketten så att du kan avgöra hur stor den är vid körning. Det här är en bra felsökningsteknik att tänka på när du skapar användargränssnittet.
Ange storleken på en vy
När du skapar ett användargränssnitt är det vanligt att du vill styra storleken på en vy. Anta till exempel att du skapar en inloggningssida och vill att inloggningsknappen ska vara exakt hälften av skärmens bredd. Om du använde standardstorleken för en vy skulle knappen bara vara storleken på texten Logga in. Den storleken är inte tillräckligt stor, så du måste ange storleken själv.
Basklassen View
definierar två egenskaper som påverkar storleken på en vy: WidthRequest
och HeightRequest
.
WidthRequest
låter dig ange bredden och HeightRequest
låter dig ange höjden. Båda egenskaperna är av typen double
.
Här är ett exempel som visar hur du anger en etiketts bredd och höjd i XAML:
<Label
Text="Hello"
BackgroundColor="Silver"
VerticalOptions="Center"
HorizontalOptions="Center"
WidthRequest="100"
HeightRequest="300"
FontSize="40"/>
Resultatet ser ut så här:
Kommentar
Etiketten är fortfarande centrerad, även om texten för etiketten inte är i mitten av etiketten.
En sak som är värd att notera är namnen på dessa egenskaper. Båda egenskaperna innehåller ordbegäran. Det här ordet innebär att layoutpanelen kanske inte respekterar dem vid körning. Layoutpanelen läser dessa värden under storleksberäkningarna och försöker hantera begäranden om det kan. Om det inte finns tillräckligt med utrymme kan layoutpanelen ignorera värdena.
Storleksenheter
När du anger WidthRequest
och HeightRequest
använder du literalvärden som 100
. På .NET MAUI-nivå har dessa värden inte enheter. De är inte punkter eller bildpunkter. Det är bara värden av typen double
. .NET MAUI skickar dessa värden till det underliggande operativsystemet vid körning. Det är operativsystemet som ger den kontext som behövs för att avgöra vad siffrorna betyder:
- I iOS kallas värdena punkter.
- På Android är de densitetsoberoende pixlar.
Renderad storlek för en vy
Eftersom det är upp till layoutpanelen att fastställa storleken på en vy kan du inte använda WidthRequest
och HeightRequest
ange den faktiska storleken vid körning. Anta till exempel att du anger WidthRequest
till 100
för etiketten, men panelen har inte tillräckligt med utrymme för att uppfylla begäran. I stället ger panelen etiketten en bredd på 80
. Om du nu kontrollerar värdet för WidthRequest
egenskapen står 100
det även om det renderade värdet är 80
.
För att lösa det här problemet definierar basklassen View
två andra egenskaper som heter Width
och Height
. Dessa egenskaper är av typen double
och representerar den renderade bredden och höjden på en vy.
Width
Använd egenskaperna och Height
när du hämtar storleken på en vy.
Ange positionen för en vy
Du måste också ange positionen för en vy. Kom till exempel ihåg att i inloggningssidans exempel ville du ändra storleken på inloggningsknappen så att den är hälften så bred som skärmen. Eftersom inloggningsknappen inte är hela skärmens bredd finns det utrymme att flytta runt den. Du kan placera den på vänster sida, på höger sida eller i mitten av skärmen.
Basklassen View
har två egenskaper som du använder för att ange positionen för en vy: VerticalOptions
och HorizontalOptions
. De här inställningarna påverkar hur vyn placeras i den rektangel som tilldelats den av layoutpanelen. Du kan ange att du vill att vyn ska justeras till en av rektangelns fyra kanter. Eller att du vill att den ska uppta hela rektangeln.
Det är svårare att ange ett värde för VerticalOptions
eller HorizontalOptions
än att ange storleken eftersom de är av typen LayoutOptions
.
Vad är typen LayoutAlternativ?
LayoutOptions
är en C#-typ som kapslar in två layoutinställningar Alignment
och Expands
. Båda egenskaperna är relaterade till positionering, men de är inte relaterade till varandra. Så här ser definitionen av typen ut:
public struct LayoutOptions
{
public LayoutAlignment Alignment { get; set; }
public bool Expands { get; set; }
...
}
Sedan tittar vi närmare på Alignment
eftersom det är det vanligaste och mest intuitiva layoutalternativet.
Vad är uppräkning av LayoutAlignment?
LayoutAlignment
är en uppräkning som innehåller fyra värden: Start
, Center
, End
och Fill
. Du kan använda dessa värden för att styra hur den underordnade vyn placeras i den rektangel som den ges av layoutpanelen. Tänk till exempel på följande kod och Android-skärmbild:
<StackLayout>
<Label Text="Start" HorizontalOptions="Start" BackgroundColor="Silver" FontSize="40" />
<Label Text="Center" HorizontalOptions="Center" BackgroundColor="Silver" FontSize="40" />
<Label Text="End" HorizontalOptions="End" BackgroundColor="Silver" FontSize="40"/>
<Label Text="Fill" HorizontalOptions="Fill" BackgroundColor="Silver" FontSize="40"/>
</StackLayout>
I exemplet används en lodrät StackLayout
så att varje underordnad vy får en rad.
HorizontalOptions
bestämmer vyns position inom dess rad.
Vad är Expanderar?
Den andra egenskapen för struct är LayoutOptions
Expands
. Egenskapen Expands
är en bool
som i Xamarin.Forms tillät en vy i en StackLayout
för att begära extra utrymme om det finns något tillgängligt. Den här egenskapen är nu föråldrad och används inte längre i .NET MAUI. Senare utforskar vi hur du uppnår samma typ av utökning i enheten Grid
i layouten.