当前位置:首页 > 技术 > 正文内容

使用 .NET MAUI 构建跨平台移动应用实战指南

访客 技术 2026年6月27日 1

在现代移动开发中,跨平台框架已成为构建高效应用的关键选择。.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 让开发者能够专注于功能实现而非平台差异。无论构建简单工具或复杂企业应用,它都提供了可靠的跨平台开发路径。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。