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

无法用C#标记创建.NET MAUI AppShell的ShellItem与TabBar

.NET MAUI AppShell 全C#标记实现方案

核心错误修复

你之前的代码中,ContentTemplate = (DataTemplate)FeedPage是错误的——FeedPage是页面类型,而非DataTemplate实例。正确的做法是使用DataTemplate.FromType<T>()方法创建对应页面的模板,这和XAML中{DataTemplate feed:FeedPage}的效果完全一致。

完整实现代码

以下是将你提供的XAML完全转换为C#标记的AppShell实现,包含ShellItem(默认登录页)和TabBar的构建,以及绑定逻辑的处理:

public partial class AppShell : Shell
{
    public AppShell(AppShellViewModel viewModel)
    {
        InitializeComponent();
        BindingContext = viewModel;

        // 构建登录页ShellItem(默认启动页)
        var loginShellItem = new ShellItem
        {
            Route = "LoginPage",
            Items =
            {
                new ShellContent
                {
                    ContentTemplate = DataTemplate.FromType<LoginPage>()
                }
            }
        };

        // 构建Feed页ShellContent
        var feedShellContent = new ShellContent
        {
            // 若Title是ViewModel实例属性,使用绑定(对应XAML的{Binding TitleFeed})
            Title = new Binding(nameof(AppShellViewModel.TitleFeed)),
            ContentTemplate = DataTemplate.FromType<FeedPage>(),
            Route = "FeedPage"
        };

        // 构建Settings页ShellContent
        var settingsShellContent = new ShellContent
        {
            Title = new Binding(nameof(AppShellViewModel.TitleSettings)),
            ContentTemplate = DataTemplate.FromType<SettingsPage>(),
            Route = "SettingsPage"
        };

        // 构建TabBar及子Tab
        var tabBar = new TabBar
        {
            Items =
            {
                new Tab
                {
                    Title = new Binding(nameof(AppShellViewModel.TitleFeed)),
                    Items = { feedShellContent }
                },
                new Tab
                {
                    Title = new Binding(nameof(AppShellViewModel.TitleSettings)),
                    Items = { settingsShellContent }
                }
            }
        };

        // 将ShellItem和TabBar添加到Shell的根集合
        Items.Add(loginShellItem);
        Items.Add(tabBar);
    }
}

关键细节说明

  • ContentTemplate赋值:DataTemplate.FromType<T>()是创建页面模板的标准方式,它会自动处理页面的实例化逻辑,和XAML中的DataTemplate语法等效。
  • 绑定处理:如果TitleFeed、TitleSettings是ViewModel的实例属性(MVVM模式的常规写法),必须使用new Binding()来创建绑定关系,确保UI能响应属性变化;如果是静态属性,可直接赋值Title = AppShellViewModel.TitleFeed。
  • 层级结构:Shell的Items集合包含顶级的ShellItem和TabBar,每个Tab/ShellItem的Items集合对应子级的ShellContent,层级结构要和原XAML保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:44:56