如何在WinForms WebBrowser控件的生成的HTML中引用本地资源?

时间:2020-03-05 18:55:53  来源:igfitidea点击:

我正在使用Winforms Web浏览器控件在Windows窗体应用程序中显示一些内容。我正在使用DocumentText属性编写生成的HTML。这部分工作异常出色。现在,我想在标记中使用一些图像。 (不过,我也更喜欢使用链接的CSS和JavaScript,只需嵌入即可解决该问题。)

我已经搜寻了几天,似乎找不到标题问题的答案。

我尝试使用相对引用:应用程序exe在bin \ debug中。这些图像位于项目根目录的" Images"目录中。我将图像设置为在编译时复制到输出目录,因此它们最终位于bin \ debug \ Images *中。因此,我然后使用诸如" Images ..."之类的引用,认为它将与该exe有关。但是,当我在嵌入式浏览器窗口中查看图像属性时,我看到图像URL为" about:blankImages / *"。将HTML写入控件时,所有内容似乎都与" about:blank"有关。缺少位置上下文,我无法弄清楚要用于相对文件资源引用的内容。

我四处查看控件的属性,以查看是否可以通过某种方法来解决此问题。我创建了一个空白的html页面,并使用文件的完整本地路径使用" Navigate()"方法将浏览器指向该页面。这在浏览器报告空白页面的本地" file:/// ..."路径时效果很好。然后,我再次使用Document.Write()写入浏览器。再次,浏览器现在报告" about:blank"作为URL。

除了将动态HTML结果写入真实文件之外,没有其他方法可以引用文件资源吗?

我将尝试最后一件事:构建图像的绝对文件路径并将其写入HTML。我的HTML是使用序列化对象的XML的XSL转换生成的,因此我需要使用一些XSL参数,这会花费一些额外的时间,因为我不太熟悉它们。

解决方案

回答

这是我们的工作,尽管我应该提到,我们使用自定义Web浏览器删除了诸如右键单击并查看旧的IE上下文菜单等功能:

public class HtmlFormatter
{
    /// <summary>
    /// Indicator that this is a URI referencing the local
    /// file path.
    /// </summary>
    public static readonly string FILE_URL_PREFIX = 
        "file://";

    /// <summary>
    /// The path separator for HTML paths.
    /// </summary>
    public const string PATH_SEPARATOR = "/";
}

// We need to add the proper paths to each image source
// designation that match where they are being placed on disk.
String html = HtmlFormatter.ReplaceImagePath(
    myHtml, 
    HtmlFormatter.FILE_URL_PREFIX + ApplicationPath.FullAppPath + 
    HtmlFormatter.PATH_SEPARATOR);

基本上,我们需要具有一个包含文件URI的图像路径,例如

<img src="file://ApplicationPath/images/myImage.gif">

回答

我明白了。

我只是将exe目录的完整解析的URL传递到XSL转换,该转换包含带有图像标签的HTML输出:

XsltArgumentList lstArgs = new XsltArgumentList();
lstArgs.AddParam("absoluteRoot", string.Empty, Path.GetFullPath("."));

然后,我只是在所有图像上加上参数值作为前缀:

<img src="{$absoluteRoot}/Images/SilkIcons/comment_add.gif" align="middle" border="0" />

回答

我最终使用了与Ken建议的基本相同的东西。但是,不是使用手动添加文件前缀,而是使用UriBuilder类使用"文件"协议构建完整的URI。

当我们在更实际的位置"程序文件"中测试该应用程序时,这也解决了后续问题。使用空格编码,但是使用标准系统路径(即" C:\ Program%20Files ...")引用文件时,操作系统无法处理编码的字符。使用真实的URI值(file:/// C:/ Program Files / ...)是可行的。

回答

或者,保持常规样式的相对链接,删除HTML转换代码,然后在exe中嵌入这样的Cweb服务器,然后将WebControl指向内部URL,例如localhost:8199 / myapp /

回答

Ken的代码缺少一些需要工作的东西。我已经对其进行了修改,并创建了一种新方法,该方法应该可以使某些事情实现自动化。

只需这样调用static方法:

html = HtmlFormatter.ReplaceImagePathAuto(html);

并且html中与file:// ApplicationPath /匹配的所有链接都将与当前工作目录交换。如果要指定备用位置,则包含原始静态方法(以及缺少的位)。

public class HtmlFormatter
{

    public static readonly string FILE_URL_PREFIX = "file://";
    public static readonly string PATH_SEPARATOR = "/";
    public static String ReplaceImagePath(String html, String path)
    {
        return html.Replace("file://ApplicationPath/", path);
    }
    /// <summary>
    /// Replaces URLs matching file://ApplicationPath/... with Executable Path
    /// </summary>
    /// <param name="html"></param>
    /// <returns></returns>
    public static String ReplaceImagePathAuto(String html)
    {
        String executableName = System.Windows.Forms.Application.ExecutablePath;
        System.IO.FileInfo executableFileInfo = new System.IO.FileInfo(executableName);
        String executableDirectoryName = executableFileInfo.DirectoryName;
        String replaceWith = HtmlFormatter.FILE_URL_PREFIX
            + executableDirectoryName
            + HtmlFormatter.PATH_SEPARATOR;

        return ReplaceImagePath(html, replaceWith);
    }
}