【问题标题】:How do I reference a local resource in generated HTML in WinForms WebBrowser control?如何在 WinForms WebBrowser 控件中引用生成的 HTML 中的本地资源?
【发布时间】:2010-09-09 11:35:33
【问题描述】:

我正在使用 winforms webbrowser 控件在 Windows 窗体应用程序中显示一些内容。我正在使用 DocumentText 属性来编写生成的 HTML。这部分工作非常出色。现在我想在标记中使用一些图像。 (不过,我也更喜欢使用链接的 CSS 和 JavaScript,这可以通过嵌入来解决。)

我在谷歌上搜索了几天,似乎找不到标题问题的答案。

我尝试使用相对引用:应用程序 exe 在 bin\debug 中。图像位于项目根目录的“Images”目录中。我已将图像设置为在编译时复制到输出目录,因此它们最终位于 bin\debug\Images* 中。所以我然后使用像这样的参考“图像......”认为它将与 exe 相关。但是,当我查看嵌入式浏览器窗口中的图像属性时,我看到图像 URL 为“about:blankImages/*”。当 HTML 写入控件时,一切似乎都与“about:blank”相关。缺少位置上下文,我不知道用什么来引用相对文件资源。

我浏览了控件的属性,看看是否有办法设置一些东西来解决这个问题。我创建了一个空白的 html 页面,并使用“Navigate()”方法将浏览器指向它,并使用文件的完整本地路径。这适用于浏览器报告空白页面的本地“file:///...”路径。然后我再次写入浏览器,这次使用 Document.Write()。同样,浏览器现在将“about:blank”报告为 URL。

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

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

【问题讨论】:

    标签: .net winforms webbrowser-control


    【解决方案1】:

    这就是我们所做的,尽管我应该提到我们使用自定义网络浏览器来删除诸如右键单击并查看良好的旧 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">
    

    【讨论】:

    • 内置浏览器可以配置为不显示常规上下文菜单:IsWebBrowserContextMenuEnabled = false
    • OOI PATH_SEPARATOR 已在框架中定义 - Path.AltDirectorySeparatorChar
    【解决方案2】:

    我明白了。

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

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

    然后我只是在所有图像前面加上参数值:

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

    【讨论】:

      【解决方案3】:

      我最终使用了与 Ken 建议的基本相同的东西。但是,我没有手动附加文件前缀,而是使用 UriBuilder 类通过“文件”协议构建完整的 URI。

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

      【讨论】:

        【解决方案4】:

        或者,保留您正常样式的相对链接,删除 HTML 转换代码,而是在您的 exe 中嵌入一个 C# Web 服务器,如 this,然后将您的 WebControl 指向您的内部 URL,如 localhost:8199/myapp/

        【讨论】:

          【解决方案5】:

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

          只需像这样调用静态方法:

          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);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-12
            • 2013-01-07
            • 2018-08-27
            • 2012-04-16
            • 2015-01-30
            • 2012-07-18
            • 1970-01-01
            • 2015-03-30
            相关资源
            最近更新 更多