.NET 6 Gets Blazor WebView Controls for WPF, WinForms提到.NET 6 Preview 3为WPF和WinForms提供了BlazorWebView。有点好奇BlazorWebView到底是什么。
有个Github项目https://github.com/jspuij/TwokaB为以下平台创建了BlazorWebview:
- Xamarin Android (running on the Mono runtime)
- Xamarin iOS (running on the Mono runtime)
- Xamarin Mac (running on the Mono runtime)
- WPF (running on the .NET Core runtime)
相关文档在https://jspuij.github.io/BlazorWebView.Docs/pages/index.html。
从项目介绍上看,此BlazorWebview的功能已经并入https://github.com/xamarin/MobileBlazorBindings,并在https://devblogs.microsoft.com/aspnet/hybrid-blazor-mobile-blazor-bindings-july-update/中可见。
同时该项目还提到,其灵感来自于Steve Sanderson的博客文章:Meet WebWindow, a cross-platform webview library for .NET Core
Meet WebWindow, a cross-platform webview library for .NET Core
制作了一个WebWindow可以用于.NET Core console app。
文中还是有不少例子的。
Exploring lighter alternatives to Electron for hosting a Blazor desktop app
对Electron做了介绍:2014年开源,自带Chromium,NodeJS,提供了一套跨平台API。
Blazor on Electron的一个试验项目: https://github.com/aspnet/AspLabs/tree/master/src/ComponentsElectron。不运行于WebAssembly之中,而是以.NET Core的runtime作为运行时。
Blazor on pure webview的一个试验项目:https://github.com/steveSandersonMS/BlazorDesktop。采用系统自带的Webview以及.NET runtime。.NET项目的好处是可以很容易设置为standalone或者framework-dependent。后者的体积会非常小。
小结
Incremental DOM
Blazor所作的事,简单地说是管理DOM状态。当所管理的状态发生变化时,将差异部分应用到真实的DOM上。根据https://blazor-university.com/components/render-trees/,Blazor有自己的RenderTree,既像Virtual DOM,又像Incremental DOM。
从谷歌的这个项目https://github.com/google/incremental-dom看来,Incremental DOM没有居中的树形数据结构,而是直接在前线操作DOM树。(Think of it as ASM.dom)。但https://blazor-university.com/components/render-trees/提到了Incremental DOM和谷歌的这个项目可能不是一个东西。
Blazor采用的是局部更新,如果通过浏览器的Inspector修改了DOM,Blazor的更新会失败。
其他参考:
- Understanding Angular Ivy: Incremental DOM and Virtual DOM
- Incremental vs Virtual DOM
- Although Incremental DOM reduces memory usage by following a more efficient method to calculate the difference, that method is more time-consuming than Virtual DOM.
Blazor的应用形式
现在Blazor有几种应用形式。感觉其中最重要的差别在于Blazor所依赖的.NET运行时在何处提供:
- BlazorWebAssembly
- .NET运行时采用Mono,部署在浏览器中,通过SignalR与前端交互
- BlazorServer
- .NET运行时采用CoreCLR,部署在云端,通过JS interop与前端交互
- BlazorDesktop
- .NET运行时采用App自带的CLR,通过Webview interop与前端交互
(本篇完)
2022-10-14 Host a Blazor web app in a .NET MAUI app using BlazorWebView
.NET MAUI应用支持BlazorWebView控件。Razor组件跑在.NET的进程中,但把web UI发送到webview中。
BlazorWebView有下列辖属
- HostPage,定义了Blazor应用的根页面
- RootComponents,指定了需要添加到页面的根组件,具有下面辖属
- Selector,是一个CSS选择器,指定在页面中的哪个位置放置组件
- ComponentType,给出根组件的类型
- Parameters, 给出传递给根组件的参数
BlazorWebView还定义了下面的事件:
- BlazorWebViewInitializing,初始化之前触发,可以用于自定义一些设置
- BlazorWebViewInitialized,初始化之后,渲染之前触发,
- UrlLoading,超链接被点击的时候触发
Create a .NET MAUI Blazor app
可以直接在VS中的.NET MAUI Blazor app创建工程。
<BlazorWebView HostPage="wwwroot/index.html">
<BlazorWebView.RootComponents>
<RootComponent Selector="#app" ComponentType="{x:Type local:Main}" />
</BlazorWebView.RootComponents>
</BlazorWebView>
Add a BlazorWebView to an existing app
添加RazorSDK到csproj:
<Project Sdk="Microsoft.NET.Sdk.Razor">
添加Razor组件到Pages以及Shared。
添加静态内容到wwwroot。
可选添加_Imports.razor
。
添加BlazorWebView到XAML。
添加BlazorWebView到MAUI:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
builder.Services.AddMauiBlazorWebView();
#if DEBUG
builder.Services.AddMauiBlazorWebViewDeveloperTools();
#endif
// Register any app services on the IServiceCollection object
// e.g. builder.Services.AddSingleton<WeatherForecastService>();
return builder.Build();
}
}
(更新完)
2022-10-23更新
- From Web to Native with .NET MAUI and Blazor | .NET Conf: Focus on MAUI
- https://github.com/microsoft/dotnet-podcasts
(更新完)