Layouts
Layoutklassen der .NET Multi-Platform App UI (.NET MAUI) ermöglichen ihnen das Anordnen und Gruppieren von UI-Steuerelementen in Ihrer Anwendung. Das Auswählen einer Layoutklasse erfordert Kenntnisse darüber, wie das Layout seine untergeordneten Elemente positioniert und wie das Layout seine untergeordneten Elemente ändert. Darüber hinaus kann es erforderlich sein, Layouts zu verschachteln, um Das gewünschte Layout zu erstellen.
StackLayout
A StackLayout organisiert Elemente in einem eindimensionalen Stapel, entweder horizontal oder vertikal. Die Orientation
Eigenschaft gibt die Richtung der Elemente an, und die Standardausrichtung ist Vertical
. StackLayout wird in der Regel verwendet, um einen Unterabschnitt der Benutzeroberfläche auf einer Seite anzuordnen.
Der folgende XAML-Code zeigt, wie Sie eine vertikale Struktur StackLayout erstellen, die drei Label Objekte enthält:
<StackLayout Margin="20,35,20,25">
<Label Text="The StackLayout has its Margin property set, to control the rendering position of the StackLayout." />
<Label Text="The Padding property can be set to specify the distance between the StackLayout and its children." />
<Label Text="The Spacing property can be set to specify the distance between views in the StackLayout." />
</StackLayout>
Wenn die Größe eines Elements in einem StackLayoutElement nicht explizit festgelegt ist, wird es erweitert, um die verfügbare Breite oder Höhe auszufüllen, wenn die Orientation
Eigenschaft auf Horizontal
".
A StackLayout wird häufig als übergeordnetes Layout verwendet, das andere untergeordnete Layouts enthält. Es sollte jedoch nicht verwendet werden, StackLayout um ein Grid Layout mithilfe einer Kombination von StackLayout Objekten zu reproduzieren. Der folgende Code zeigt ein Beispiel für diese fehlerhafte Vorgehensweise:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Details.HomePage"
Padding="0,20,0,0">
<StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Name:" />
<Entry Placeholder="Enter your name" />
</StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Age:" />
<Entry Placeholder="Enter your age" />
</StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Occupation:" />
<Entry Placeholder="Enter your occupation" />
</StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Address:" />
<Entry Placeholder="Enter your address" />
</StackLayout>
</StackLayout>
</ContentPage>
Dies ist Vergeudung, da unnötige Layoutberechnungen durchgeführt werden. Stattdessen kann das gewünschte Layout mithilfe eines Grid.
Weitere Informationen finden Sie unter StackLayout.
HorizontalStackLayout
Ein HorizontalStackLayout organisiert untergeordnete Ansichten in einem eindimensionalen horizontalen Stapel und ist eine leistungsfähigere Alternative zu einem StackLayout. HorizontalStackLayout wird in der Regel verwendet, um einen Unterabschnitt der Benutzeroberfläche auf einer Seite anzuordnen.
Der folgende XAML-Code zeigt, wie Sie eine HorizontalStackLayout mit unterschiedlichen untergeordneten Ansichten erstellen:
<HorizontalStackLayout Margin="20">
<Rectangle Fill="Red"
HeightRequest="30"
WidthRequest="30" />
<Label Text="Red"
FontSize="18" />
</HorizontalStackLayout>
Wenn die Größe eines Elements in einem HorizontalStackLayoutElement nicht explizit festgelegt ist, wird es erweitert, um die verfügbare Höhe auszufüllen.
Weitere Informationen finden Sie unter HorizontalStackLayout.
VerticalStackLayout
Ein VerticalStackLayout organisiert untergeordnete Ansichten in einem eindimensionalen vertikalen Stapel und ist eine leistungsfähigere Alternative zu einem StackLayout. VerticalStackLayout wird in der Regel verwendet, um einen Unterabschnitt der Benutzeroberfläche auf einer Seite anzuordnen.
Der folgende XAML-Code zeigt, wie Sie ein VerticalStackLayout enthaltende drei Label Objekte erstellen:
<VerticalStackLayout Margin="20,35,20,25">
<Label Text="The VericalStackLayout has its Margin property set, to control the rendering position of the VerticalStackLayout." />
<Label Text="The Padding property can be set to specify the distance between the VerticalStackLayout and its children." />
<Label Text="The Spacing property can be set to specify the distance between views in the VerticalStackLayout." />
</VerticalStackLayout>
Wenn die Größe eines Elements in einem VerticalStackLayoutElement nicht explizit festgelegt ist, wird es erweitert, um die verfügbare Breite auszufüllen.
Weitere Informationen finden Sie unter VerticalStackLayout.
Grid
A Grid wird zum Anzeigen von Elementen in Zeilen und Spalten verwendet, die proportionale oder absolute Größen aufweisen können. Die Zeilen und Spalten eines Rasters werden mit den RowDefinitions
Und-Eigenschaften ColumnDefinitions
angegeben.
Verwenden Sie die Grid.Column
Grid.Row
angefügten Eigenschaften, um Elemente in bestimmten Grid Zellen zu positionieren. Verwenden Sie die Grid.RowSpan
Grid.ColumnSpan
angefügten Eigenschaften, um Elemente über mehrere Zeilen und Spalten hinweg zu verteilen.
Hinweis
Ein Grid Layout sollte nicht mit Tabellen verwechselt werden und ist nicht für die Darstellung tabellarischer Daten vorgesehen.
Der folgende XAML-Code zeigt, wie Sie eine Grid mit zwei Zeilen und zwei Spalten erstellen:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Text="Column 0, Row 0"
WidthRequest="200" />
<Label Grid.Column="1"
Text="Column 1, Row 0" />
<Label Grid.Row="1"
Text="Column 0, Row 1" />
<Label Grid.Column="1"
Grid.Row="1"
Text="Column 1, Row 1" />
</Grid>
In diesem Beispiel funktioniert die Größenanpassung wie folgt:
- Jede Zeile hat eine explizite Höhe von 50 geräteunabhängigen Einheiten.
- Die Breite der ersten Spalte ist auf
Auto
und ist daher für die untergeordneten Elemente so breit wie erforderlich. In diesem Fall ist es 200 geräteunabhängige Einheiten breit, um die Breite des ersten Labelzu berücksichtigen.
Platz kann innerhalb einer Spalte oder Zeile mithilfe der automatischen Größenanpassung verteilt werden, wodurch Spalten und Zeilengröße an ihren Inhalt angepasst werden können. Dies wird erreicht, indem die Höhe eines RowDefinition
oder der Breite eines ColumnDefinition
, auf Auto
. Proportionale Größenanpassung kann auch verwendet werden, um den verfügbaren Platz zwischen den Zeilen und Spalten des Rasters nach gewichteten Proportionen zu verteilen. Dies wird erreicht, indem die Höhe eines RowDefinition
oder der Breite eines Elements ColumnDefinition
auf einen Wert festgelegt wird, der den *
Operator verwendet.
Achtung
Versuchen Sie, sicherzustellen, dass so wenige Zeilen und Spalten wie möglich auf Auto
Größe festgelegt sind. Durch jede Zeile oder Spalte, deren Größe automatisch angepasst wird, wird verursacht, dass die Layout-Engine zusätzliche Layoutberechnungen durchführt. Verwenden Sie stattdessen wenn möglich Zeilen und Spalten mit festen Größen. Legen Sie alternativ Zeilen und Spalten so fest, dass sie einen proportionalen Abstand mit dem GridUnitType.Star
Enumerationswert belegen.
Weitere Informationen finden Sie unter "Grid".
FlexLayout
Ein FlexLayout Element ähnelt einem StackLayout Element, in dem untergeordnete Elemente entweder horizontal oder vertikal in einem Stapel angezeigt werden. Eine FlexLayout kann die untergeordneten Elemente jedoch auch umschließen, wenn zu viele vorhanden sind, um in eine einzelne Zeile oder Spalte passen, und ermöglicht außerdem eine genauere Kontrolle der Größe, Ausrichtung und Ausrichtung der untergeordneten Elemente.
Der folgende XAML-Code zeigt, wie Sie eine FlexLayout Ansicht erstellen, die ihre Ansichten in einer einzelnen Spalte anzeigt:
<FlexLayout Direction="Column"
AlignItems="Center"
JustifyContent="SpaceEvenly">
<Label Text="FlexLayout in Action" />
<Button Text="Button" />
<Label Text="Another Label" />
</FlexLayout>
In diesem Beispiel funktioniert das Layout wie folgt:
- Die
Direction
Eigenschaft ist aufColumn
", wodurch die untergeordneten Elemente FlexLayout in einer einzelnen Spalte von Elementen angeordnet werden. - Die
AlignItems
Eigenschaft ist aufCenter
festgelegt, wodurch jedes Element horizontal zentriert wird. - Die
JustifyContent
Eigenschaft ist aufSpaceEvenly
", die den gesamten vertikalen Abstand gleichmäßig zwischen allen Elementen und oberhalb des ersten Elements und unterhalb des letzten Elements zuweist.
Weitere Informationen finden Sie unter FlexLayout.
AbsoluteLayout
Es AbsoluteLayout wird verwendet, um Elemente mithilfe expliziter Werte oder Werte relativ zur Größe des Layouts zu positionieren und zu verknennen. Die Position wird durch die obere linke Ecke des untergeordneten Elements relativ zur oberen linken Ecke des untergeordneten AbsoluteLayoutElements angegeben.
Es AbsoluteLayout sollte als spezielles Layout betrachtet werden, das nur verwendet werden kann, wenn Sie eine Größe für untergeordnete Elemente festlegen können oder wenn sich die Größe des Elements nicht auf die Positionierung anderer untergeordneter Elemente auswirkt. Eine Standardmäßige Verwendung dieses Layouts besteht darin, eine Überlagerung zu erstellen, die die Seite mit anderen Steuerelementen abdeckt, um den Benutzer vor der Interaktion mit den normalen Steuerelementen auf der Seite zu schützen.
Wichtig
Die Eigenschaften HorizontalOptions
und VerticalOptions
haben keinen Effekt auf untergeordnete Elemente eines AbsoluteLayout.
Innerhalb einer AbsoluteLayoutangefügten AbsoluteLayout.LayoutBounds
Eigenschaft wird verwendet, um die horizontale Position, vertikale Position, Breite und Höhe eines Elements anzugeben. Darüber hinaus gibt die AbsoluteLayout.LayoutFlags
angefügte Eigenschaft an, wie die Layoutgrenzen interpretiert werden.
Der folgende XAML-Code veranschaulicht das Anordnen von Elementen in einem AbsoluteLayout:
<AbsoluteLayout Margin="40">
<BoxView Color="Red"
AbsoluteLayout.LayoutFlags="PositionProportional"
AbsoluteLayout.LayoutBounds="0.5, 0, 100, 100"
Rotation="30" />
<BoxView Color="Green"
AbsoluteLayout.LayoutFlags="PositionProportional"
AbsoluteLayout.LayoutBounds="0.5, 0, 100, 100"
Rotation="60" />
<BoxView Color="Blue"
AbsoluteLayout.LayoutFlags="PositionProportional"
AbsoluteLayout.LayoutBounds="0.5, 0, 100, 100" />
</AbsoluteLayout>
In diesem Beispiel funktioniert das Layout wie folgt:
- Jeder BoxView erhält eine explizite Größe von 100x100 und wird an derselben Position horizontal zentriert angezeigt.
- Das Rot BoxView wird um 30 Grad gedreht, und das Grün BoxView wird um 60 Grad gedreht.
- Auf jeder BoxView, die
AbsoluteLayout.LayoutFlags
angefügte Eigenschaft ist auf festgelegtPositionProportional
, die angibt, dass die Position proportional zum Um Standard Leerraum nach Breite und Höhe berücksichtigt wird.
Achtung
Vermeiden Sie die Verwendung der AbsoluteLayout.AutoSize
Eigenschaft nach Möglichkeit, da das Layoutmodul zusätzliche Layoutberechnungen durchführt.
Weitere Informationen finden Sie unter AbsoluteLayout.
BindableLayout:
A BindableLayout ermöglicht eine beliebige Layoutklasse, die von der Layout Klasse abgeleitet wird, deren Inhalt durch Binden an eine Sammlung von Elementen zu generieren, wobei die Option zum Festlegen der Darstellung der einzelnen Elemente mit einer DataTemplate.
Ein bindungsfähiges IEnumerable
Layout wird mit Daten aufgefüllt, indem seine ItemsSource
Eigenschaft auf eine beliebige Sammlung festgelegt wird, die sie implementiert und an eine Layoutabgeleitete Klasse angefügt wird. Die Darstellung der einzelnen Elemente im gebundenen Layout kann durch Festlegen der BindableLayout.ItemTemplate
angefügten Eigenschaft auf eine DataTemplatedefiniert werden.
Der folgende XAML-Code zeigt, wie eine StackLayout Ansammlung von Elementen gebunden und ihre Darstellung mit einem DataTemplate:
<StackLayout BindableLayout.ItemsSource="{Binding User.TopFollowers}"
Orientation="Horizontal">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}"
Aspect="AspectFill"
WidthRequest="44"
HeightRequest="44" />
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
Bindende Layouts sollten nur verwendet werden, wenn die anzuzeigende Sammlung von Elementen klein ist, und Das Scrollen und Auswählen ist nicht erforderlich.
Weitere Informationen finden Sie unter BindableLayout.
Benutzerdefinierte Layouts
In .NET MAUI leiten sich die Layoutklassen von der abstrakten Layout Klasse ab. Diese Klasse delegiert plattformübergreifendes Layout und Maß an eine Layout-Manager-Klasse. Jede Layout-Manager-Klasse implementiert die ILayoutManager Schnittstelle, die angibt, dass Measure und ArrangeChildren Implementierungen bereitgestellt werden müssen:
- Die Measure Implementierung ruft jede Ansicht im Layout auf IView.Measure und gibt die Gesamtgröße des Layouts aufgrund der Einschränkungen zurück.
- Die ArrangeChildren Implementierung bestimmt, wo jede Ansicht innerhalb der Grenzen des Layouts platziert werden soll, und ruft Arrange jede Ansicht mit den entsprechenden Grenzen auf. Der Rückgabewert ist die tatsächliche Größe des Layouts.
Die Layouts von .NET MAUI verfügen über vordefinierte Layout-Manager, um ihr Layout zu verarbeiten. Manchmal ist es jedoch erforderlich, Seiteninhalte mithilfe eines Layouts zu organisieren, das nicht von .NET MAUI bereitgestellt wird. Dies kann erreicht werden, indem Sie Ihr eigenes benutzerdefiniertes Layout schreiben. Weitere Informationen finden Sie unter "Benutzerdefinierte Layouts".
Eingabetransparenz
Jedes visuelle Element verfügt über eine InputTransparent
bindungsfähige Eigenschaft, die verwendet wird, um zu definieren, ob das Element Eingaben empfangen kann. Der Standardwert ist false
, um sicherzustellen, dass das Element Eingaben empfangen kann. Wenn sich diese Eigenschaft auf einem Element befindet true
, empfängt das Element keine Eingaben. Stattdessen werden Eingaben an alle Elemente übergeben, die sich visuell hinter dem Element befinden.
Die Layout Klasse, von der alle Layouts abgeleitet werden, verfügt über eine CascadeInputTransparent
bindungsfähige Eigenschaft, die steuert, ob untergeordnete Elemente die Eingabetransparenz des Layouts erben. Der Standardwert ist true
, um sicherzustellen, dass das Festlegen der InputTransparent
Eigenschaft true
auf eine Layoutklasse zu allen Elementen innerhalb des Layouts führt, die keine Eingabe erhalten.