百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

MAUI Blazor 项目实战 - 从0到1轻松构建多平台应用UI

toqiye 2024-12-08 18:53 20 浏览 0 评论


前言

最近在项目中尝鲜了MAUI,总体感受下来还是挺不错的,优缺点并存,但是瑕不掩瑜,目前随着.Net版本的迭代升级对它的支持也越来越友好,相信未来可期!感兴趣的朋友欢迎关注。文章中如有不妥的地方,也请多多指教。

项目效果图


什么是.NET MAUI?

网上关于MAUI介绍相关的内容也挺多的了,这里只做简单介绍。了解更多

.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。
使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。


什么是Blazor Hybrid?

Blazor Hybrid(混合),可以通过它在 ASP.NET Core 应用中使用 .NET 生成交互式客户端 Web UI。
使用 Blazor Hybrid 将桌面和移动本机客户端框架与 .NET 和 Blazor 结合使用。
在 Blazor Hybrid 应用中,Razor 组件在设备上本机运行。 组件通过本地互操作通道呈现到嵌入式 Web View 控件。 组件不在浏览器中运行,并且不涉及 WebAssembly。 Razor 组件可快速加载和执行代码,组件可通过 .NET 平台完全访问设备的本机功能。


Blazor Hybrid 应用与MAUI

Blazor Hybrid 支持内置于 MAUI 框架 。.NET MAUI 包含 BlazorWebView 控件,该控件运行将 Razor 组件 呈现到嵌入式 Web View 中。 通过结合使用 .NET MAUI 和 Blazor,可以跨移动设备、桌面设备和 Web 重复使用一组 Web UI 组件。


项目准备

  • .Net 7
  • Visual Studio 2022


项目搭建

MultiPlatform.Blazor


MultiPlatform.Maui


MultiPlatform.Server


整个项目结构如下:


项目整体思路就是将Blazor UI样式抽离至 MultiPlatform.Blazor(Razor类库)项目中,MultiPlatform.Maui(安卓、IOS等)项目用来构建多端应用,MultiPlatform.Server 则用来跑Web,可以方便我们调整样式。

1.抽离 MultiPlatform.Maui UI 至 MultiPlatform.Blazor

  1. 添加 MultiPlatform.Blazor 项目引用
  2. 文件抽离过去后注意调整命名空间,直接调整 MultiPlatform.Blazor 项目的 _Imports.razor即可。
@using Microsoft.AspNetCore.Components.Web
@using MultiPlatform.Blazor.Shared
@using Microsoft.AspNetCore.Components.Routing
@using MultiPlatform.Blazor.Data
  1. 因为我们将Main.razor文件抽离到了 MultiPlatform.Blazor,所以我们还需要调整 MultiPlatform.Maui项目中的 MainPage.xaml 文件:(相关知识点参考)

BlazorWebView 项目模板创建的 在 MainPage.xaml 中定义,并指向 Blazor 应用的根:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MultiPlatform.Maui"
             x:Class="MultiPlatform.Maui.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <BlazorWebView x:Name="blazorWebView" HostPage="wwwroot/index.html">
        <BlazorWebView.RootComponents>
            <RootComponent Selector="#app" ComponentType="{x:Type local:Main}" />
        </BlazorWebView.RootComponents>
    </BlazorWebView>

</ContentPage>

应用的根 Razor 组件 位于 Main.razor 中,Razor 将其编译为应用程序根命名空间中名为 Main 的类型。 其余 Razor 组件位于页面和共享项目文件夹中,与默认 Blazor Web 模板中使用的组件相同。 应用的静态 Web 资产位于 wwwroot 文件夹中。

MainPage.xaml:


2.调整 MultiPlatform.Server项目

1.移除 MultiPlatform.ServerMainLayout 文件
2.更改App.razor 文件,使用 AdditionalAssemblies 加载 MultiPlatform.Blazor 程序集
3.添加 MultiPlatform.Blazor 项目引用


最后项目结构调整如下:


到此,比较基础的多端应用就搭建完成了。
下面我们再试试应用一个Blazor框架到我们的项目中。

MASA Blazor MAUI

了解MASA Blazor


1.MultiPlatform.Blazor 项目安装 MASA Blazor Nuget包


Server 项目Program.cs文件与Maui项目的MauiProgram.cs文件中注册相关服务

builder.Services.AddMasaBlazor();


2.MultiPlatform.Server 项目 _Host.cshtml 文件与MultiPlatform.Maui 项目的wwwroot/index.html引入样式、字体、脚本

