我正在使用winforms webbrowser控件在Windows窗体应用中显示一些内容。我正在使用DocumentText属性来编写生成的HTML。那部分工作非常出色。现在我想在标记中使用一些图像。 (我也更喜欢使用链接的CSS和JavaScript,只需嵌入它就可以解决。)
我一直在谷歌搜索几天,似乎无法找到标题问题的答案。
我尝试使用相对引用:app 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参数,这需要一些额外的时间,因为我不熟悉它们。
答案 0 :(得分:5)
以下是我们的工作,虽然我应该提一下,我们使用自定义网络浏览器来删除右键单击并查看良好的旧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">
答案 1 :(得分:1)
我明白了。
我只是将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" />
答案 2 :(得分:0)
我最终使用的东西与肯建议的东西基本相同。但是,我使用UriBuilder类来使用“文件”协议构建完整的URI,而不是手动附加文件前缀。
当我们在一个更现实的位置Program Files中测试应用程序时,这也解决了后续问题。这些空间是编码的,但是当使用标准系统路径(即“C:\ Program%20Files ...”)引用文件时,操作系统无法处理编码字符。使用真正的URI值(file:/// C:/ Program Files / ...)起作用。
答案 3 :(得分:0)
或者,保持正常的样式相对链接,删除HTML转换代码,然后在您的exe中嵌入一个C#Web服务器,如this,然后将WebControl指向您的内部URL,如localhost:8199 / myapp /
答案 4 :(得分:0)
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);
}
}