上次说为了不想在web端登录博客园,我想着还是继续使用MarkWord编写博客,不过在使用的过程中,如果markdown文件的目录中有中文的话,Markdown预览就不能够显示粘贴的图片了,原因是之前.NET Framework的WeBrowser库太老了,应该升级一下。

替换WebBrowser的方案很多,在Stackoverflow上有人推荐使用WebView2,我就直接用了,也没有多想,实际上使用的问题还是不少的,简单记录一下。

WebView2

这个东西是微软推出基于Edge或者说是基于chromium内核的浏览器组件,可以提供现代的浏览器体验,用于集成到.NET程序中,实现.NET对web的访问与调用,或者反过来也行。这个东西感觉是CefSharp的有利竞争者呀,虽然我也没咋用过CefSharp

WebBrowser->WebView2

迁移的第一步是引用的替换,WebBrowser在System.Windows.Forms.WebBrowser命名空间,如果使用WPF的话,需要使用WindowsFormsHost,这个就体验不是那么好了,WPF下,有Microsoft.Web.WebView2.Wpf,可以提供给WPF原生的访问,赞一个。

访问DOM

然后就是出现的错误了,最难受的是,WebView2不提供对DOM的访问权限!,WebBrowser可以直接通过Document来访问DOM节点,而WebView2只能设置访问的Uri信息,然后控制导航与调用js。

为了实现动态的控制预览框的内容,访问DOM是必须的,如果我动态的渲染一个文件,然后随时再构造Uri,再传递到WebView2中,那太啰嗦了。由于这个东西可以直接调用JS,那么我们换一个思路:通过WebView2调用JS,然后使用Js操作DOM,曲线实现控制DOM的目标。废话不多说,直接上代码。

if (winWebDoc.CoreWebView2 == null)
return;
var script = "document.body.innerHTML = '" + Markdown.ToHtml(MarkValue, pipeline).Trim() + "'";
winWebDoc.ExecuteScriptAsync(script);

之前我也尝试过document.write的方法,发现有点问题,还是不能正常识别。

WebView2除了直接在传递js的函数体以外,还可以调用页面中的顶级JS函数,具体使用方法参见后面的参考文献或者园子里面的这篇文章,反正我这么使用之后中文目录的问题就解决了,不过右侧渲染如果有回车换行的话,就经常会卡死,好像是引擎就崩溃了。

替换默认换行

经过debug,发现WebView2在运行的过程中,需要渲染的html内,标签之间不能有\r\n之类的东西,如果有就寄了。而使用CommonMark.CommonMarkConverter.Convert方法转换的markdown文件都会有这个东西...

这个库时间也比较久远了,经过简单研究,我换成了Markdig这个库,二者兼容,而且Markdig还提供了更多定制的地方,我这里将所有的换行,替换为空字符。

 private MarkdownPipeline pipeline = new MarkdownPipelineBuilder()
.ConfigureNewLine("")
.Build();

这样,换行就没啥问题了,但是在初次使用时,会出现WebView2无法正常渲染的问题。

WebView2初始化

WebView2的初始化和其他的库有点不同,它提供了一个EnsureCoreWebView2Async的方法,对它的操作,请一定等这个方法返回。可以使用await,也可以和我一样,使用TPL。

 winWebDoc.EnsureCoreWebView2Async()
.ContinueWith(t =>
{
Dispatcher.Invoke(() =>
{
winWebDoc.Source = new Uri(System.IO.Path.Combine(Environment.CurrentDirectory, "index.html"));
});
});

注意我这里使用加载了一个本地的模板HTML文件,访问本地文件的时候,需要使用Uri的方式访问。

结语

经过了一番折腾,终于是能够继续使用MarkWord写博客了,虽然我更换了主题之后,滚动不是很利索了,另外渲染代码好像还有点问题,不过好歹能用了,以后再折腾吧。

参考资料

非常详细:https://weblog.west-wind.com/posts/2021/Jan/26/Chromium-WebView2-Control-and-NET-to-JavaScript-Interop-Part-2

