You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Xamarin Forms升级.NET MAUI:FlyoutPageMenu配置疑问

解决方案:二选一配置导航框架

.NET MAUI中,Shell和FlyoutPage是两种独立的导航实现,不能混合使用。结合你已经用Shell.TitleView实现了Logo标题栏,推荐优先使用Shell来实现侧边菜单,以下是两种可行方案:


方案一:基于Shell实现侧边菜单(推荐)

Shell本身内置Flyout功能,无需单独使用FlyoutPage,直接在AppShell中配置即可,同时保留你的TopLogo标题视图。

步骤1:调整AppShell.xaml(根页面改为Shell)

<?xml version="1.0" encoding="UTF-8" ?>
<Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:pages="clr-namespace:AppMaui.Pages"
       xmlns:views="clr-namespace:AppMaui.Pages.Views"
       x:Class="AppMaui.AppShell"
       FlyoutIcon="menu_list.png">

    <!-- 侧边栏头部(可选,可放置Logo) -->
    <Shell.FlyoutHeader>
        <views:TopLogo />
    </Shell.FlyoutHeader>

    <!-- 配置Flyout菜单项 -->
    <FlyoutItem Title="Home" Icon="home_icon.png">
        <ShellContent ContentTemplate="{DataTemplate pages:MainPage}" />
    </FlyoutItem>

    <!-- 可添加更多菜单项 -->
    <FlyoutItem Title="其他页面" Icon="other_icon.png">
        <ShellContent ContentTemplate="{DataTemplate pages:OtherPage}" />
    </FlyoutItem>

    <!-- 全局TitleView,所有Shell子页面自动继承 -->
    <Shell.TitleView>
        <views:TopLogo />
    </Shell.TitleView>

</Shell>

步骤2:简化MainPage.xaml

若已在AppShell设置全局TitleView,MainPage可移除冗余的Shell.TitleView:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AppMaui.MainPage">
    <!-- 页面内容 -->
    <VerticalStackLayout>
        <Label Text="Main Page Content" Margin="20" />
    </VerticalStackLayout>
</ContentPage>

步骤3:设置App启动页为AppShell

修改App.xaml.cs:

public App()
{
    InitializeComponent();
    MainPage = new AppShell(); // 替换原有的MainPage或FlyoutPageMenu
}

方案二:基于FlyoutPage实现(保留原结构)

若坚持使用FlyoutPage,需将MainPage作为FlyoutPage的Detail页面内容,同时改用ContentPage.TitleView替代Shell的标题视图。

步骤1:修改FlyoutPageMenu.xaml(替换Detail内容为MainPage)

<?xml version="1.0" encoding="utf-8" ?>
<FlyoutPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:pages="clr-namespace:AppMaui.Pages"
             xmlns:views="clr-namespace:AppMaui.Pages.Views"
             x:Class="AppMaui.Pages.FlyoutPageMenu"
             IconImageSource="menu_list.png">
    <FlyoutPage.Flyout>
        <ContentPage Title="Home">
            <Label Text="Home"
                   HorizontalTextAlignment="Center"
                   VerticalTextAlignment="Center"></Label>
        </ContentPage>
    </FlyoutPage.Flyout>
    <FlyoutPage.Detail>
        <NavigationPage BarBackgroundColor="Navy"
                        BarTextColor="Black">
            <x:Arguments>
                <!-- 替换默认页面为你的MainPage -->
                <pages:MainPage />
            </x:Arguments>
        </NavigationPage>
    </FlyoutPage.Detail>
</FlyoutPage>

步骤2:调整MainPage的TitleView配置

FlyoutPage不支持Shell相关API,改用ContentPage.TitleView:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:views="clr-namespace:AppMaui.Pages.Views"
             x:Class="AppMaui.MainPage">
    <ContentPage.TitleView>
        <views:TopLogo></views:TopLogo>
    </ContentPage.TitleView>

    <!-- 页面内容 -->
    <VerticalStackLayout>
        <Label Text="Main Page Content" Margin="20" />
    </VerticalStackLayout>
</ContentPage>

步骤3:设置App启动页为FlyoutPageMenu

修改App.xaml.cs:

public App()
{
    InitializeComponent();
    MainPage = new FlyoutPageMenu();
}

关键说明

  • Shell是MAUI官方推荐的导航框架,支持全局配置、路由、Flyout、TabBar等多功能,比FlyoutPage更灵活,优先选方案一。
  • 使用FlyoutPage时,不能调用Shell相关API,需改用ContentPage或NavigationPage的TitleView实现标题栏。

内容的提问来源于stack exchange,提问作者Jefferson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:07:57