<link href="_content/Masa.Blazor/css/masa-blazor.css" rel="stylesheet">
<link href="_content/Masa.Blazor/css/masa-extend-blazor.css" rel="stylesheet">
<link href="https://cdn.masastack.com/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.masastack.com/npm/materialicons/materialicons.css" rel="stylesheet">
<link href="https://cdn.masastack.com/npm/fontawesome/v5.0.13/css/all.css" rel="stylesheet">

<script src="_content/BlazorComponent/js/blazor-component.js"></script>

示例:



注:如果这里嫌麻烦也可以选用模板安装
模板使用示例,具体请移步 [开始使用MASA Blazor]
(https://docs.masastack.com/blazor/getting-started/installation#section-81ea52a85b8988c5)

//安装 Masa.Template 模板(目前1.0还没发正式版,所以是Masa.Template::1.0.0-rc.1,但不影响使用)
dotnet new install Masa.Template::1.0.0-rc.1

//创建masablazor-maui 模板
dotnet new masablazor-maui -o MauiApp


3.替换 MultiPlatform.Blazor 项目的Shared/MainLayout文件代码

这里使用MASA Blazor框架中的 App bars(应用栏)组件与 Navigation drawers(导航抽屉)组件替换了原来的bootstrap样式

@inherits LayoutComponentBase
<MApp>
    <MAppBar App Elevation="2">
        <MAppBarNavIcon @onclick="() => _drawer = !_drawer"></MAppBarNavIcon>
        <MToolbarTitle>CrossPlatformApp</MToolbarTitle>
        <MSpacer></MSpacer>
        <MButton Text Color="primary" Target="_blank" Href="https://docs.masastack.com/blazor/introduction/why-masa-blazor">About</MButton>
    </MAppBar>

    <MNavigationDrawer App @bind-Value="_drawer">
        <MList Nav Routable>
            <MListItem Href="/" ActiveClass="primary--text">
                <MListItemIcon>
                    <MIcon>mdi-home</MIcon>
                </MListItemIcon>
                <MListItemContent>
                    <MListItemTitle>Home</MListItemTitle>
                </MListItemContent>
            </MListItem>
            <MListItem Href="/counter" ActiveClass="primary--text">
                <MListItemIcon>
                    <MIcon>mdi-plus</MIcon>
                </MListItemIcon>
                <MListItemContent>
                    <MListItemTitle>Counter</MListItemTitle>
                </MListItemContent>
            </MListItem>
            <MListItem Href="/fetchdata" ActiveClass="primary--text">
                <MListItemIcon>
                    <MIcon>mdi-list-box</MIcon>
                </MListItemIcon>
                <MListItemContent>
                    <MListItemTitle>Fetch data</MListItemTitle>
                </MListItemContent>
            </MListItem>
        </MList>
    </MNavigationDrawer>
    <MMain>
        <MContainer Fluid>
            <MErrorHandler>
                @Body
            </MErrorHandler>
        </MContainer>
    </MMain>
</MApp>

@code {
    private bool _drawer;
}


4.更改 MultiPlatform.Blazor 服务的 Pages/Index.razor 文件代码

增加 Bottom navigation (底部导航栏) 组件

@page "/"

<Container>
    <MRow>
        <h1>Hello, world!</h1>

        Welcome to your new app.

        <SurveyPrompt Title="How is Blazor working for you?" />

        <MBottomNavigation @bind-Value="value"
                           Color="teal"
                                  Fixed
                           Style="display:flex"
                                  Grow>
            <MButton>
                <span>Recents</span>
                <MIcon>mdi-history</MIcon>
            </MButton>

            <MButton>
                <span>Favorites</span>
                <MIcon>mdi-heart</MIcon>
            </MButton>

            <MButton>
                <span>Nearby</span>
                <MIcon>mdi-map-marker</MIcon>
            </MButton>
        </MBottomNavigation>
    </MRow>

</Container>

@code {
    StringNumber value = 1;
}

看看效果:


到此,基本上大功告成了。

结尾

文章中的示例比较基础,基本上直接cv过去就可以用,还是比较适合新手朋友上手的。
最后由于文章篇幅有限,对MAUI与Blazor感兴趣的朋友可自行深入研究。
后续系列文章都会基于这个Demo项目进行分享,欢迎关注。

源码地址

https://github.com/fengzhonghao8-24/MultiPlatformApp

相关推荐

国产web端开源ui组件-通用前端ui界面组件库

写个序吧:随着工作的不断深入,越来越发现很多好的前端开源项目都来自于国外,国产的开源项目很多时候面临叫好不叫座甚至有很多就消失不见了。开源和创新,不仅仅是需要我们的参与同样也需要我们不断地传播,因此才...

微信小程序商城项目,包括,分销,团购,秒杀,优惠券惠源码分享

源码获取,关注转发文章之后私信回复【源码】即可免费获取到!小程序商城,包括:分销(支持三级)、团购(拼多多模式)、秒杀、优惠券、等功能技术框架核心框架:SpringFramework4安全框架:A...

VUE3前端开发入门系列教程

一直以来使用ThinkJS开发,使用Semantic-UI手写代码,又缺少一些table等插件,好累。平时使用NodeJS开发后端较多,一直有接触VUE想法,总是不得入门(可能是思维固化了),再次深入...

支持分销、团购、秒杀、优惠券、微信商城项目,源码免费分享

小程序商城,包括:分销(支持三级)、团购(拼多多模式)、秒杀、优惠券、等功能如果您需要用到这个微信小程序的源码,欢迎关注转发之后私信【源码】来免费获取到!面向对象Open-Shop是企业在创立初期很好...

在Gitee获8.5k Star,做微信小程序商城看这一个开源项目就够了

商城系统是小程序中比较热门的类型,许多开发者在寻找商城类小程序项目时,都会遇到一些声称「开源」但是并不是完全开源,有时候还会收费的项目。今天Gitee介绍的这款微信小程序商城项目就是一款从前端到后...

七款国内免费开源PHP CMS推荐,无限制,可商用

自织梦cms收费后,很多使用dedecms的站长都转移到了别的cms系统上,上一期也给大家分享了几款国外开源cms系统,今天来给大家分享几款国内的免费且可商用的phpcms系统:PbootCmsPb...

VUE3前端开发入门系列教程二:使用iView框架辅助开发

1、安装iView新框架,支持VUE3npminstallview-ui-plus2、编辑src/main.js,添加以下内容,导入js和css到项目importViewUIPlusfrom...

TS 真正比 JS 强大的那些特性

在前端开发领域,JavaScript(JS)一直是当之无愧的武林盟主,凭借灵活多变的特性和超广泛的兼容性打下大片江山。然而,随着前端应用日益复杂,TypeScript(TS)这位后起之秀崛起,以独特优...

自写一个函数将js对象转为Ts的Interface接口

如今的前端开发typescript已经成为一项必不可以少的技能了,但是频繁的定义Interface接口会给我带来许多工作量,我想了想如何来减少这些非必要且费时的工作量呢,于是决定写一个函数,将对象放进...

如何优雅地校验后端接口数据,不做前端背锅侠

背景最近新接手了一批项目,还没来得及接新需求,一大堆bug就接踵而至,仔细一看,应该返回数组的字段返回了null,或者没有返回,甚至返回了字符串"null"???这我能忍?我立刻截...

正点原子I.MX6U嵌入式Linux C应用编 第十八章 输入设备应用编程

输入设备应用编程本章学习...

Python时间序列分析:使用TSFresh进行自动化特征提取

TSFresh(基于可扩展假设检验的时间序列特征提取)是一个专门用于时间序列数据特征自动提取的框架。该框架提取的特征可直接应用于分类、回归和异常检测等机器学习任务。TSFresh通过自动化特征工程流程...

人教版八下数学第十九章《一次函数》辅导(6)一次函数(1)

人教版八下数学第十九章《一次函数》辅导(6)一次函数(1)一、生活中的一次函数探究1(1)一个小球由静止开始沿一个斜坡向下滚动,其速度每秒增加2m/s,若小球的速度为vm/s,运动时间为ts,求v关于...

笔记|Simulink中S函数的设计

S函数的简介S函数是Simulink中提供给用户的一个自定义模块,由于在研究过程中经常需要复杂的算法设计,Simulink中提供的模块无法满足使用,就需要用编程的形式设计出S函数模块,然后嵌入到系统中...

初探HarmonyOS开发,ArkTS语言初看

最近在研究HarmonyOS(鸿蒙操作系统)开发,HarmonyOS(鸿蒙操作系统)想必大家都不陌生了,但是我也是在该系统发布许久后才首次尝试上手开发,因为有写java后台的经验,也算是能堪堪上手。据...

取消回复欢迎 发表评论: