首页 > 其他分享 >【MAUI】MAUI的项目结构

【MAUI】MAUI的项目结构

时间:2022-11-15 23:13:39浏览次数:70  
标签:Shell 项目 App xaml 文件夹 MAUI APP 结构

阅前须知:系列随笔讨论的是 .NET MAUI应用(即APP),而不是 .NET MAUI Blazor 应用。在 Visual Studio 中创建的项目如下图所示(注意选中的项目)。

创建好项目之后,在解决方案管理器中会看到这样的结构(这里使用的是 .NET 7.0.0):

这展示了一个MAUI项目的基本结构。

Platform 文件夹中包含了平台的特定内容:

在 Android 中,可以在 AndroidManifest.xml 中添加所需权限,打开后使用 XML 编辑器进行编辑。

iOS 文件夹下的 info.plist 文件储存了针对 iOS 平台的设置。不同于 Android ,iOS 的配置文件在 Visual Studio 中提供了一个较好的图形界面,但也可以作为 XML 文件打开,进行更进一步的设置。

Windows 平台下主要关注的是 Package.appxmanifest,直接双击打开也会出现类似于打开 info.plist 文件时的图形界面,功能比 iOS 提供的更加丰富(毕竟是微软自家平台)。

下面来看 Resources 文件夹,这里储存了 MAUI APP 所使用的资源。

  • AppIcon,顾名思义就是 APP 的图标
  • Fonts,是在 APP 中会使用到的字体
  • Images,是 APP 中会使用到的图片资源
  • Splash,存放了 APP 的启动画面
  • Styles,存放了 APP UI 使用到的资源,定义了一些颜色关键字和控件基本样式
  • Raw,存放除以上资源以外的资源

注意到 Raw 文件夹下存放了一个 AboutAssets.txt 文件,文件内对 Raw 文件夹进行了简要说明。

可以自行打开任何一个资源文件,打开属性窗口,会发现资源的生成操作均被设置成了一种特殊格式。

这里展示的是一个图标资源,故生成操作处设置为 MauiIcon。类似的,还有 MauiImage、MauiFont 和 MauiAsset 等等。在添加新资源时一定要注意检查这一配置是否正确。

除了这两个比较重要的文件夹之外,还包含了一些比较重要的文件。

App.xaml 中存放了适用于应用全局的资源字典。资源字典是 .NET MAUI 应用使用的资源的存储库。参见微软官方文档对资源字典的介绍。

App.xaml.cs 中设置了 APP 启动后会第一个加载的页面,通常是一个 Shell。通过设置 MainPage 属性来设置应用第一个打开的页面。

// App.xaml.cs
namespace MauiAppDotNet7;

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        MainPage = new AppShell();
    }
}

MAUI 中的 Shell 提供使用 URI 在页面之间进行导航的功能,因此经常在 MAUI 项目中被使用(至少微软的官方示例工程使用了 Shell)。当然,开发者也可以将 MainPage 属性设置为其他内容,比如说 FlyoutPage 或者 ContentPage。开发者可以根据自己的需求进行修改。

AppShell.xaml 定义了一个 Shell,并详细设置了这个 Shell。事实上,一个应用并不一定只能有一个 Shell,可以有多个 Shell,这在开发多平台应用的时候可能十分有用,参考如下代码:

// App.xaml.cs
namespace MauiAppDotNet7;

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

#if WINDOWS
        MainPage = new DesktopShell();
#endif

#if ANDROID
        MainPage = new MobileShell();
#endif
    }
}

结合预编译命令,开发者可以自行选择不同平台上的 Shell,以应对不同平台的需求。

我们回到 AppShell.xaml,下面是 AppShell.xaml 的内容:

<?xml version="1.0" encoding="UTF-8" ?>
<Shell
    x:Class="MauiAppDotNet7.AppShell"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:MauiAppDotNet7"
    Shell.FlyoutBehavior="Disabled">

    <ShellContent
        Title="Home"
        ContentTemplate="{DataTemplate local:MainPage}"
        Route="MainPage" />

