在 运行 时间在 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
- 您可以将文件作为嵌入资源
然后要显示文件,可以使用以下方法:
- 获取文件路径并调用
Navigate
method or assign it to Url
属性
- 获取资源内容赋值给
DocumentText
属性
- 获取资源流分配给
DocumentStream
属性
将文件复制到输出目录
要在构建时将文件复制到输出目录:
- 解决方案资源管理器 → 查看文件的属性
- 将生成操作设置为内容。
- 将复制到输出目录设置为始终复制。
然后文件将被复制到你的输出目录,你可以这样使用它:
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".
我想显示一个存在于我的项目中的本地 html 文件:
调用文件是 HelpFile.cs
并且表单包含 WebBrowser
控件。
我要访问的地址是:
C:\Users\Keith\Desktop\Lingerie\Corset\Corset\Bra.html
正在从以下位置调用文件:
结果是可怕的页面无法显示。
我想做的是能够将文件作为相对 html 页面调用。在稍后阶段,我希望能够调用不同的帮助文件。
这是继续进行的最佳方法还是我犯了一个根本性错误并走错了路?
任何建设性的帮助将不胜感激。
您的项目中存在的文件位于您计算机的特定位置。但是在你分发程序并运行它到用户的机器上之后,该文件将不存在于目标机器上。
您可能想要分发文件或将其添加为资源。要解决此问题,您可以使用以下任一解决方案:
- 您可以在构建时将文件复制到输出目录
- 您可以将文件添加到资源文件中,例如
Resources.resx
- 您可以将文件作为嵌入资源
然后要显示文件,可以使用以下方法:
- 获取文件路径并调用
Navigate
method or assign it toUrl
属性 - 获取资源内容赋值给
DocumentText
属性 - 获取资源流分配给
DocumentStream
属性
将文件复制到输出目录
要在构建时将文件复制到输出目录:
- 解决方案资源管理器 → 查看文件的属性
- 将生成操作设置为内容。
- 将复制到输出目录设置为始终复制。
然后文件将被复制到你的输出目录,你可以这样使用它:
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".