国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

南京企業(yè)建設(shè)網(wǎng)站設(shè)計(jì)網(wǎng)絡(luò)推廣都是收費(fèi)

南京企業(yè)建設(shè)網(wǎng)站設(shè)計(jì),網(wǎng)絡(luò)推廣都是收費(fèi),貴州能源網(wǎng)站 中企動力建設(shè),浙江省臺州市做網(wǎng)站多少錢Blazor 混合開發(fā)_MAUIVue_WPFVue 背景混合開發(fā)的核心為什么必須使用 wwwroot 文件夾放置 Web 項(xiàng)目文件 創(chuàng)建 MAUI 項(xiàng)目創(chuàng)建 wwwroot 文件夾服務(wù)注冊創(chuàng)建 _import.razor添加 Main.razor 組件修改 MainPage.xaml 文件 創(chuàng)建 WPF 項(xiàng)目創(chuàng)建 wwwroot 文件夾服務(wù)注冊創(chuàng)建 _import.razo…

Blazor 混合開發(fā)_MAUI+Vue_WPF+Vue

  • 背景
    • 混合開發(fā)的核心
    • 為什么必須使用 wwwroot 文件夾放置 Web 項(xiàng)目文件
  • 創(chuàng)建 MAUI 項(xiàng)目
    • 創(chuàng)建 wwwroot 文件夾
    • 服務(wù)注冊
    • 創(chuàng)建 _import.razor
    • 添加 Main.razor 組件
    • 修改 MainPage.xaml 文件
  • 創(chuàng)建 WPF 項(xiàng)目
    • 創(chuàng)建 wwwroot 文件夾
    • 服務(wù)注冊
    • 創(chuàng)建 _import.razor
    • 添加 Shell.razor 組件
    • 修改 MainWindow.xaml 文件
  • 創(chuàng)建 Vue 項(xiàng)目
    • 修改創(chuàng)建好的 Vue 項(xiàng)目
    • 執(zhí)行 npm run build 命令
    • Copy dist
    • 修改 index.html 內(nèi)容
  • 效果預(yù)覽
  • Demo 下載

背景

??在 MAUI 微軟的官方方案是使用 Blazor 開發(fā),但是當(dāng)前市場大多數(shù)的 Web 項(xiàng)目使用 Vue、React 等技術(shù)構(gòu)建,用Blazor重寫整個(gè)項(xiàng)目并不現(xiàn)實(shí)。

??Vue 是當(dāng)前流行的 Web 框架, 簡單來說是一套模板引擎,利用 “模板” 和 “綁定” 兩大特性實(shí)現(xiàn)Web頁面 MVVM 模式開發(fā)。利用 .NET MAUI 框架可以將 Vue 應(yīng)用嵌入到 Web 容器中,可以實(shí)現(xiàn)跨平臺的混合開發(fā)。

混合開發(fā)的核心

  • 混合開發(fā)的核心工作是構(gòu)建 Web 與 .NET 的互操作,我們將利用 Blazor 引擎的如下功能:
    • 資源的統(tǒng)一管理
    • js 代碼的注入
    • js 調(diào)用 C# 代碼
    • C# 調(diào)用 js 代碼

為什么必須使用 wwwroot 文件夾放置 Web 項(xiàng)目文件

這個(gè)文件夾將是混合開發(fā)Web部分的根目錄,這個(gè)名稱不能隨便定義
在這里插入圖片描述

Microsoft.AspNetCore.Components.WebView.Maui 庫會將 wwwroot 文件夾里的內(nèi)容作為 Maui 資源(MauiAsset)類型設(shè)置標(biāo)簽,編譯器則會根據(jù) MauiAsset 標(biāo)簽將這些內(nèi)容打包進(jìn)各個(gè)平臺的資源文件夾。

創(chuàng)建 MAUI 項(xiàng)目

