.NET MAUI Shell 页面

Browse sample.浏览示例

ShellContent 对象表示每个 FlyoutItemTabContentPage 对象。当 Tab 对象中存在一个以上 ShellContent 对象时,可通过顶部选项卡导航 ContentPage 对象。 在页面内,可以导航到其他称为详细信息页面的 ContentPage 对象。

另外,Shell 类定义了可用于在 .NET Multi-platform App UI (.NET MAUI) Shell 应用中配置页面外观的附加属性。 这一配置工作包括设置页面颜色、设置页面呈现模式、禁用导航栏、禁用选项卡栏以及在导航栏中显示视图。

显示页面

在 .NET MAUI Shell 应用中,通常会按需创建页面以响应导航。 这一创建工作是通过使用 DataTemplate 标记扩展将每个 ShellContent 对象的 ContentTemplate 属性设置为 ContentPage 对象来完成的:

<Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:views="clr-namespace:Xaminals.Views"
       x:Class="Xaminals.AppShell">
    <TabBar>
       <ShellContent Title="Cats"
                     Icon="cat.png"
                     ContentTemplate="{DataTemplate views:CatsPage}" />
       <ShellContent Title="Dogs"
                     Icon="dog.png"
                     ContentTemplate="{DataTemplate views:DogsPage}" />
       <ShellContent Title="Monkeys"
                     Icon="monkey.png"
                     ContentTemplate="{DataTemplate views:MonkeysPage}" />
    </TabBar>
</Shell>

在此示例中,使用 Shell 的隐式转换运算符从视觉层次结构中删除 Tab 对象。 但是,每个 ShellContent 对象都呈现在一个选项卡中:

Screenshot of a Shell app with three pages.

注意

每个 ShellContent 对象的 BindingContext 均继承自父级 Tab 对象。

在每个 ContentPage 对象中,可以导航到其他 ContentPage 对象。 有关导航的详细信息,请参阅 .NET MAUI Shell 导航

在应用启动时加载页面

在 Shell 应用中,通常会按需创建每个 ContentPage 对象以响应导航。 但是,也可以在应用启动时创建 ContentPage 对象。

警告

在应用启动时创建的 ContentPage 对象可能导致启动体验不佳。

通过将 ShellContent.Content 属性设置为 ContentPage 对象,可以在应用启动时创建 ContentPage 对象:

<Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:views="clr-namespace:Xaminals.Views"
       x:Class="Xaminals.AppShell">
    <TabBar>
     <ShellContent Title="Cats"
                   Icon="cat.png">
         <views:CatsPage />
     </ShellContent>
     <ShellContent Title="Dogs"
                   Icon="dog.png">
         <views:DogsPage />
     </ShellContent>
     <ShellContent Title="Monkeys"
                   Icon="monkey.png">
         <views:MonkeysPage />
     </ShellContent>
    </TabBar>
</Shell>

在此示例中,CatsPageDogsPageMonkeysPage 都是在应用启动时创建的,而不是为了响应导航按需创建的。

注意

由于 Content 属性是 ShellContent 类的内容属性,因此不需要显式设置。

设置页面颜色

Shell 类定义了可用于在 Shell 应用中设置页面颜色的以下附加属性:

  • BackgroundColor,类型为 Color,用于定义 Shell chrome 的背景色。 颜色不会填充到 Shell 内容后面。
  • DisabledColor,类型为 Color,用于定义要对处于禁用状态的文本和图标进行阴影处理的颜色。
  • ForegroundColor,类型为 Color,用于定义要对文本和图标进行阴影处理的颜色。
  • TitleColor,类型为 Color,用于定义当前页面标题的颜色。
  • UnselectedColor,类型为 Color,用于定义 Shell chrome 中未选定的文本和图标的颜色。

所有这些属性都由 BindableProperty 对象提供支持;也就是说,这些属性可以作为数据绑定的目标,并使用 XAML style 设置样式。 此外,还可以使用级联样式表 (CSS) 设置这些属性。 有关详细信息,请参阅 .NET MAUI Shell 特定属性

注意

还有可启用要定义的选项卡颜色的属性。 有关详细信息,请参阅选项卡外观

以下 XAML 演示如何在子类化的 Shell 类中设置颜色属性:

<Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       x:Class="Xaminals.AppShell"
       BackgroundColor="#455A64"
       ForegroundColor="White"
       TitleColor="White"
       DisabledColor="#B4FFFFFF"
       UnselectedColor="#95FFFFFF">

</Shell>

在此示例中,颜色值将被应用于 Shell 应用中的所有页面,除非在页面级别替代它们。

