Xamarin.Forms-Shellflyout

Download Sample Das Beispiel herunterladen

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.

Screenshot of a Shell annotated flyout

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:

Screenshot of a Shell two page app with flyout items, on iOS and Android

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 Eigenschaft FlyoutDisplayOptions.
  • 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:

Screenshot of flyout containing FlyoutItem objects, on iOS and Android

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:

Screenshot of templated FlyoutItem objects, on iOS and Android

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

Screenshot of flyout containing a MenuItem object, on iOS and Android

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:

Screenshot of templated MenuItem objects, on iOS and Android

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:

Screenshot of the 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 Eigenschaft FlyoutHeaderBehavior.
  • 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>

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:

Screenshot of the flyout footer

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 Eigenschaft FlyoutBackgroundImageAspect.
  • 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:

Screenshot of a flyout background image

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 der FlyoutBehavior-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 Eigenschaft FlyoutVerticalScrollMode.

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 einem TabIndex gleich 0 werden, basierend auf ihrer Deklarationsreihenfolge in XMAL oder untergeordneten Sammlungen, der Aktivierreihenfolge hinzugefügt.
  • FlyoutItem-Objekte mit einem TabIndex größer 0 werden, basierend auf ihrem TabIndex-Wert, der Aktivierreihenfolge hinzugefügt.
  • FlyoutItem-Objekte mit einem TabIndex 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 Typ bool gibt an, ob das Element im Flyout ausgeblendet wird, aber dennoch mit der GoToAsync-Navigationsmethode erreichbar ist. Der Standardwert dieser Eigenschaft ist true.
  • IsVisible vom Typ bool gibt an, ob das Element aus der visuellen Struktur entfernt werden und daher nicht im Flyout angezeigt werden sollte. Der Standardwert lautet true.

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;