Xamarin.Forms-Shellflyout
Die von der Xamarin.Forms-Shell bereitgestellte Navigationsfunktion basiert auf Flyouts und Registerkarten. Ein Flyout ist das optionale Hauptmenü für eine Shellanwendung und vollständig anpassbar. Der Zugriff erfolgt über ein Symbol oder durch Wischen von einer Bildschirmseite. Das Flyout besteht aus einem optionalen Header, Flyout-Elementen, optionalen Menüelementen und einer optionalen Fußzeile.
Flyout-Elemente
Ein oder mehrere Flyoutelemente können zum Flyout hinzugefügt werden, und jedes Flyoutelement wird von einem FlyoutItem
-Objekt dargestellt. Jedes FlyoutItem
-Objekt muss ein untergeordnetes Element des Shell
-Objekts mit Unterklassen sein. Flyoutelemente werden ganz oben im Flyout angezeigt, wenn kein Flyoutheader vorhanden ist.
Im folgenden Beispiel wird ein Flyout erstellt, das zwei Flyoutelemente enthält:
<Shell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:Xaminals.Controls"
xmlns:views="clr-namespace:Xaminals.Views"
x:Class="Xaminals.AppShell">
<FlyoutItem Title="Cats"
Icon="cat.png">
<Tab>
<ShellContent ContentTemplate="{DataTemplate views:CatsPage}" />
</Tab>
</FlyoutItem>
<FlyoutItem Title="Dogs"
Icon="dog.png">
<Tab>
<ShellContent ContentTemplate="{DataTemplate views:DogsPage}" />
</Tab>
</FlyoutItem>
</Shell>
Die FlyoutItem.Title
-Eigenschaft vom Typ string
definiert den Titel des Flyoutelements. Die FlyoutItem.Icon
-Eigenschaft vom Typ ImageSource
definiert das Symbol des Flyoutelements:
In diesem Beispiel kann nur über Flyoutelemente und nicht über Registerkarten auf die einzelnen ShellContent
-Objekte zugegriffen werden. Dies liegt daran, dass Registerkarten standardmäßig nur angezeigt werden, wenn das Flyoutelement mehr als eine Registerkarte enthält.
Wichtig
In einer Shellanwendung werden Seiten bei Bedarf als Reaktion auf die Navigation erstellt. Dies wird mithilfe der DataTemplate
-Markuperweiterung erreicht, um die ContentTemplate
-Eigenschaft der einzelnen ShellContent
-Objekte auf ein ContentPage
-Objekt festzulegen.
Shell verfügt über implizite Konvertierungsoperatoren, die es ermöglichen, die visuelle Hierarchie der Shell zu vereinfachen, ohne zusätzliche Ansichten in die visuelle Struktur einzufügen. Dies ist möglich, weil ein Shell
-Objekt mit Unterklassen immer nur FlyoutItem
-Objekte oder ein TabBar
-Objekt enthalten darf, die immer nur Tab
-Objekte enthalten dürfen, die wiederum immer nur ShellContent
-Objekte enthalten dürfen. Diese impliziten Konvertierungsoperatoren können verwendet werden, um die Objekte FlyoutItem
und Tab
aus dem vorherigen Beispiel zu entfernen:
<Shell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:Xaminals.Controls"
xmlns:views="clr-namespace:Xaminals.Views"
x:Class="Xaminals.AppShell">
<ShellContent Title="Cats"
Icon="cat.png"
ContentTemplate="{DataTemplate views:CatsPage}" />
<ShellContent Title="Dogs"
Icon="dog.png"
ContentTemplate="{DataTemplate views:DogsPage}" />
</Shell>
Diese implizite Konvertierung schließt jedes ShellContent
-Objekt automatisch in Tab
-Objekte ein, die in FlyoutItem
-Objekten eingeschlossen sind.
Hinweis
Alle FlyoutItem
-Objekte in einem Shell
-Objekt mit Unterklassen werden automatisch zur Shell.FlyoutItems
-Sammlung hinzugefügt, die die Liste der im Flyout angezeigten Elemente definiert.
Anzeigeoptionen für Flyouts
Die FlyoutItem.FlyoutDisplayOptions
-Eigenschaft konfiguriert ein Flyoutelement, und seine untergeordneten Elemente werden im Flyout angezeigt. Diese Eigenschaft sollte auf einen FlyoutDisplayOptions
-Enumerationsmember festgelegt werden:
AsSingleItem
: Gibt an, dass das Element als ein einzelnes Element angezeigt wird. Dies ist der Standardwert der EigenschaftFlyoutDisplayOptions
.AsMultipleItems
: Gibt an, dass das Element und seine untergeordneten Elemente im Flyout als eine Gruppe von Elementen angezeigt werden.
Ein Flyoutelement für jedes Tab
-Objekt innerhalb eines FlyoutItem
kann angezeigt werden, indem die FlyoutItem.FlyoutDisplayOptions
-Eigenschaft auf AsMultipleItems
festgelegt wird:
<Shell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:Xaminals.Controls"
xmlns:views="clr-namespace:Xaminals.Views"
FlyoutHeaderBehavior="CollapseOnScroll"
x:Class="Xaminals.AppShell">
<FlyoutItem FlyoutDisplayOptions="AsMultipleItems">
<Tab Title="Domestic"
Icon="paw.png">
<ShellContent Title="Cats"
Icon="cat.png"
ContentTemplate="{DataTemplate views:CatsPage}" />
<ShellContent Title="Dogs"
Icon="dog.png"
ContentTemplate="{DataTemplate views:DogsPage}" />
</Tab>
<ShellContent Title="Monkeys"
Icon="monkey.png"
ContentTemplate="{DataTemplate views:MonkeysPage}" />
<ShellContent Title="Elephants"
Icon="elephant.png"
ContentTemplate="{DataTemplate views:ElephantsPage}" />
<ShellContent Title="Bears"
Icon="bear.png"
ContentTemplate="{DataTemplate views:BearsPage}" />
</FlyoutItem>
<ShellContent Title="About"
Icon="info.png"
ContentTemplate="{DataTemplate views:AboutPage}" />
</Shell>
In diesem Beispiel werden Flyoutelemente für das Tab
-Objekt erstellt, das ein untergeordnetes Element des FlyoutItem
-Objekts ist, sowie für die ShellContent
-Objekte, die untergeordnete Elemente des FlyoutItem
-Objekts sind. Grund hierfür ist, dass jedes ShellContent
-Objekt, das ein untergeordnetes Element des FlyoutItem
-Objekts ist, automatisch in ein Tab
-Objekt umschlossen wird. Darüber hinaus wird ein Flyoutelement für das endgültige ShellContent
-Objekt erstellt, das automatisch in ein Tab
-Objekt und dann in ein FlyoutItem
-Objekt eingeschlossen wird.
Hinweis
Registerkarten werden angezeigt, wenn ein FlyoutItem
-Objekt mehr als ein ShellContent
-Objekt enthält.
Dies führt zu folgenden Flyout-Elementen:
Definieren der FlyoutItem-Darstellung
Die Darstellung jedes FlyoutItem
-Objekts kann angepasst werden, indem die angefügte Eigenschaft Shell.ItemTemplate
auf eine DataTemplate
-Klasse festgelegt wird:
<Shell ...>
...
<Shell.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="0.2*,0.8*">
<Image Source="{Binding FlyoutIcon}"
Margin="5"
HeightRequest="45" />
<Label Grid.Column="1"
Text="{Binding Title}"
FontAttributes="Italic"
VerticalTextAlignment="Center" />
</Grid>
</DataTemplate>
</Shell.ItemTemplate>
</Shell>
Dieses Beispiel stellt die Titel der einzelnen FlyoutItem
-Objekte in Kursivschrift dar:
Da Shell.ItemTemplate
eine angefügte Eigenschaft ist, können verschiedene Vorlagen an bestimmte FlyoutItem
-Objekte angefügt werden.
Hinweis
Die Shell stellt die Eigenschaften Title
und FlyoutIcon
für die BindingContext
-Klasse von ItemTemplate
zur Verfügung.
Die Shell enthält zudem drei Formatklassen, die automatisch auf FlyoutItem
-Objekte angewendet werden. Weitere Informationen finden Sie unter Formatvorlage für FlyoutItem- und MenuItem-Objekte.
Standardvorlage für FlyoutItems
Im Folgenden sehen Sie die DataTemplate
-Standardvorlage, die für jede FlyoutItem
-Klasse verwendet wird:
<DataTemplate x:Key="FlyoutTemplate">
<Grid x:Name="FlyoutItemLayout"
HeightRequest="{x:OnPlatform Android=50}"
ColumnSpacing="{x:OnPlatform UWP=0}"
RowSpacing="{x:OnPlatform UWP=0}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Selected">
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="{x:OnPlatform Android=#F2F2F2, iOS=#F2F2F2}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</VisualStateManager.VisualStateGroups>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{x:OnPlatform Android=54, iOS=50, UWP=Auto}" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="FlyoutItemImage"
Source="{Binding FlyoutIcon}"
VerticalOptions="Center"
HorizontalOptions="{x:OnPlatform Default=Center, UWP=Start}"
HeightRequest="{x:OnPlatform Android=24, iOS=22, UWP=16}"
WidthRequest="{x:OnPlatform Android=24, iOS=22, UWP=16}">
<Image.Margin>
<OnPlatform x:TypeArguments="Thickness">
<OnPlatform.Platforms>
<On Platform="UWP"
Value="12,0,12,0" />
</OnPlatform.Platforms>
</OnPlatform>
</Image.Margin>
</Image>
<Label x:Name="FlyoutItemLabel"
Grid.Column="1"
Text="{Binding Title}"
FontSize="{x:OnPlatform Android=14, iOS=Small}"
HorizontalOptions="{x:OnPlatform UWP=Start}"
HorizontalTextAlignment="{x:OnPlatform UWP=Start}"
FontAttributes="{x:OnPlatform iOS=Bold}"
VerticalTextAlignment="Center">
<Label.TextColor>
<OnPlatform x:TypeArguments="Color">
<OnPlatform.Platforms>
<On Platform="Android"
Value="#D2000000" />
</OnPlatform.Platforms>
</OnPlatform>
</Label.TextColor>
<Label.Margin>
<OnPlatform x:TypeArguments="Thickness">
<OnPlatform.Platforms>
<On Platform="Android"
Value="20, 0, 0, 0" />
</OnPlatform.Platforms>
</OnPlatform>
</Label.Margin>
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String">
<OnPlatform.Platforms>
<On Platform="Android"
Value="sans-serif-medium" />
</OnPlatform.Platforms>
</OnPlatform>
</Label.FontFamily>
</Label>
</Grid>
</DataTemplate>
Diese Vorlage kann als Grundlage für Änderungen am vorhandenen Layout für Flyout-Elemente verwendet werden. Außerdem werden die visuellen Zustände angezeigt, die für Flyout-Elemente implementiert werden.
Darüber hinaus enthalten die Grid
-, Image
- und Label
-Elemente x:Name
-Werte und können deshalb im Visual State-Manager als Ziel festgelegt werden. Weitere Informationen finden Sie unter Festlegen des Zustands für mehrere Elemente.
Hinweis
Die gleiche Vorlage kann auch für MenuItem
-Objekte verwendet werden.
Ersetzen von Flyoutinhalten
FlyoutItem-Elemente bilden den Flyoutinhalt und können optional durch eigenen Inhalt ersetzt werden, indem Sie die bindbare Eigenschaft Shell.FlyoutContent
auf ein Objekt festlegen:
<Shell ...
x:Name="shell">
...
<Shell.FlyoutContent>
<CollectionView BindingContext="{x:Reference shell}"
IsGrouped="True"
ItemsSource="{Binding FlyoutItems}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Label Text="{Binding Title}"
TextColor="White"
FontSize="Large" />
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Shell.FlyoutContent>
</Shell>
In diesem Beispiel wird der Flyoutinhalt durch ein CollectionView
-Objekt ersetzt, das die Titel der einzelnen Elemente in der Sammlung FlyoutItems
anzeigt.
Hinweis
Die FlyoutItems
-Eigenschaft in der Shell
-Klasse ist eine schreibgeschützte Sammlung von Flyoutelementen.
Der Flyoutinhalt kann auch definiert werden, indem Sie die bindbare Eigenschaft Shell.FlyoutContentTemplate
auf ein DataTemplate
-Objekt festlegen:
<Shell ...
x:Name="shell">
...
<Shell.FlyoutContentTemplate>
<DataTemplate>
<CollectionView BindingContext="{x:Reference shell}"
IsGrouped="True"
ItemsSource="{Binding FlyoutItems}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Label Text="{Binding Title}"
TextColor="White"
FontSize="Large" />
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</DataTemplate>
</Shell.FlyoutContentTemplate>
</Shell>
Wichtig
Über dem Flyoutinhalt kann optional ein Flyoutheader angezeigt werden. Gleichermaßen kann optional eine Flyoutfußzeile unter dem Inhalt angezeigt werden. Wenn das Scrollen in Ihrem Flyoutinhalt möglich ist, versucht die Shell, das Scrollverhalten Ihres Flyoutheaders zu berücksichtigen.
Menüelemente
Menüelemente können optional zum Flyout hinzugefügt werden, und jedes Menüelement wird durch ein MenuItem
-Objekt dargestellt. Die Position von MenuItem
-Objekten auf dem Flyout hängt von der Deklarationsreihenfolge in der visuellen Shell-Hierarchie ab. Daher werden alle MenuItem
-Objekte, die vor FlyoutItem
-Objekten deklariert wurden, vor den FlyoutItem
-Objekten im Flyout angezeigt, und alle MenuItem
-Objekte, die nach FlyoutItem
-Objekten deklariert wurden, werden nach den FlyoutItem
-Objekten im Flyout angezeigt.
Die MenuItem
-Klasse verfügt über ein Clicked
-Ereignis und eine Command
-Eigenschaft. Daher ermöglichen MenuItem
-Objekte Szenarien, die eine Aktion als Reaktion auf das Antippen eines MenuItem
-Objekts ausführen.
MenuItem
-Objekte können wie im folgenden Beispiel gezeigt dem Flyout hinzugefügt werden:
<Shell ...>
...
<MenuItem Text="Help"
IconImageSource="help.png"
Command="{Binding HelpCommand}"
CommandParameter="https://learn.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell" />
</Shell>
In diesem Beispiel wird dem Flyout unterhalb aller Flyoutelemente ein MenuItem
-Objekt hinzugefügt:
Das MenuItem
-Objekt führt einen ICommand
namens HelpCommand
aus, der die durch die CommandParameter
-Eigenschaft angegebene URL im Systemwebbrowser öffnet.
Hinweis
Das BindingContext
jedes MenuItem
-Objekts wird von dem Shell
-Objekt mit Unterklassen geerbt.
Definieren der Darstellung des MenuItem-Objekts
Die Darstellung jedes MenuItem
-Objekts kann angepasst werden, indem die angefügte Eigenschaft Shell.MenuItemTemplate
auf eine DataTemplate
-Klasse festgelegt wird:
<Shell ...>
<Shell.MenuItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="0.2*,0.8*">
<Image Source="{Binding Icon}"
Margin="5"
HeightRequest="45" />
<Label Grid.Column="1"
Text="{Binding Text}"
FontAttributes="Italic"
VerticalTextAlignment="Center" />
</Grid>
</DataTemplate>
</Shell.MenuItemTemplate>
...
<MenuItem Text="Help"
IconImageSource="help.png"
Command="{Binding HelpCommand}"
CommandParameter="https://learn.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell" />
</Shell>
In diesem Beispiel wird jedem MenuItem
-Objekt die DataTemplate
hinzugefügt, wodurch der Titel des MenuItem
-Objekts in Kursivschrift angezeigt wird:
Da Shell.MenuItemTemplate
eine angefügte Eigenschaft ist, können verschiedene Vorlagen an bestimmte MenuItem
-Objekte angefügt werden.
Hinweis
Die Shell stellt die Eigenschaften Text
und IconImageSource
für die BindingContext
-Klasse von MenuItemTemplate
zur Verfügung. Sie können auch Title
anstelle von Text
und Icon
anstelle von IconImageSource
verwenden. Dadurch können Sie dieselbe Vorlage für Menüelemente und Flyoutelemente wiederverwenden.
Die Standardvorlage für FlyoutItem
-Objekte kann auch für MenuItem
-Objekte verwendet werden. Weitere Informationen finden Sie unter Standardvorlage für FlyoutItems.
Formatvorlage für FlyoutItem- und MenuItem-Objekte
Die Shell enthält drei Formatklassen, die automatisch auf FlyoutItem
- und MenuItem
-Objekte angewendet werden. Die Namen dieser Formatklassen lauten FlyoutItemLabelStyle
, FlyoutItemImageStyle
und FlyoutItemLayoutStyle
.
Der folgende XAML-Code zeigt ein Beispiel für das Definieren von Formaten für diese Formatklassen:
<Style TargetType="Label"
Class="FlyoutItemLabelStyle">
<Setter Property="TextColor"
Value="Black" />
<Setter Property="HeightRequest"
Value="100" />
</Style>
<Style TargetType="Image"
Class="FlyoutItemImageStyle">
<Setter Property="Aspect"
Value="Fill" />
</Style>
<Style TargetType="Layout"
Class="FlyoutItemLayoutStyle"
ApplyToDerivedTypes="True">
<Setter Property="BackgroundColor"
Value="Teal" />
</Style>
Diese Formate werden automatisch auf FlyoutItem
- und MenuItem
-Objekte angewendet, ohne dass deren StyleClass
-Eigenschaften auf die Namen der Formatklassen festgelegt werden müssen.
Darüber hinaus können benutzerdefinierte Formatklassen definiert und auf FlyoutItem
- und MenuItem
-Objekte angewendet werden. Weitere Informationen zu Formatklassen finden Sie unter Xamarin.Forms-Formatklassen.
Flyout-Header
Der Flyoutheader ist der Inhalt, der optional oben im Flyout angezeigt wird, wobei seine Darstellung durch ein object
definiert wird, das über die bindbare Eigenschaft Shell.FlyoutHeader
festgelegt werden kann:
<Shell ...>
<Shell.FlyoutHeader>
<controls:FlyoutHeader />
</Shell.FlyoutHeader>
</Shell>
Der FlyoutHeader
-Typ wird im folgenden Beispiel gezeigt:
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Xaminals.Controls.FlyoutHeader"
HeightRequest="200">
<Grid BackgroundColor="Black">
<Image Aspect="AspectFill"
Source="xamarinstore.jpg"
Opacity="0.6" />
<Label Text="Animals"
TextColor="White"
FontAttributes="Bold"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
</Grid>
</ContentView>
Dies führt zu folgendem Flyout-Header:
Alternativ kann die Darstellung des Flyoutheaders definiert werden, indem die bindbare Eigenschaft Shell.FlyoutHeaderTemplate
auf eine DataTemplate
festgelegt wird:
<Shell ...>
<Shell.FlyoutHeaderTemplate>
<DataTemplate>
<Grid BackgroundColor="Black"
HeightRequest="200">
<Image Aspect="AspectFill"
Source="xamarinstore.jpg"
Opacity="0.6" />
<Label Text="Animals"
TextColor="White"
FontAttributes="Bold"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
</Grid>
</DataTemplate>
</Shell.FlyoutHeaderTemplate>
</Shell>
Standardmäßig wird der Flyout-Header im Flyout fixiert, während der Inhalt unten scrollt, wenn genügend Elemente vorhanden sind. Allerdings kann dieses Verhalten geändert werden, indem die bindbare Eigenschaft Shell.FlyoutHeaderBehavior
auf einen der FlyoutHeaderBehavior
-Enumerationsmember festgelegt wird:
Default
– Gibt an, dass das plattformspezifische Standardverhalten verwendet wird. Dies ist der Standardwert der EigenschaftFlyoutHeaderBehavior
.Fixed
– Gibt an, dass der Flyout-Header jederzeit sichtbar und unverändert bleibt.Scroll
– Gibt an, dass der Flyout-Header beim Durchblättern der Elemente durch den Benutzer aus der Sicht des Benutzers heraus scrollt.CollapseOnScroll
– Gibt an, dass der Flyout-Header beim Durchblättern der Elemente durch den Benutzer zu einem Titel reduziert wird.
Das folgende Beispiel zeigt, wie der Flyout-Header beim Durchblättern der Elemente durch den Benutzer reduziert wird:
<Shell ...
FlyoutHeaderBehavior="CollapseOnScroll">
...
</Shell>
Flyout-Fußzeile
Die Flyoutfußzeile ist der Inhalt, der optional unten im Flyout angezeigt wird, wobei seine Darstellung durch ein object
definiert wird, das mit der bindbaren Eigenschaft Shell.FlyoutFooter
festgelegt werden kann:
<Shell ...>
<Shell.FlyoutFooter>
<controls:FlyoutFooter />
</Shell.FlyoutFooter>
</Shell>
Der FlyoutFooter
-Typ wird im folgenden Beispiel gezeigt:
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard"
x:Class="Xaminals.Controls.FlyoutFooter">
<StackLayout>
<Label Text="Xaminals"
TextColor="GhostWhite"
FontAttributes="Bold"
HorizontalOptions="Center" />
<Label Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat='{0:MMMM dd, yyyy}'}"
TextColor="GhostWhite"
HorizontalOptions="Center" />
</StackLayout>
</ContentView>
Dies führt zu folgenden Flyout-Fußzeilen:
Alternativ kann die Darstellung der Flyout-Fußzeile definiert werden, indem die Shell.FlyoutFooterTemplate
-Eigenschaft auf eine DataTemplate
festgelegt wird:
<Shell ...>
<Shell.FlyoutFooterTemplate>
<DataTemplate>
<StackLayout>
<Label Text="Xaminals"
TextColor="GhostWhite"
FontAttributes="Bold"
HorizontalOptions="Center" />
<Label Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat='{0:MMMM dd, yyyy}'}"
TextColor="GhostWhite"
HorizontalOptions="Center" />
</StackLayout>
</DataTemplate>
</Shell.FlyoutFooterTemplate>
</Shell>
Die Flyout-Fußzeile ist am unteren Rand des Flyouts festgelegt und kann eine beliebige Höhe aufweisen. Außerdem werden von der Fußzeile keine Menüelemente verdeckt.
Breite und Höhe des Flyouts
Die Breite und Höhe des Flyouts können angepasst werden, indem die angefügten Eigenschaften Shell.FlyoutWidth
und Shell.FlyoutHeight
auf double
-Werte festgelegt werden:
<Shell ...
FlyoutWidth="400"
FlyoutHeight="200">
...
</Shell>
Dadurch wird es beispielweise ermöglicht, das Flyout auf den gesamten Bildschirm auszuweiten oder die Höhe die Flyouts so zu reduzieren, dass die Registerkartenleiste nicht verdeckt wird.
Flyout-Symbol
Standardmäßig verfügen Shell-Anwendungen über ein Hamburger-Symbol, über das das Flyout durch Drücken geöffnet wird. Dieses Symbol kann durch Festlegen der bindbaren Eigenschaft Shell.FlyoutIcon
vom Typ ImageSource
in ein passendes Symbol geändert werden:
<Shell ...
FlyoutIcon="flyouticon.png">
...
</Shell>
Flyouthintergrund
Die Hintergrundfarbe des Flyouts kann mit der bindbaren Eigenschaft Shell.FlyoutBackgroundColor
festgelegt werden:
<Shell ...
FlyoutBackgroundColor="AliceBlue">
...
</Shell>
Hinweis
Die Shell.FlyoutBackgroundColor
kann auch über ein Cascading Stylesheet (CSS) festgelegt werden. Weitere Informationen finden Sie unter Spezifische Eigenschaften der Xamarin.Forms-Shell.
Alternativ kann der Hintergrund des Flyouts angegeben werden, indem die bindbare Eigenschaft Shell.FlyoutBackground
auf einen Brush
festgelegt wird:
<Shell ...
FlyoutBackground="LightGray">
...
</Shell>
In diesem Beispiel wird für den Hintergrund des Flyouts ein hellgrauer SolidColorBrush
verwendet.
Das folgende Beispiel zeigt, wie der Flyouthintergrund auf einen LinearGradientBrush
festgelegt wird:
<Shell ...>
<Shell.FlyoutBackground>
<LinearGradientBrush StartPoint="0,0"
EndPoint="1,1">
<GradientStop Color="#8A2387"
Offset="0.1" />
<GradientStop Color="#E94057"
Offset="0.6" />
<GradientStop Color="#F27121"
Offset="1.0" />
</LinearGradientBrush>
</Shell.FlyoutBackground>
...
</Shell>
Weitere Informationen zu Pinseln finden Sie unter Xamarin.Forms-Pinsel.
Flyout-Hintergrundbild
Das Flyout kann über ein optionales Hintergrundbild verfügen, das unterhalb des Flyoutheaders und hinter allen Flyoutelementen, Menüelementen und der Flyoutfußzeile angezeigt wird. Das Hintergrundbild kann angegeben werden, indem die bindbare FlyoutBackgroundImage
-Eigenschaft vom Typ ImageSource
auf eine Datei, eine eingebettete Ressource, einen URI oder einen Stream festgelegt wird.
Das Seitenverhältnis des Hintergrundbilds kann konfiguriert werden, indem die bindbare FlyoutBackgroundImageAspect
-Eigenschaft vom Typ Aspect
auf einen der Aspect
-Enumerationsmember festgelegt wird:
AspectFill
: Beschneidet das Bild so, dass es den Anzeigebereich ausfüllt und gleichzeitig das Seitenverhältnis beibehalten wird.AspectFit
: Wendet das Letterboxformat auf das Bild an, wenn erforderlich, damit das Bild in den Anzeigebereich passt, wobei abhängig davon, ob das Bild breit oder hoch ist, Leerraum am oberen bzw. unteren Rand oder seitlich hinzugefügt wird. Dies ist der Standardwert der EigenschaftFlyoutBackgroundImageAspect
.Fill
: Streckt das Bild so, dass es den Anzeigebereich vollständig und genau ausfüllt. Dies kann zu einer Bildverzerrung führen.
Das folgende Beispiel zeigt, wie diese Eigenschaften festgelegt werden:
<Shell ...
FlyoutBackgroundImage="photo.jpg"
FlyoutBackgroundImageAspect="AspectFill">
...
</Shell>
Dies führt dazu, dass im Flyout unter dem Flyoutheader ein Hintergrundbild angezeigt wird:
Flyouthintergrund
Der Hintergrund des Flyouts ist die Darstellung der Flyoutüberlagerung und kann angegeben werden, indem die angefügte Eigenschaft Shell.FlyoutBackdrop
auf einen Brush
festgelegt wird:
<Shell ...
FlyoutBackdrop="Silver">
...
</Shell>
In diesem Beispiel wird der Flyouthintergrund mit einem silbernen SolidColorBrush
gezeichnet.
Wichtig
Die angefügte Eigenschaft FlyoutBackdrop
kann für jedes beliebige Shellelement festgelegt werden, wird jedoch nur angewendet, wenn sie auf Shell
-, FlyoutItem
- oder TabBar
-Objekte festgelegt wird.
Das folgende Beispiel zeigt, wie der Flyouthintergrund auf einen LinearGradientBrush
festgelegt wird:
<Shell ...>
<Shell.FlyoutBackdrop>
<LinearGradientBrush StartPoint="0,0"
EndPoint="1,1">
<GradientStop Color="#8A2387"
Offset="0.1" />
<GradientStop Color="#E94057"
Offset="0.6" />
<GradientStop Color="#F27121"
Offset="1.0" />
</LinearGradientBrush>
</Shell.FlyoutBackdrop>
...
</Shell>
Weitere Informationen zu Pinseln finden Sie unter Xamarin.Forms-Pinsel.
Flyout-Verhalten
Auf das Flyout kann über das Hamburger-Symbol oder durch Streichen von der Seite des Bildschirms zugegriffen werden. Allerdings kann dieses Verhalten geändert werden, indem die angefügte Eigenschaft Shell.FlyoutBehavior
auf einen der FlyoutBehavior
-Enumerationsmember festgelegt wird:
Disabled
– Gibt an, dass das Flyout vom Benutzer nicht geöffnet werden kann.Flyout
– Gibt an, dass das Flyout vom Benutzer geöffnet und geschlossen werden kann. Dies ist der Standardwert derFlyoutBehavior
-Eigenschaft.Locked
– Gibt an, dass das Flyout vom Benutzer nicht geschlossen werden kann und dass es keine Inhalte überlappt.
Im folgenden Beispiel wird die Deaktivierung des Flyouts veranschaulicht:
<Shell ...
FlyoutBehavior="Disabled">
...
</Shell>
Hinweis
Die angefügte Eigenschaft FlyoutBehavior
kann auf Shell
, FlyoutItem
, ShellContent
und Seitenobjekte festgelegt werden, um das Standardverhalten des Flyouts zu überschreiben.
Flyout mit vertikalem Scrollen
Standardmäßig kann ein Flyout vertikal gescrollt werden, wenn die Flyoutelemente nicht in das Flyout passen. Dieses Verhalten kann geändert werden, indem die bindbare Eigenschaft Shell.FlyoutVerticalScrollMode
auf einen der ScrollMode
-Enumerationsmember festgelegt wird:
Disabled
: Gibt an, dass das vertikale Scrollen deaktiviert wird.Enabled
: Gibt an, dass das vertikale Scrollen aktiviert wird.Auto
: Gibt an, dass das vertikale Scrollen aktiviert wird, wenn die Flyoutelemente nicht in das Flyout passen. Dies ist der Standardwert der EigenschaftFlyoutVerticalScrollMode
.
Im folgenden Beispiel wird gezeigt, wie Sie das vertikale Scrollen deaktivieren:
<Shell ...
FlyoutVerticalScrollMode="Disabled">
...
</Shell>
FlyoutItem-Aktivierreihenfolge
Standardmäßig entspricht die Aktivierreihenfolge von FlyoutItem
-Objekten der gleichen Reihenfolge, in der sie in XAML aufgelistet sind, oder in der sie programmgesteuert einer untergeordneten Sammlung hinzugefügt wurden. Diese Reihenfolge ist die Reihenfolge, in der die FlyoutItem
-Objekte mithilfe einer Tastatur navigiert werden, und oft ist diese Standardreihenfolge die beste Reihenfolge.
Die Standardaktivierreihenfolge kann durch Festlegen der FlyoutItem.TabIndex
-Eigenschaft geändert werden, die angibt, in welcher Reihenfolge die FlyoutItem
-Objekte den Fokus erhalten, wenn der Benutzer durch Drücken der TAB-TASTE durch Elemente navigiert. Der Standardwert der Eigenschaft ist 0. Er kann auf jeden beliebigen int
-Wert festgelegt werden.
Die folgenden Regeln gelten, wenn die Standardaktivierreihenfolge verwendet oder die TabIndex
-Eigenschaft festgelegt wird:
FlyoutItem
-Objekte mit einemTabIndex
gleich 0 werden, basierend auf ihrer Deklarationsreihenfolge in XMAL oder untergeordneten Sammlungen, der Aktivierreihenfolge hinzugefügt.FlyoutItem
-Objekte mit einemTabIndex
größer 0 werden, basierend auf ihremTabIndex
-Wert, der Aktivierreihenfolge hinzugefügt.FlyoutItem
-Objekte mit einemTabIndex
kleiner 0 werden der Aktivierreihenfolge hinzugefügt und werden vor einem NULL-Wert angezeigt.- Konflikte bei einem
TabIndex
werden durch Deklaration der Reihenfolge aufgelöst.
Nach dem Definieren einer Aktivierreihenfolge wird durch das Drücken der TAB-TASTE eine Fokusschleife aktiviert, die FlyoutItem
-Objekte in aufsteigender TabIndex
-Reihenfolge durchläuft und von vorne beginnt, sobald das letzte Objekt erreicht ist.
Zusätzlich zum Festlegen der Aktivierreihenfolge von FlyoutItem
-Objekten kann es notwendig sein, einige Objekte aus der Aktivierreihenfolge auszuschließen. Dies kann mit der FlyoutItem.IsTabStop
-Eigenschaft erreicht werden, die angibt, ob ein FlyoutItem
in der Tabstoppnavigation eingeschlossen ist. Der Standardwert ist true
, und wenn er false
ist, wird das FlyoutItem
von der Infrastruktur der Tabstoppnavigation ignoriert, unabhängig davon, ob ein TabIndex
festgelegt ist.
FlyoutItem-Auswahl
Wenn eine Shellanwendung, die ein Flyout verwendet, zum ersten Mal ausgeführt wird, wird die Shell.CurrentItem
-Eigenschaft auf das erste FlyoutItem
-Objekt im Shell
-Objekt mit Unterklassen festgelegt. Allerdings kann die Eigenschaft wie im folgenden Beispiel gezeigt, auf ein anderes FlyoutItem
-Objekt festgelegt werden:
<Shell ...
CurrentItem="{x:Reference aboutItem}">
<FlyoutItem FlyoutDisplayOptions="AsMultipleItems">
...
</FlyoutItem>
<ShellContent x:Name="aboutItem"
Title="About"
Icon="info.png"
ContentTemplate="{DataTemplate views:AboutPage}" />
</Shell>
In diesem Beispiel wird die CurrentItem
-Eigenschaft auf das ShellContent
-Objekt namens aboutItem
festgelegt, das daraufhin ausgewählt und angezeigt wird. In diesem Beispiel wird eine implizite Konvertierung zum Einschließen des ShellContent
-Objekts in ein Tab
-Objekt verwendet, das in ein FlyoutItem
-Objekt eingeschlossen ist.
Wenn ein ShellContent
-Objekt mit dem Namen aboutItem
vorhanden ist, lautet der äquivalente C#-Code wie folgt:
CurrentItem = aboutItem;
In diesem Beispiel wird die CurrentItem
-Eigenschaft in der Shell
-Klasse mit Unterklassen festgelegt. Alternativ kann die CurrentItem
-Eigenschaft in jeder Klasse über die statische Shell.Current
-Eigenschaft festgelegt werden:
Shell.Current.CurrentItem = aboutItem;
Hinweis
Eine Anwendung kann einen Status aufweisen, bei dem das Auswählen eines Flyoutelements kein gültiger Vorgang ist. In solchen Fällen kann die FlyoutItem
deaktiviert werden, indem die zugehörige IsEnabled
-Eigenschaft auf false
festgelegt wird. Dadurch wird verhindert, dass Benutzer das Flyoutelement auswählen können.
Sichtbarkeit von FlyoutItem-Elementen
FlyoutItem-Elemente sind im Flyout standardmäßig sichtbar. Allerdings kann ein Element im Flyout mit der FlyoutItemIsVisible
-Eigenschaft ausgeblendet und mit der IsVisible
-Eigenschaft aus dem Flyout entfernt werden:
FlyoutItemIsVisible
vom Typbool
gibt an, ob das Element im Flyout ausgeblendet wird, aber dennoch mit derGoToAsync
-Navigationsmethode erreichbar ist. Der Standardwert dieser Eigenschaft isttrue
.IsVisible
vom Typbool
gibt an, ob das Element aus der visuellen Struktur entfernt werden und daher nicht im Flyout angezeigt werden sollte. Der Standardwert lautettrue
.
Im folgenden Beispiel wird gezeigt, wie ein Element im Flyout ausgeblendet wird:
<Shell ...>
<FlyoutItem ...
FlyoutItemIsVisible="False">
...
</FlyoutItem>
</Shell>
Hinweis
Außerdem gibt es die angefügte Eigenschaft Shell.FlyoutItemIsVisible
, die für FlyoutItem
-, MenuItem
-, Tab
- und ShellContent
-Objekte festgelegt werden kann.
Programmgesteuertes Öffnen und Schließen des Flyouts
Das Flyout kann programmgesteuert geöffnet und geschlossen werden, indem die bindbare Eigenschaft Shell.FlyoutIsPresented
auf einen boolean
-Wert festgelegt wird, der angibt, ob das Flyout aktuell geöffnet ist:
<Shell ...
FlyoutIsPresented="{Binding IsFlyoutOpen}">
</Shell>
Alternativ kann dies im Code ausgeführt werden:
Shell.Current.FlyoutIsPresented = false;