winforms 不允许Webview2 SetVirtualHostNameToFolderMapping加载本地资源

dxpyg8gm  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(322)

嘿,所有我正在使用新的WebView2与我的WinForms应用程序。我可以让它显示我创建的动态HTML,但它有“”当它试图加载页面的图像。

图像标记如下所示:

<div id="animation1" style="display: inline-flex;">
   <img src="file:///C:\Users\admin\source\repos\wCondictions\bin\x86\Debug\Resources/nice.gif" style="height: 110px; width: 110px;">
   <span class="imgWeather">Nice</span>
</div>

我目前使用的代码如下:

fileNames = new DirectoryInfo(resourcePath)
            .GetFiles()
            .OrderBy(p => Path.GetFileNameWithoutExtension(p.Name))
            .Select(fi => fi.Name)
            .ToArray();
string blah = Path.Combine(Application.StartupPath, "Resources");
string fullHtml = string.Empty;
string HeaderHtml = "<!DOCTYPE html>\n" +
                        "<html>\n" +
                        "<style>\n" +
                            ".imgW {\n" +
                                "position: absolute;\n" +
                                "z-index: 10;\n" +
                                "color: red;\n" +
                                "width: 110px;\n" +
                                "height:30px;\n" +
                                "text-align: center;\n" +
                                "vertical-align: middle;\n" +
                                "top: 88px;\n" +
                                "background-color: aquamarine;\n" +
                                "font-family: Arial;\n" +
                                "font-size: small;\n" +
                            "}\n" +
                        "</style>\n" +
                        "<body style=\"background-color: #00000;\">";
string dynamixImg = "<div id=\"animation1\" style=\"display: inline-flex;\">\n" +
                                "<img src=\"file:///" + blah + "/{0}\" style=\"height: 110px; width: 110px;\" />\n" +
                                "<span class=\"imgW\">{1}</span>\n" +
                            "</div>";
string FooterHtml = "</body>" +
                        "</html>";

for (int a = 0; a < fileNames.Count(); a++)
{
    fullHtml += string.Format(
                dynamixImg, 
                fileNames[a], 
                fileNames[a]
                .Replace(".gif", "")
                .Replace("&", "&&") 
    ) + "\n";
}

await webView21.EnsureCoreWebView2Async();

webView21.CoreWebView2.SetVirtualHostNameToFolderMapping(
            "Resources", 
            @"C:\Users\admin\source\repos\wCondictions\bin\x86\Debug\Resources\", 
            CoreWebView2HostResourceAccessKind.Allow
);

webView21.NavigateToString(HeaderHtml + fullHtml + FooterHtml);

我已经看到很多地方,它说使用SetVirtualHostNameToFolderMapping,但即使这样,它仍然说同样的错误。
因此,我不确定我错过了什么,或者误解了如何使用SetVirtualHostNameToFolderMapping以允许映像在本地加载?

643ylb08

643ylb081#

好吧,我再试一次,我的第一个答案是混乱的。
出现此错误是因为使用了file://协议。
您似乎还没有完全理解SetVirtualHostNameToFolderMapping的用法。

通过调用SetVirtualHostNameToFolderMapping设置虚拟服务器后,应像使用Internet上的任何其他服务器一样使用该虚拟服务器。请勿使用file://

因此,您所要做的就是编辑您的HeaderHtml<img src
HeaderHtml应包含<base>标记,该标记应指向您的虚拟服务器根目录:

<html>
    <head>
        <base href="http://Resources" />
    </head>

这使得构建动态<ìmg>标记变得非常容易,源代码只是文件名:

<img src="image.png" />

现在WebView2将把它转换成一个文件路径并获取图像!
作为旁注,您还可以通过在文件名前面添加文件夹名来包含子文件夹中的文件,如下所示:

<img src="/subfolder/image.png" />
zphenhs4

zphenhs42#

为了跟进这一点,并给予一个清晰的示例,这是您需要做的。这适用于截至2023年的当前WebView 2控件(版本1.0.1671-prerelease)。您可能需要在不同版本上调整语法。
以下代码设置文件夹Map:

string resourcePath = @"C:\Users\{username}\{sourcepath}\Resources\";
WebView2.CoreWebView2.SetVirtualHostNameToFolderMapping("MyFiles", resourcePath, CoreWebView2HostResourceAccessKind.Allow);

这样就不用引用本地路径

<img src="file:///C:\images\image.png">

在HTML字符串中,现在引用了

<img src="http://MyFiles/image.png">

最后打电话给

WebView2.CoreWebView2.NavigateToString(myhtml);

并且您的本Map像将正确显示在页面中。
如果您将应用程序发布为ClickOnce应用程序,则这也适用于最终用户。

相关问题