由于颜色属性是附加属性,因此还可以在单个页面上设置这些属性,以便在该页面上设置颜色:

<ContentPage ...
             Shell.BackgroundColor="Gray"
             Shell.ForegroundColor="White"
             Shell.TitleColor="Blue"
             Shell.DisabledColor="#95FFFFFF"
             Shell.UnselectedColor="#B4FFFFFF">

</ContentPage>

或者,可以使用 XAML 样式设置颜色属性:

<Style x:Key="DomesticShell"
       TargetType="Element" >
    <Setter Property="Shell.BackgroundColor"
            Value="#039BE6" />
    <Setter Property="Shell.ForegroundColor"
            Value="White" />
    <Setter Property="Shell.TitleColor"
            Value="White" />
    <Setter Property="Shell.DisabledColor"
            Value="#B4FFFFFF" />
    <Setter Property="Shell.UnselectedColor"
            Value="#95FFFFFF" />
</Style>

有关 XAML 样式的详细信息,请参阅使用 XAML 设置应用样式

设置页面演示模式

默认情况下,当使用 GoToAsync 方法转到页面时,会出现一个小的导航动画。 但是,此行为是可以更改的,具体方法是将 ContentPage 上的附加属性 Shell.PresentationMode 设置为 PresentationMode 枚举成员之一:

  • NotAnimated 指明页面将在显示时不播放导航动画。
  • Animated 指明页面将在显示时播放导航动画。 这是附加属性 Shell.PresentationMode 的默认值。
  • Modal 指明页面将显示为模式页面。
  • ModalAnimated 指明页面将显示为模式页面,并播放导航动画。
  • ModalNotAnimated 指明页面将显示为模式页面,但不播放导航动画。

重要

PresentationMode 类型是 flags 枚举。 也就是说,可以在代码中应用枚举成员的组合。 不过,为了方便在 XAML 中使用,ModalAnimated 成员是 AnimatedModal 成员的组合,ModalNotAnimated 成员是 NotAnimatedModal 成员的组合。 若要详细了解 flags 枚举,请参阅作为位标志的枚举类型

下面的 XAML 示例设置了 ContentPage 上的附加属性 Shell.PresentationMode

<ContentPage ...
             Shell.PresentationMode="Modal">
    ...             
</ContentPage>

在此示例中,ContentPage 设置为在使用 GoToAsync 方法转到页面时显示为模式页面。

启用导航栏阴影

类型为 boolShell.NavBarHasShadow 附加属性,可控制导航栏是否有阴影。 默认情况下,此属性的值在 Android 上为 true,在其他平台上则为 false

可以在子类化的 Shell 对象上设置此属性,也可以在想要启用导航栏阴影的任何页面上进行设置。 例如,以下 XAML 演示如何从 ContentPage 启用导航栏阴影:

<ContentPage ...
             Shell.NavBarHasShadow="true">
    ...
</ContentPage>

这导致启用导航栏阴影。

禁用导航栏

类型为 boolShell.NavBarIsVisible 附加属性,可控制导航栏在显示页面时是否可见。 默认情况下,属性的值为 true

虽然可以在子类化的 Shell 对象上设置此属性,但通常会在想要使导航栏不可见的任何页面上进行设置。 例如,以下 XAML 演示如何从 ContentPage 禁用导航栏:

<ContentPage ...
             Shell.NavBarIsVisible="false">
    ...
</ContentPage>

在导航栏中显示视图

类型为 ViewShell.TitleView 附加属性,可用于在导航栏中显示任何 View

虽然可以在子类化的 Shell 对象上设置此属性,但也可以在想要在导航栏中显示视图的任何页面上进行设置。 例如,以下 XAML 演示如何在 ContentPage 的导航栏中显示 Image

<ContentPage ...>
    <Shell.TitleView>
        <Image Source="logo.png"
               HorizontalOptions="Center"
               VerticalOptions="Center" />
    </Shell.TitleView>
    ...
</ContentPage>

重要

如果导航栏已变得不可见,则使用 NavBarIsVisible 附加属性不会显示标题视图。

很多视图不会出现在导航栏中,除非使用 WidthRequestHeightRequest 属性指定视图的大小,或使用 HorizontalOptionsVerticalOptions 属性指定视图的位置。

可以设置 TitleView 附加属性来显示包含多个视图的布局类。 同样,因为 ContentView 类派生自 View 类,所以可以设置 TitleView 附加属性来显示包含单个视图的 ContentView

页面可见性

Shell 遵从页面可见性,其将通过 IsVisible 属性设置。 当页面的 IsVisible 属性设置为 false 时,其在 Shell 应用中不可见,因此也就不能导航到它。