</Shell>

显然,这些语句定义了一个 Shell。其中 ShellComtent 中定义了 Shell 中的一个元素,包含最基本的 Title、ContentTemplate 和 Route 属性。其中 Route 属性是使用 Shell 进行导航的关键。有关 Shell 的更多信息,请参阅微软官方文档

AppShell.xaml.cs 文件中并没有什么特殊内容,此处略过。

MainPage.xaml 是一个 ContentPage。ContentPage 是 MAUI 中一个基本的 Page,用于构建 UI 界面。我们在 AppShell.xaml 中看到了一个 ShellComtent 中的 ContentTemplate 属性被设置为了 MainPage.xaml 中的内容。Template 用于在 MAUI 中设置数据显示方式,其中可以使用各种各样的控件。

最后一个是 MauiProgram.cs,该文件中的代码用于构建 MAUI APP。开发者注册字体,进行依赖注入都要在这个文件中完成。

以上就是 MAUI 应用的基本结构,这个结构中并没有使用 MVVM 架构。MVVM 架构是微软官方推荐用于 MAUI 应用开发的架构。如果项目是使用 MVVM 架构构建的,项目中应该还会看到 View、ViewModel 和 Model 文件夹,可能还有 Service 文件夹。MVVM 架构并非本文的重点,读者可以自行了解。

标签:Shell,项目,App,xaml,文件夹,MAUI,APP,结构
From: https://www.cnblogs.com/yuyue-39/p/16894351.html

相关文章

  • SpringBoot 09: SpringBoot项目打包 (war包 + jar包)
    打成war包项目配置创建一个springboot的jsp应用pom.xml <!--执行打包是war包--> <packaging>war</packaging> <build> <!--打包后的文件名称--> <finalN......
  • 【2022.11.15】luffy项目部署(9)
    内容概要1redis字符串操作2redishash操作3redis列表操作4redis管道5redis其他操作6django中集成redis7celery介绍内容详细#装了图形化客户......
  • 13.DataFrame结构和构造函数
    1)DataFrame的创建最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。此外,DataFrame会自动加上每一......
  • Vue项目中使用树形控件 vue-table-width-tree-grid
    Vue项目中使用树形控件vue-table-width-tree-grid需要实现的整体效果如下:这个树形结构组件ElementUI是没有提供的,我们需要依赖第三方插件来完成。一、安装tree-ta......
  • 线性与树型数据结构可视化模拟器
    线性与树型数据结构可视化模拟器题目2:线性与树型数据结构可视化模拟器[问题描述]数据结构课程是计算机类专业的核心课程之一,是计算机科学与技术必修的专业基础课程。数......
  • luffy项目(九)
    今日内容概要redis字符串操作redishash操作redis列表操作redis其他操作redis管道django中集成rediscelery介绍今日内容详细#装了图形化客户端redis-deskt......
  • luffy商城项目第九天
    redis简介redis字符串操作redishash操作redis列表操作redis管道redis其他操作django中集成rediscelery介绍redis简介redis有五大数据类型:字符......
  • 数据结构之动态规划 斐波那契数列&最长公共子序列
    $fib()$递归$fib(n)=fib(n-1)+fib(n-2):{0,1,1,2,3,5,8,……}$复杂度计算$T(0)=T(1)=1;T(n)=T(n-1)+T(n-2)+1,n>1$令$S(n)=\frac{[T(n)+1]}{2}$//这是要去掉......
  • IM开源项目OpenIM部署文档-从准备工作到nginx配置
    IM开源项目OpenIM部署文档-从准备工作到nginx配置2022-11-1422:27·OpenIM 一、准备工作运行环境linux系统即可,Ubuntu7.5.0-3ubuntu1~18.04最优......
  • C++类的内存结构
     第一种这个类是个空类 sizeof会占用一个字节 newt也是占用一个字节但作为其他类的成员变量可能会占用1-2-4-8字节这个是类的内存对齐导致 第2种这......