.NET MAUI 基础知识
文章目录
- 什么是 .NET MAUI?
- MAUI的核心特点
- 与Xamarin.Forms的区别
- 开发环境搭建
- 安装Visual Studio 2022
- 安装必要组件
- 配置Android开发环境
- 配置iOS开发环境
- 验证安装
- 创建第一个MAUI应用
- 创建新项目
- MAUI项目结构解析
- 理解关键文件
- 运行应用程序
- 简单修改示例
- 使用热重载
- MAUI应用生命周期
- 应用程序生命周期
- 页面生命周期
- 常见控件和布局
- 常用控件
- 布局容器
- 布局示例
- 小结与后续学习路径
- 学习资源
什么是 .NET MAUI?
.NET Multi-platform App UI (.NET MAUI) 是微软推出的新一代跨平台UI框架,是Xamarin.Forms的继任者。它允许开发者使用单一的代码库和项目结构,创建可在Android、iOS、macOS和Windows上运行的本地应用程序。.NET MAUI采用C#和XAML作为开发语言,为开发者提供了统一的编程模型和API,简化了跨平台应用开发流程。
MAUI的核心特点
- 单一项目结构:不同于Xamarin.Forms的多项目解决方案,MAUI采用单一项目结构,简化了开发和维护过程。
- 统一控件:提供一套统一的控件库,这些控件在不同平台上保持一致的行为和外观。
- 平台特定API集成:允许直接从共享代码中访问平台特定API,无需编写自定义渲染器。
- 现代化架构:基于.NET 6及更高版本构建,支持最新的C#特性。
- 原生性能:应用程序编译为平台原生代码,提供接近原生的性能体验。
上图出自微软官方学习路线
与Xamarin.Forms的区别
主要改进点包括:
- 项目结构:从多项目结构简化为单一项目结构
- 渲染系统:从渲染器架构升级为更灵活的处理程序架构
- 构建系统:整合到.NET统一构建系统中
- 依赖注入:内置现代依赖注入框架
- 生命周期管理:改进的应用和页面生命周期管理
- 热重载:增强的XAML热重载支持
开发环境搭建
要开始.NET MAUI开发,需要设置适当的开发环境。以下是详细的步骤:
安装Visual Studio 2022
Visual Studio 2022是开发MAUI应用的首选IDE,它提供了完整的工具集和集成支持。
- 下载并安装Visual Studio 2022(推荐使用Community或更高版本)
安装Visual Studio 2022可以参考博文对于C#初学者在学习前的准备
- 在安装过程中,选择".NET Multi-platform App UI开发"工作负载
安装必要组件
在Visual Studio安装程序中,确保以下组件被选中:
- .NET MAUI(必选)
- Android SDK设置(适用于Android开发)
- iOS和MacOS开发工具(适用于iOS/MacOS开发)
- 通用Windows平台开发(适用于Windows开发)
配置Android开发环境
要开发Android应用,需要完成以下设置:
- 安装Android SDK:默认情况下,Visual Studio会安装必要的Android SDK
- 配置Android模拟器:
- 打开Visual Studio中的"Android设备管理器"
- 创建新的设备映像(推荐API 30或更高版本)
- 配置模拟器性能选项
打开样式如下
当我们存在项目时调试时就可以直接运行
无法创建模拟器时参考如何使用Android模拟器(Hyper-V和AEHD)启用硬件加速
如果模拟器无法使用可以尝试使用真机调试(在手机中打开开发者模式)
- 配置真机调试(可选):
- 在Android设备上启用"开发者选项"和"USB调试"
- 安装适当的USB驱动程序
- 通过USB连接设备并允许调试
调试时可以打开xaml实时预览窗口进行查看
配置iOS开发环境
iOS开发需要一台Mac计算机和以下组件:
- 安装最新版Xcode:从Mac App Store下载并安装
- 设置远程配对:
- 在Mac上安装Apple的远程工具
- 在Visual Studio中配置Mac连接
如果您使用Mac开发,则可以直接在Mac上安装Visual Studio for Mac并进行MAUI开发。
验证安装
完成安装后,可以通过以下步骤验证环境:
// 在命令行运行以下命令以检查.NET MAUI工作负载是否正确安装
dotnet workload list
// 应该能看到maui工作负载已安装的信息
创建第一个MAUI应用
让我们创建一个简单的Hello World应用来理解MAUI项目结构和基本概念。
创建新项目
- 打开Visual Studio 2022
- 选择"创建新项目"
- 在搜索框中输入"MAUI"
- 选择".NET MAUI应用"模板
- 点击"下一步"
- 输入项目名称(例如"MauiHelloWorld")
注意创建MAUI项目目录时不要包含中文
- 选择保存位置
- 点击"创建"
MAUI项目结构解析
创建的MAUI项目有以下主要文件和文件夹:
MauiHelloWorld/
│
├── Platforms/ # 平台特定代码
│ ├── Android/ # Android特定代码
│ ├── iOS/ # iOS特定代码
│ ├── MacCatalyst/ # MacOS特定代码
│ └── Windows/ # Windows特定代码
│
├── Resources/ # 应用资源
│ ├── AppIcon/ # 应用图标
│ ├── Fonts/ # 字体文件
│ ├── Images/ # 图像资源
│ ├── Raw/ # 其他资源
│ └── Styles/ # 样式定义
│
├── App.xaml # 应用定义文件
├── App.xaml.cs # 应用代码
├── AppShell.xaml # Shell UI定义
├── AppShell.xaml.cs # Shell UI代码
├── MainPage.xaml # 主页面UI定义
├── MainPage.xaml.cs # 主页面代码
└── MauiProgram.cs # 应用配置和启动
理解关键文件
- MauiProgram.cs:应用程序的入口点,配置服务和应用生命周期
public static class MauiProgram
{public static MauiApp CreateMauiApp(){// 创建MauiApp构建器var builder = MauiApp.CreateBuilder();// 配置应用程序builder.UseMauiApp<App>() // 使用App类作为主应用程序类.ConfigureFonts(fonts =>{// 配置应用程序字体fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");});// 在这里注册服务(依赖注入)// builder.Services.AddSingleton<IMyService, MyService>();// 构建并返回MauiApp实例return builder.Build();}
}
- App.xaml/App.xaml.cs:定义应用程序资源和应用程序级行为
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:MauiHelloWorld"x:Class="MauiHelloWorld.App"><Application.Resources><ResourceDictionary><!-- 应用级资源和样式 --><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Resources/Styles/Colors.xaml" /><ResourceDictionary Source="Resources/Styles/Styles.xaml" /></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>
</Application>
public partial class App : Application
{public App(){InitializeComponent();// 设置应用程序的主页面MainPage = new AppShell();}// 应用程序生命周期方法protected override void OnStart(){// 当应用启动时调用base.OnStart();}protected override void OnSleep(){// 当应用进入后台时调用base.OnSleep();}protected override void OnResume(){// 当应用从后台恢复时调用base.OnResume();}
}
- AppShell.xaml/AppShell.xaml.cs:定义应用程序的Shell架构(导航结构)
<Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:MauiHelloWorld"x:Class="MauiHelloWorld.AppShell"Title="MauiHelloWorld"><!-- 定义应用程序的Shell结构,这里是一个简单的单页面应用 --><ShellContent Title="Home"ContentTemplate="{DataTemplate local:MainPage}"Route="MainPage" />
</Shell>
- MainPage.xaml/MainPage.xaml.cs:应用程序的主页面
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="MauiHelloWorld.MainPage"><ScrollView><VerticalStackLayout Spacing="25" Padding="30"><Image Source="dotnet_bot.png"HeightRequest="185"SemanticProperties.Description="The .NET Bot mascot" /><Label Text="Hello, World!"FontSize="32"HorizontalOptions="Center" /><Label Text="Welcome to .NET MAUI!"FontSize="18"HorizontalOptions="Center" /><Button x:Name="CounterButton"Text="Click me"Clicked="OnCounterClicked"HorizontalOptions="Center" /></VerticalStackLayout></ScrollView>
</ContentPage>
public partial class MainPage : ContentPage
{// 计数器变量private int _count = 0;public MainPage(){InitializeComponent();}// 按钮点击事件处理方法private void OnCounterClicked(object sender, EventArgs e){// 增加计数器值_count++;// 根据计数值更新按钮文本if (_count == 1)CounterButton.Text = $"Clicked {_count} time";elseCounterButton.Text = $"Clicked {_count} times";// 屏幕阅读器宣布文本变化(辅助功能支持)SemanticScreenReader.Announce(CounterButton.Text);}
}
运行应用程序
创建项目后,可以选择目标平台并运行应用程序:
-
在Visual Studio顶部工具栏中,从调试目标下拉列表选择平台:
- Windows Machine(Windows)
- Android Emulator(Android)
- Local Device(iOS,需要Mac连接)
-
点击绿色的"运行"按钮或按F5启动应用程序
-
应用程序将在所选平台上编译和运行
简单修改示例
让我们对默认应用程序做一些简单的修改,以了解MAUI开发流程:
- 添加自定义UI元素:
<!-- 在VerticalStackLayout中添加一个滑块控件 -->
<Slider x:Name="OpacitySlider" Minimum="0" Maximum="1" Value="1"ValueChanged="OnOpacityChanged"Margin="0,20,0,0" /><Label Text="调整透明度"HorizontalOptions="Center" />
- 添加相应的代码逻辑:
// 在MainPage.xaml.cs中添加滑块值变化处理方法
private void OnOpacityChanged(object sender, ValueChangedEventArgs e)
{// 获取滑块当前值(0到1之间)double newValue = e.NewValue;// 将滑块值应用到图像的透明度if (sender is Slider slider){// 查找Image控件并设置其Opacity属性var image = this.FindByName<Image>("dotnet_bot");if (image != null){image.Opacity = newValue;}}
}
使用热重载
.NET MAUI支持热重载功能,允许在应用运行时实时查看XAML更改:
- 运行应用程序
- 在XAML文件中修改UI(例如更改文本、颜色或布局)
- 保存文件,更改将立即反映在运行的应用程序中
MAUI应用生命周期
了解MAUI应用的生命周期对于正确管理资源和用户体验至关重要。
应用程序生命周期
MAUI应用生命周期由以下关键事件定义:
- OnCreate/构造函数:应用程序初始化时调用
- OnStart:应用程序变为活动状态时调用
- OnSleep:应用程序进入后台时调用
- OnResume:应用程序从后台恢复时调用
页面生命周期
每个页面也有自己的生命周期事件:
- OnAppearing:页面即将显示时调用
- OnDisappearing:页面即将隐藏时调用
public partial class MyPage : ContentPage
{public MyPage(){InitializeComponent();}// 页面即将显示时调用protected override void OnAppearing(){base.OnAppearing();Console.WriteLine("页面正在显示");// 可以在此处加载数据或初始化UILoadData();}// 页面即将隐藏时调用protected override void OnDisappearing(){base.OnDisappearing();Console.WriteLine("页面正在隐藏");// 可以在此处保存数据或清理资源SaveData();}private void LoadData(){// 加载数据的逻辑}private void SaveData(){// 保存数据的逻辑}
}
常见控件和布局
MAUI提供了丰富的控件和布局系统,以下是一些常用的UI元素:
常用控件
布局容器
MAUI提供了多种布局容器,用于组织UI元素:
- StackLayout:垂直或水平排列元素
- Grid:在行和列中排列元素
- FlexLayout:灵活排列元素,类似CSS Flexbox
- AbsoluteLayout:使用绝对坐标定位元素
- RelativeLayout:相对于其他元素或父容器定位元素
布局示例
以下是使用Grid布局的示例:
<Grid RowDefinitions="Auto,*,Auto"ColumnDefinitions="*,*"><!-- 占据第一行,跨越两列 --><Label Text="标题文本" Grid.Row="0" Grid.ColumnSpan="2"HorizontalOptions="Center"FontSize="24"Margin="0,20,0,0" /><!-- 第二行第一列 --><Image Source="image1.png"Grid.Row="1"Grid.Column="0"Aspect="AspectFit"Margin="20" /><!-- 第二行第二列 --><Image Source="image2.png"Grid.Row="1"Grid.Column="1"Aspect="AspectFit"Margin="20" /><!-- 第三行,跨越两列 --><Button Text="确认"Grid.Row="2"Grid.ColumnSpan="2"Margin="20"HorizontalOptions="Center" />
</Grid>
小结与后续学习路径
本文介绍了.NET MAUI的基础知识,包括:
- MAUI的定义与特点
- 与Xamarin.Forms的区别与改进
- 开发环境搭建
- 创建和运行第一个MAUI应用
- 项目结构和关键文件
- 应用和页面生命周期
- 常见控件和布局
这些知识为开始MAUI开发提供了坚实的基础。要成为熟练的MAUI开发者,还需要:
- 深入XAML:掌握XAML语法、样式和资源系统
- 数据绑定与MVVM:学习数据绑定和MVVM架构模式
- 导航与Shell:掌握页面导航和Shell框架
- 本地数据存储:学习使用SQLite等技术存储数据
- Web服务集成:掌握HTTP请求和REST API调用
- 平台特定功能:学习如何访问设备功能和平台特定API
学习资源
以下是一些有用的.NET MAUI学习资源:
- .NET MAUI官方文档
- Microsoft Learn MAUI课程
- .NET MAUI GitHub仓库
- MAUI社区工具包
- MAUI示例应用
通过这些资源和实践,您将能够掌握.NET MAUI并创建出色的跨平台应用程序。
相关文章:

.NET MAUI 基础知识
文章目录 什么是 .NET MAUI?MAUI的核心特点与Xamarin.Forms的区别 开发环境搭建安装Visual Studio 2022安装必要组件配置Android开发环境配置iOS开发环境验证安装 创建第一个MAUI应用创建新项目MAUI项目结构解析理解关键文件运行应用程序简单修改示例使用热重载 MAU…...

佰力博科技与您探讨表面电阻的测试方法及应用领域
表面电阻测试是一种用于测量材料表面电阻值的技术,广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法: 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中,平行电极法通过在试样…...

鹅厂面试数学题
题目 一个圆上随机取三个点,求这三个点构成锐角三角形的概率。 解答 根据圆周角定理,此题目等价为:一条线段长度为1的线段随机取两个点分成三段,任意一段长度均不大于1/2的概率。记前两段的长度为,则第三段的长度为…...
GO语言-导入自定义包
文章目录 1. 项目目录结构2. 创建自定义包3. 初始化模块4. 导入自定义包5. 相对路径导入 在Go语言中导入自定义包需要遵循一定的目录结构和导入规则。以下是详细指南(包含两种方式): 1. 项目目录结构 方法1:适用于Go 1.11 &#…...

java基础-package关键字、MVC、import关键字
1.package关键字: (1)为了更好管理类,提供包的概念 (2)声明类或接口所属的包,声明在源文件首行 (3)包,属于标识符,用小写字母表示 ࿰…...

[6-2] 定时器定时中断定时器外部时钟 江协科技学习笔记(41个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 V 30 31 32 33 34 35 36 37 38 39 40 41...
第五节:对象与原型链:JavaScript 的“类”与“继承”
📌 第五节:对象与原型链:JavaScript 的“类”与“继承” 目标:理解对象创建、原型继承、this 绑定,掌握类语法与原型设计模式,实现模块化组件开发。 一、对象基础:数据的“容器” 1. 对象字面…...
本地的ip实现https访问-OpenSSL安装+ssl正式的生成(Windows 系统)
1.下载OpenSSL软件 网站地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 安装: 一直点击下一步就可以了 2.设置环境变量 在开始菜单右键「此电脑」→「属性」→「高级系统设置」→「环境变量」 在Path 中添加一个: xxxx\OpenSSL-…...
Spring Boot + MyBatis-Plus 高并发读写分离实战
引言 在高并发场景下,单一数据库实例往往成为性能瓶颈。数据库读写分离通过将读操作和写操作分配到不同的数据库实例,有效缓解主库压力,提升系统吞吐量。MyBatis-Plus 作为一款强大的持久层框架,结合 Spring Boot 能够轻松实现读…...
HarmonyOS 【诗韵悠然】AI古诗词赏析APP开发实战从零到一系列(二、项目准备与后台服务搭建)
在开发一款面向HarmonyOS平台的应用程序——【诗韵悠然】AI古诗词赏析APP时,选择了流行Go语言作为后端开发语言,并使用了go-zero微服务框架来搭建服务接口。本文将详细介绍项目准备和后台服务搭建的过程,帮助大家更好地理解和掌握go-zero框架…...

【PmHub后端篇】PmHub中基于自定义注解和AOP的服务接口鉴权与内部认证实现
1 引言 在现代软件开发中,尤其是在微服务架构下,服务接口的鉴权和内部认证是保障系统安全的重要环节。本文将详细介绍PmHub中如何利用自定义注解和AOP(面向切面编程)实现服务接口的鉴权和内部认证,所涉及的技术知识点…...

多模态AI新纪元:Vertex AI Gemini与Spring AI深度集成实践
企业级AI集成进阶:Spring AI与Vertex AI Gemini的配置与调优实战 一、前沿技术:多模态模型的企业级配置范式 在生成式AI技术快速迭代的当下,企业级应用对模型配置的精细化需求日益增长。Vertex AI Gemini作为Google推出的多模态大模型&…...
大语言模型RLHF训练框架全景解析:OpenRLHF、verl、LLaMA-Factory与SWIFT深度对比
引言 随着大语言模型(LLM)参数规模突破千亿级,基于人类反馈的强化学习(RLHF)成为提升模型对齐能力的关键技术。OpenRLHF、verl、LLaMA-Factory和SWIFT作为开源社区的四大标杆框架,分别通过分布式架构、混合…...

开源AI数字人分身克隆小程序源码系统深度剖析:从搭建到应用
在人工智能与小程序生态深度融合的当下,开源 AI 数字人分身克隆小程序源码成为开发者的热门工具。从搭建基础环境到实现实际应用,这一过程涉及多项技术与复杂流程。本文将带您深入剖析开源 AI 数字人分身克隆小程序源码,揭开其从搭建到应用的…...

ETL背景介绍_1:数据孤岛仓库的介绍
1 ETL介绍 1.1 数据孤岛 随着企业内客户数据大量的涌现,单个数据库已不再足够。为了储存这些数据,公司通常会建立多个业务部门组织的数据库来保存数据。比如,随着数据量的增长,公司通常可能会构建数十个独立运行的业务数据库&am…...

Linux系统:虚拟文件系统与文件缓冲区(语言级内核级)
本节重点 初步理解一切皆文件理解文件缓冲区的分类用户级文件缓冲区与内核级文件缓冲区用户级文件缓冲区的刷新机制两级缓冲区的分层协作 一、虚拟文件系统 1.1 理解“一切皆文件” 我们都知道操作系统访问不同的外部设备(显示器、磁盘、键盘、鼠标、网卡&#…...

智能体的典型应用:自动驾驶、智能客服、智能制造、游戏AI与数字人技术
本文为《React Agent:从零开始构建 AI 智能体》专栏系列文章。 专栏地址:https://blog.csdn.net/suiyingy/category_12933485.html。项目地址:https://gitee.com/fgai/react-agent(含完整代码示例与实战源)。完整介绍…...
【技巧】使用UV创建python项目的开发环境
回到目录 【技巧】使用UV创建python项目的开发环境 0. 为什么用UV 下载速度快、虚拟环境、多版本python支持、清晰的依赖关系 1. 安装基础软件 1.1. 安装python 下载地址:https://www.python.org/downloads/windows/ 1.2. 安装UV > pip install uv -i ht…...
什么是时序数据库?
2025年5月13日,周二清晨 时序数据库(Time Series Database,TSDB)是一种专门用于高效存储、管理和分析时间序列数据的数据库系统。时间序列数据是指按时间顺序记录的数据点,通常包含时间戳和对应的数值或事件࿰…...
react父组件往孙子组件传值Context API
步骤: 创建一个 Context 在父组件中用 Provider 提供值 在孙子组件中用 useContext 消费值 // 创建 Context const MyContext React.createContext();// 父组件 const Parent () > {const value "Hello from parent";return (<MyContext.Provid…...
2025年第十六届蓝桥杯大赛软件赛C/C++大学B组题解
第十六届蓝桥杯大赛软件赛C/C大学B组题解 试题A: 移动距离 问题描述 小明初始在二维平面的原点,他想前往坐标(233,666)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用: 水平向右移动…...

国联股份卫多多与七腾机器人签署战略合作协议
5月13日,七腾机器人有限公司(以下简称“七腾机器人”)市场部总经理孙永刚、销售经理吕娟一行到访国联股份卫多多,同卫多多/纸多多副总裁、产发部总经理段任飞,卫多多机器人产业链总经理郭碧波展开深入交流,…...
python学习笔记七(文件)
文章目录 Python 文件操作与异常处理全面指南一、文件基本知识1. 文件类型2. 文件操作基本步骤 二、文件操作1. 打开文件2. 读取文件内容3. 写入文件4. 关闭文件5. 使用with语句(推荐) 三、CSV文件操作1. 使用csv模块2. 读取CSV文件3. 写入CSV文件 四、异…...

WebGL 开发的前沿探索:开启 3D 网页的新时代
你是否曾好奇,为何如今网页上能呈现出如同游戏般逼真的 3D 场景?这一切都要归功于 WebGL。它看似神秘,却悄然改变着我们浏览网页的体验。以往,网页内容大多局限于二维平面,可 WebGL 打破了这一限制。它究竟凭借什么&am…...
高防服务器部署实战:从IP隐匿到协议混淆
1. IP隐匿方案设计 传统高防服务器常因源站IP暴露遭针对性攻击,群联通过三层架构实现深度隐藏: 流量入口层:域名解析至动态CNAME节点(如ai-protect.example.com)。智能调度层:AI模型分配清洗节点…...

激光雷达定位算法在FPGA中的实现——section3 Matlab实现和校验
1、校验section2的计算方法是否正确 以section1里面的图示 举个例子: 1.1 手动计算...

AI+可视化:数据呈现的未来形态
当AI生成的图表开始自动“美化”数据,当动态可视化报告能像人类一样“讲故事”,当你的眼球运动直接决定数据呈现方式——数据可视化的未来形态,正在撕裂传统认知。某车企用AI生成的3D可视化方案,让设计师集体失业;某医…...

[免费]微信小程序医院预约挂号管理系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端),分享下哈。 项目视频演示 【免费】微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩…...

【网络入侵检测】基于源码分析Suricata的IP分片重组
【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全,欢迎关注与评论。 目录 目录 1.概要 2. 配置信息 2.1 名词介绍 2.2 defrag 配置 3. 代码实现 3.1 配置解析 3.1.1 defrag配置 3.1.2 主机系统策略 3.2 分片重组模块 3.2.1…...
Spring框架请求注解
Spring框架请求注解 1.RequestParam 作用:从请求的 查询参数(Query Parameters) 或 表单数据(Form Data) 中提取参数。适用场景: GET 请求的 URL 参数(如 /users?nameTom&age20ÿ…...