.NET 6上的WebView2体验的更多相关文章

  1. 微信小程序基础之在微信上显示和体验小程序?

    随着小程序正式上线,用户现在可以通过二维码.搜索等方式体验到开发者们开发的小程序了. 用户只要将微信更新至最新版本,体验过小程序后,便可在发现页面看到小程序TAB,但微信并不会通过这个地方向用户推荐小 ...

  2. VR电竞游戏在英特尔®架构上的用户体验优化

    作为人与虚拟世界之间的新型交互方式,VR 能够让用户在模拟现实中获得身临其境的感受.但是,鉴于 VR 的帧预算为每帧 11.1ms (90fps),实现实时渲染并不容易,需要对整个场景渲染两次(一只眼 ...

  3. Docker在Windows上的初体验

    作为Docker的初学者,我有几个疑问,找到了答案,并实践了一下,希望对和我一样的初学者有帮助: 1.Docker是什么? 大家对虚拟机应该比较熟悉,虚拟机和docker都是为了实现隔离. 虚拟机隔离 ...

  4. 以Aliyun体验机为例,从零搭建LNMPR环境(上)

    使用云服务器搭建 Web 运行环境,尤其是搭建常见的 LNMPR(Linux+Nginx+MySQL+PHP+Redis) 环境,对于开发人员是必备的职场基本技能之一.在这里,借着搭建我的" ...

  5. .NET混合开发解决方案5 WebView2运行时与分发应用

    系列目录     [已更新最新开发文章,点击查看详细] 发布使用Microsoft Edge WebView2的应用程序时,客户端计算机上需要安装WebView2运行时,可以安装自动更新的Evergr ...

  6. .NET跨平台:在CentOS上编译dnx并运行ASP.NET 5示例程序

    在之前的博文中我们在 Ubuntu 上成功编译出了 dnx ,并且用它成功运行了 ASP.NET 5 示例程序.在这篇博文中我们将 Ubuntu 换成 CentOS. 目前 dnx 的编译需要用到 m ...

  7. 企业IT管理员IE11升级指南【7】—— Win7和Win8.1上的IE11功能对比

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  8. [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)

    利用周末时间将整个电脑格式化,换成了ubuntu系统- 所谓:扫清屋子再请客! 但是有些软件只在win上有,于是还是考虑装个虚拟机来个——逐步过度策略,一点点地从win上转移到linux上 我的系统是 ...

  9. 使用 HTML5 input 类型提升移动端输入体验

    在过去的几年里,在移动设备上浏览网页已变得难以置信的受欢迎. 但是这些设备上的浏览体验,有时遗留很多的有待改进.当涉及到填写表单时,这一点尤为明显.幸运的是,HTML5规范引入了许多新input类型, ...

随机推荐

  1. callbale 和runnable 区别

    Callable接口: 1 2 3 public interface Callable<V> {     V call() throws Exception; } Runnable接口: ...

  2. JDK中哪些类是不能继承的?

    不能继承的是类是那些用final关键字修饰的类. 实际上即使我们自己开发的类,也可以通过使用final修饰来阻止被继承.通过使用final修饰一个类,可以阻止该类被继承,这样该类就被完全地封闭起来了, ...

  3. springboot 定时任务 session报错问题

    一.自定义类 LocalVariable package com.lh.mes.base.thread; import java.util.Optional; public class LocalVa ...

  4. MyBatis 框架适用场合?

    1.MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案. 2.对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是 不错的选择.

  5. 什么是 Spring 的依赖注入?

    依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释.这概念是说你 不用创建对象,而只需要描述它如何被创建.你不在代码里直接组装你的组件和 服务,但是要在配置文件里描述哪些组件需要哪些服务, ...

  6. Arthas之实例操作

    Arthas之实例操作 1. 静态类属性操作 获取public静态属性 ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@pu ...

  7. solr集群搭建,zookeeper集群管理

    1. 第一步 把solrhome中的配置文件上传到zookeeper集群.使用zookeeper的客户端上传. 客户端命令位置:/root/solr-4.10.3/example/scripts/cl ...

  8. SCSS学习笔记(一)

    SCSS的由来 SCSS就是加强版的CSS,要讲SCSS那就一定要从SASS讲起 SASS Sass(英文全称:Syntactically Awesome Stylesheets)是一个最初由Hamp ...

  9. MEVN 架构(MongoDB + Express + Vue + NODEJS)搭建

    一个完整的网站服务架构包括:1.web frame ---这里应用express框架2.web server ---这里应用nodejs3.Database ---这里应用monggoDB4.前端展示 ...

  10. 使用 Blueprint 要注意 render_template 函数

    此文章主要是为了记录在使用 Flask 的过程中遇到的问题.本章主要讨论 render_template 函数的问题. 使用 Flask 的同学都应该知道,项目中的 url 和视图函数是在字典里一一对 ...