項(xiàng)目名字 MAUI.Vue.hybirddev
在這里插入圖片描述
創(chuàng)建完成后編輯Hybrid.Maui.csproj,在Sdk最末尾加上.Razor,VS 會自動安裝Microsoft.AspNetCore.Components.WebView.Maui 依賴包
不要手動 Nuget 添加這個(gè)包,否則程序無法運(yùn)行
在這里插入圖片描述
在這里插入圖片描述

創(chuàng)建 wwwroot 文件夾

創(chuàng)建之后會自動變成網(wǎng)絡(luò)資源文件夾在這里插入圖片描述

服務(wù)注冊

  • 使用擴(kuò)展方法 builder.Services.AddMauiBlazorWebView() 對 BlazorMauiWebView 組件服務(wù)進(jìn)行注冊
using Microsoft.Extensions.Logging;namespace MAUI.Vue.hybirddev
{public static class MauiProgram{public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureFonts(fonts =>{fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");});builder.Services.AddMauiBlazorWebView(); // 注冊#if DEBUGbuilder.Services.AddBlazorWebViewDeveloperTools();builder.Logging.AddDebug();
#endifreturn builder.Build();}}
}

創(chuàng)建 _import.razor

添加 → 類 → Razor 組件
在這里插入圖片描述
導(dǎo)入 namespace

@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using Hybrid.Maui @*當(dāng)前項(xiàng)目名稱*@

添加 Main.razor 組件

  • 被JS調(diào)用的方法必須是靜態(tài)的
  • Dispose 銷毀頁面資源,防止內(nèi)存溢出
@inject IJSRuntime JSRuntime
@implements IDisposable@code {[JSInvokable]public static Task<string> Test(){return Task.FromResult("Maui Test Function");}public void Dispose(){}
}

修改 MainPage.xaml 文件

建立 BlazorWebView 控件鋪滿屏幕,并設(shè)置 HostPage 為Web部分的主頁 index.html

<?xml version="1.0" encoding="utf-8" ?>
<ContentPagex:Class="Hybrid.Maui.MainPage"xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:Hybrid.Maui"Shell.NavBarIsVisible="False"><BlazorWebView HostPage="wwwroot/index.html"><BlazorWebView.RootComponents><RootComponent ComponentType="{x:Type local:Main}" Selector="#blazorApp" /></BlazorWebView.RootComponents></BlazorWebView></ContentPage>

創(chuàng)建 WPF 項(xiàng)目

項(xiàng)目名字 Hybrid.Wpf
在這里插入圖片描述
創(chuàng)建完成后編輯Hybrid.Wpf.csproj,在Sdk最末尾加上.Razor
同時(shí)在項(xiàng)目文件的現(xiàn)有 <PropertyGroup> 中,添加 <RootNamespace>Hybrid.Wpf</RootNamespace> 標(biāo)記
在這里插入圖片描述

安裝 Nuget 包 Microsoft.AspNetCore.Components.WebView.Wpf
在這里插入圖片描述

創(chuàng)建 wwwroot 文件夾

創(chuàng)建之后會自動變成網(wǎng)絡(luò)資源文件夾
在這里插入圖片描述

服務(wù)注冊

  • 通過依賴注入容器注入 AddWpfBlazorWebView() 服務(wù)
  • 在資源中添加已注冊的服務(wù) Resources.Add("services", Services)
  • 刪除App.xaml 中的 StartupUri="MainWindow.xaml"
using System.Windows;
using Microsoft.Extensions.DependencyInjection;namespace Hybrid.Wpf
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{public App(){Services = ConfigureServices();Resources.Add("services", Services);}public new static App Current => (App)Application.Current;public IServiceProvider Services { get; }protected override void OnStartup(StartupEventArgs e){Services.GetRequiredService<MainWindow>().Show();}private static IServiceProvider ConfigureServices(){var serviceCollection = new ServiceCollection();serviceCollection.AddSingleton<MainWindow>();serviceCollection.AddWpfBlazorWebView();#if DEBUGserviceCollection.AddBlazorWebViewDeveloperTools();
#endifreturn serviceCollection.BuildServiceProvider();}}
}

創(chuàng)建 _import.razor

添加 → 類 → Razor 組件
在這里插入圖片描述
導(dǎo)入 namespace

@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using Hybrid.Wpf @*Object Namespace*@

添加 Shell.razor 組件

  • 被JS調(diào)用的方法必須是靜態(tài)的
  • Dispose 銷毀頁面資源,防止內(nèi)存溢出
@inject IJSRuntime JSRuntime
@implements IDisposable@code {[JSInvokable]public static Task<string> Test(){return Task.FromResult("Wpf Test Function");}public void Dispose(){}
}

修改 MainWindow.xaml 文件

建立 BlazorWebView 控件鋪滿屏幕,并設(shè)置 HostPage 為Web部分的主頁 index.html

<Windowx:Class="Hybrid.Wpf.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:blazor="clr-namespace:Microsoft.AspNetCore.Components.WebView.Wpf;assembly=Microsoft.AspNetCore.Components.WebView.Wpf"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:Hybrid.Wpf"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="Hybrid.Wpf"d:Height="200"d:Width="450"WindowStartupLocation="CenterScreen"mc:Ignorable="d"><blazor:BlazorWebView HostPage="wwwroot\index.html" Services="{DynamicResource services}"><blazor:BlazorWebView.RootComponents><blazor:RootComponent ComponentType="{x:Type local:Shell}" Selector="#blazorApp" /></blazor:BlazorWebView.RootComponents></blazor:BlazorWebView></Window>

創(chuàng)建 Vue 項(xiàng)目

通過命令 npm create vue@latest 前提是已安裝 Node.js
在這里插入圖片描述

執(zhí)行命令嘗試運(yùn)行項(xiàng)目
在這里插入圖片描述

在這里插入圖片描述

修改創(chuàng)建好的 Vue 項(xiàng)目

DotNet.invokeMethodAsync("Hybrid.Maui", "Test") 第一個(gè)參數(shù)是容器項(xiàng)目的 Namespace,第二個(gè)參數(shù)是要調(diào)用的方法。

<script setup>
import { RouterLink, RouterView } from 'vue-router';
import HelloWorld from './components/HelloWorld.vue';/*** 訪問 Hybrid.Wpf 項(xiàng)目中的 Test 方法*/
async function getTest() {await DotNet.invokeMethodAsync("Hybrid.Maui", "Test").then(res => {console.log(res);});
}
</script><template><header><img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" /><div class="wrapper"><HelloWorld msg="You did it!" /><nav><RouterLink to="/">Home</RouterLink><RouterLink to="/about">About</RouterLink></nav><button @click="getTest">To Hybrid.Maui Test</button></div></header><RouterView />
</template><style scoped>
header {line-height: 1.5;max-height: 100vh;
}.logo {display: block;margin: 0 auto 2rem;
}nav {width: 100%;font-size: 12px;text-align: center;margin-top: 2rem;
}nav a.router-link-exact-active {color: var(--color-text);
}nav a.router-link-exact-active:hover {background-color: transparent;
}nav a {display: inline-block;padding: 0 1rem;border-left: 1px solid var(--color-border);
}nav a:first-of-type {border: 0;
}@media (min-width: 1024px) {header {display: flex;place-items: center;padding-right: calc(var(--section-gap) / 2);}.logo {margin: 0 2rem 0 0;}header .wrapper {display: flex;place-items: flex-start;flex-wrap: wrap;}nav {text-align: left;margin-left: -1rem;font-size: 1rem;padding: 1rem 0;margin-top: 1rem;}
}
</style>

執(zhí)行 npm run build 命令

執(zhí)行 npm run build 命令發(fā)布 Vue 項(xiàng)目
在這里插入圖片描述

Copy dist

將 dist 文件夾下的所有文件復(fù)制到容器項(xiàng)目下的 wwwroot 文件夾下
在這里插入圖片描述

修改 index.html 內(nèi)容

  • JS、CSS 文件名一定要與編譯后的文件名一致
  • head 中的 JS 導(dǎo)入添加 crossorigin="anonymous" 跨域支持
  • 在 body 中導(dǎo)入 _framework/blazor.webview.js 必須的,沒有它玩不成
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="icon" href="/favicon.ico"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vite App</title><script type="module" crossorigin="anonymous" src="/assets/index-lGWBURTF.js"></script><link rel="stylesheet" crossorigin href="/assets/index-bTbjHxa7.css">
</head>
<body><div id="app">Loading...</div><div id="blazorApp"></div><!-- Maui 項(xiàng)目需要添加 autostart="false" --><script src="_framework/blazor.webview.js" autostart="false"></script><!-- Wpf 項(xiàng)目不需要 --><script src="_framework/blazor.webview.js"></script>
</body>
</html>

效果預(yù)覽

點(diǎn)擊 To Hydrid.Wpf Test 按鈕就可以在控制臺打印出 C# 代碼中的返回值
在這里插入圖片描述

Demo 下載

https://github.com/Gun319/Hybrid

http://aloenet.com.cn/news/44118.html

相關(guān)文章:

  • h5 技術(shù)做健康類網(wǎng)站網(wǎng)絡(luò)優(yōu)化公司有哪些
  • ipv6網(wǎng)站建設(shè)如何自制網(wǎng)站
  • 清河做網(wǎng)站軟文是什么意思
  • 網(wǎng)站開發(fā)需要20萬百度云網(wǎng)盤免費(fèi)資源
  • 合肥網(wǎng)站建設(shè)推廣友情鏈接怎么做
  • 西部數(shù)碼網(wǎng)站工具免費(fèi)建站平臺哪個(gè)好
  • 東陽網(wǎng)站建設(shè)dyfwzx友情鏈接吧
  • 沈陽網(wǎng)站建設(shè)建設(shè)公司排名優(yōu)化seo系統(tǒng)
  • 重慶網(wǎng)站設(shè)計(jì)公司價(jià)格丈哥seo博客工具
  • 如何搭建一個(gè)個(gè)人網(wǎng)站學(xué)校招生網(wǎng)絡(luò)營銷方案
  • 給公司網(wǎng)站設(shè)計(jì)寧波廠家關(guān)鍵詞優(yōu)化
  • 智聯(lián)招聘網(wǎng)站建設(shè)情況注冊城鄉(xiāng)規(guī)劃師好考嗎
  • jqueryui做的網(wǎng)站株洲seo排名
  • 寧波做網(wǎng)站的大公司排名關(guān)鍵詞搜索推廣排行榜
  • 如何免費(fèi)網(wǎng)站建設(shè)怎么可以在百度發(fā)布信息
  • 做網(wǎng)站運(yùn)營的女生多嗎百度公司簡介
  • 上海小微企業(yè)名錄查詢seo短視頻網(wǎng)頁入口營銷
  • 公司網(wǎng)站建設(shè)北京北京做百度推廣的公司
  • 網(wǎng)站開發(fā)用啥語言廣州各區(qū)正在進(jìn)一步優(yōu)化以下措施
  • 順德做網(wǎng)站公司seo搜狗
  • 網(wǎng)站后端怎么做河北網(wǎng)站建設(shè)公司排名
  • 手機(jī)模板網(wǎng)站模板鞏義網(wǎng)站優(yōu)化公司
  • 網(wǎng)頁的動態(tài)效果網(wǎng)店關(guān)鍵詞怎么優(yōu)化
  • 自己做網(wǎng)站需要服務(wù)器培訓(xùn)機(jī)構(gòu)查詢網(wǎng)
  • 自助申請海外網(wǎng)站長沙網(wǎng)絡(luò)公關(guān)公司
  • 傳統(tǒng)營銷渠道有哪些seo網(wǎng)站排名優(yōu)化培訓(xùn)教程
  • 網(wǎng)站建設(shè)及推廣銷售話術(shù)新app推廣方案
  • 衡陽公司做網(wǎng)站關(guān)鍵詞分類
  • 北京好的網(wǎng)站開發(fā)網(wǎng)站推廣 方法
  • 北京十佳網(wǎng)站建設(shè)廣告網(wǎng)站大全