WebView2 可以导航到应用程序中嵌入的 html 资源吗?

Can WebView2 Navigate to an html resource embedded in the application?

我一直在将我们的应用程序从使用 CHtmlView 转换为 WebView2。我们的应用程序有一个基于 Web 的起始页,通常从我们的服务器获取所有信息,但我们有本地资源设置,以防我们的服务器出现故障或客户端出现互联网问题。使用 CHtmlView 我们能够导航到嵌入式资源中的 html 页面,如下所示:

HINSTANCE hInstance = AfxGetResourceHandle();
ASSERT(hInstance != NULL);
TCHAR lpszModule[_MAX_PATH];
if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
{
    CString strResourceURL;
    strResourceURL.Format(_T("res://%s/%d"), lpszModule, IDR_STARTPAGE);
    Navigate2(strResourceURL, NULL,NULL);
}

这将加载页面和也作为资源嵌入的图像。

WebView2 Navigate 似乎不支持同样的方法,因为传递相同的字符串只会给出一个空白页面。

我能够通过 LoadResource 将页面加载到 CString,然后将其传递给 NavigateToString。这可以正常加载页面,但会显示 none 的图像。有什么方法可以使用 WebView2 获取嵌入的图像吗?

WebView2 不支持 res URI 方案。对于不在磁盘上的应用程序内容,您可以使用:

  • NavigateToString:您可以提供创建的应用程序 HTML 进行渲染,但是无法额外引用动态创建的应用程序的子资源。
  • WebResourceRequested: You can use the CoreWebView2.WebResourceRequested event to intercept any resource requests that you want after setting the filter via AddWebResourceRequestedFilter。在这种情况下,您可以拦截任何资源请求并决定提供您自己的响应流,而不是让请求实际进入网络。

您可以同时使用这两者,使用 NavigateToString 提供初始 HTML 进行渲染,在 HTML 中引用特定域上的子资源,例如 app.example ,然后在 WebResourceRequested 中拦截对 app.example 的所有请求并提供您自己的流。