在 运行 时间在 WebBrowser 控件中显示我的项目的 HTML 文件

Show an HTML file of my Project in WebBrowser control at run-time

我想显示一个存在于我的项目中的本地 html 文件:

调用文件是 HelpFile.cs 并且表单包含 WebBrowser 控件。

我要访问的地址是:

C:\Users\Keith\Desktop\Lingerie\Corset\Corset\Bra.html

正在从以下位置调用文件:

结果是可怕的页面无法显示。

我想做的是能够将文件作为相对 html 页面调用。在稍后阶段,我希望能够调用不同的帮助文件。

这是继续进行的最佳方法还是我犯了一个根本性错误并走错了路?

任何建设性的帮助将不胜感激。

您的项目中存在的文件位于您计算机的特定位置。但是在你分发程序并运行它到用户的机器上之后,该文件将不存在于目标机器上。

您可能想要分发文件或将其添加为资源。要解决此问题,您可以使用以下任一解决方案:

  • 您可以在构建时将文件复制到输出目录
  • 您可以将文件添加到资源文件中,例如 Resources.resx
  • 您可以将文件作为嵌入资源

然后要显示文件,可以使用以下方法:

将文件复制到输出目录

要在构建时将文件复制到输出目录:

  • 解决方案资源管理器 → 查看文件的属性
  • 生成操作设置为内容
  • 复制到输出目录设置为始终复制

然后文件将被复制到你的输出目录,你可以这样使用它:

var path = System.IO.Path.Combine(Application.StartupPath, "test.html");
this.webBrowser1.Navigate(path);

请注意,如果文件位于项目中的某个文件夹下,例如 MyFolder,那么它将被复制到应用程序输出目录中的同名文件夹中:

var path = System.IO.Path.Combine(Application.StartupPath, "MyFolder", "test.html");
this.webBrowser1.Navigate(path);

将文件添加到 resx 资源文件,如 Resources.Resx

您可以将文件添加到项目的资源文件中。这样它将分布在资源程序集中,您不需要将文件复制到输出目录。为此:

  • 解决方案资源管理器 → 您的项目 → 属性 文件夹 → 打开 Resources.Resx 文件
  • 从设计器的工具栏 → 添加现有文件 → 添加 html 文件。

然后文件的内容将通过Resources的字符串属性获得。 属性 名称将与文件名相同,例如,如果文件名为 test.html,则 属性 名称将为 test,您可以这样使用它:

this.webBrowser1.DocumentText = Properties.Resources.test;

请注意,对于此解决方案,该文件不需要由您的项目分发,它将成为资源文件的一部分。但是它将成为您项目文件的一部分。

将文件设为嵌入资源

您可以将文件作为嵌入资源。这样它将分布在资源程序集中,您不需要将文件复制到输出目录。为此:

  • 解决方案资源管理器 → 查看文件的属性
  • 构建操作设置为嵌入式资源
  • 复制到输出目录设置为不复制

然后使用,需要从嵌入资源中获取文件内容。假设文件名为 "test.html":

var fileName = "test.html";
var name = Assembly.GetExecutingAssembly().GetManifestResourceNames()
    .Where(x => x.EndsWith(fileName)).First();
webBrowser1.DocumentStream = 
    Assembly.GetExecutingAssembly().GetManifestResourceStream(name);

请注意,如果项目中的文件位于 MyFolder 等文件夹中,则上例中的文件名将为 "MyFolder.test.html".