使用 .NET MAUI 构建跨平台移动应用实战指南
在现代移动开发中,跨平台框架已成为构建高效应用的关键选择。.NET MAUI(Multi-platform App UI) 结合了 Xamarin 的成熟生态和 .NET 6+ 的现代化特性,为开发者提供了构建高性能、一致用户体验的强大工具。
为何选用 MAUI?
相比传统的 Android 和 iOS 分别开发模式,MAUI 提供了一种更高效的替代方案:
- 统一的 XAML 布局语言与 C# 业务逻辑
- 支持 Windows、Android、iOS 和 macOS 多平台部署
- 原生控件渲染,确保性能表现接近原生开发
- 内置对 Entity Framework Core 和依赖注入的支持
初始化 MAUI 工程
dotnet new maui -n ShopManager
cd ShopManager
dotnet run
该命令将生成如下基本目录结构:
ShopManager/
├── Views/
│ └── MainView.xaml
├── Models/
│ └── OrderModel.cs
├── Data/
│ └── OrderRepository.cs
└── Assets/
└── Icons/
定义数据模型
// Models/OrderModel.cs
public class OrderModel
{
public int OrderId { get; set; }
public string Name { get; set; }
public decimal Amount { get; set; }
public DateTime Date { get; set; }
}
使用 XAML 设计界面
<!-- Views/MainView.xaml -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ShopManager.Views.MainView">
<StackLayout Padding="20">
<Label Text="订单管理系统" FontSize="Title"/>
<CollectionView ItemsSource="{Binding Orders}"
SelectionChanged="OnItemSelected">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="*, Auto">
<Label Grid.Column="0"
Text="{Binding Name}"/>
<Label Grid.Column="1"
Text="{Binding Amount, StringFormat='{0:C}'}"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
</ContentPage>
集成本地数据库
通过 EF Core 实现 SQLite 数据存储:
添加依赖包
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
配置数据库上下文
// Data/AppDbContext.cs
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public DbSet<OrderModel> Orders { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlite("Data Source=appdata.db");
}
}
绑定数据到视图
// Views/MainView.xaml.cs
public partial class MainView : ContentPage
{
private readonly AppDbContext _db;
public ObservableCollection<OrderModel> Orders { get; set; }
public MainView()
{
InitializeComponent();
_db = new AppDbContext();
Orders = new ObservableCollection<OrderModel>();
LoadData();
BindingContext = this;
}
private void LoadData()
{
var items = _db.Orders.ToList();
foreach (var item in items)
{
Orders.Add(item);
}
}
private async void OnItemSelected(object sender, SelectionChangedEventArgs e)
{
if (e.CurrentSelection.FirstOrDefault() is OrderModel selected)
{
await DisplayAlert("订单详情", $"商品:{selected.Name}\n金额:{selected.Amount:C}", "关闭");
}
}
}
应用启动流程解析
[点击应用图标]
↓
[App.xaml.cs 初始化全局资源]
↓
[加载 MainView 页面]
↓
[实例化 ViewModel 并绑定数据源]
↓
[查询 SQLite 数据并更新 UI]
↓
[用户交互触发事件回调]
性能优化策略
| 场景 | 优化方法 |
|---|---|
| 长列表展示 | 采用 CollectionView 并开启虚拟化 |
| 图片加载 | 使用 ImageSource.FromUri 或 FFImageLoading 库 |
| 耗时操作 | 异步处理任务,避免阻塞主线程 |
// 示例:异步加载数据
private async Task RefreshOrdersAsync()
{
await Task.Delay(1000); // 模拟网络延迟
var results = await _db.Orders.ToListAsync();
Orders.Clear();
foreach (var order in results)
{
Orders.Add(order);
}
}
单元测试支持
// Tests/OrderServiceTests.cs
[TestFixture]
public class OrderServiceTests
{
[Test]
public void AddNewOrder_ShouldIncreaseListCount()
{
var repo = new OrderRepository();
var order = new OrderModel { Name = "iPad", Amount = 3999 };
repo.Add(order);
Assert.IsTrue(repo.GetAll().Count > 0);
}
}
多平台打包指令
# Android
dotnet publish -f net8.0-android
# iOS
dotnet publish -f net8.0-ios
# Windows
dotnet publish -f net8.0-windows10.0.19041.0
MAUI 让开发者能够专注于功能实现而非平台差异。无论构建简单工具或复杂企业应用,它都提供了可靠的跨平台开发路径。