在C# WebBrowser中加载本地HTML文件

66

我的应用程序中有一个WebBrowser元素。

我想在其中加载一个本地文件。

我有一些问题:

  1. 应该把HTML文件放在哪里(这样,如果用户执行安装,则该文件也会被安装)
  2. 如何引用该文件?(例如,我的猜测是用户的安装文件夹并不总是相同的)

编辑

我已将HTML文件添加到我的项目中。

我已将其设置为复制到输出文件夹。

当我检查时,它存在于运行时的 \bin\Debug\Documentation\index.html。

但是,当我尝试使用以下代码在WebBrowser中显示HTML文件时,出现“无法显示该页”的错误。

webBrowser1.Navigate(@".\Documentation\index.html");
9个回答

111
  1. 在 Visual Studio 中对文件进行右键单击->属性。
  2. 将“复制到输出目录”设置为“始终复制”。
然后,您就可以通过类似于@".\my_html.html"的路径来引用您的文件。
“复制到输出目录”将在构建项目时将该文件放置在二进制dlls所在的同一文件夹中。这适用于任何内容文件,即使它在子文件夹中也是如此。
如果您使用子文件夹,那么该文件夹也会被复制到 bin 文件夹中,因此您的路径将变成@".\my_subfolder\my_html.html" 为了创建一个本地使用的 URI(而不是通过 Web 服务提供),您需要使用二进制基本目录下的“file”协议 - 注意:只有在上述设置了“复制到输出目录”时,此方法才有效;否则路径将不正确。
您需要的就是这些。
string curDir = Directory.GetCurrentDirectory();
this.webBrowser1.Url = new Uri(String.Format("file:///{0}/my_html.html", curDir));

当然,您需要更改变量和名称。


6
在C#中,通过使用@符号,你不必为转义任何字符而烦恼,因为@表示将其视为字面值。你应该在路径中使用@符号,否则你需要这样做:**".\my_html.html"**。 - ghostJago
3
我需要提醒一下,当应用于路径时,**@"."** 表示当前目录。 - ghostJago
1
谢谢,我不知道这个。但是它没能够正常工作(可能是我做错了什么 :))。当我执行:webBrowser1.Url = @".\Documentation\index.html";时,出现错误:字符串无法转换为Uri。而当我尝试:webBrowser1.Url = new Uri(@".\Documentation\index.html");时,我会得到:无效的URI:无法确定URI的格式。 - PeeHaa
1
好的,请尝试这个代码:string curDir = Directory.GetCurrentDirectory(); this.webBrowser1.Url = new Uri(String.Format("file:///{0}/my_html.html", curDir)); 你需要编辑变量和文件名。我已经尝试过,它可以工作。 - ghostJago
1
@ghotsJago:太棒了!现在它可以工作了。你能否更新你的答案,加入这个解决方案? - PeeHaa

14

虽然有点晚,但这是我从谷歌找到的第一个结果

不要使用当前目录或获取程序集,只需使用Application.ExecutablePath属性:

//using System.IO;  
string applicationDirectory = Path.GetDirectoryName(Application.ExecutablePath);
string myFile = Path.Combine(applicationDirectory, "Sample.html");
webMain.Url = new Uri("file:///" + myFile);

5
请记住,在紧凑框架下不可用 Application.ExecutablePath ,必须使用 Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) - Brett Ryan

6
请注意,在紧凑框架下,file:///方案无法工作,至少在5.0版本中无法工作。
您需要使用以下内容:
string appDir = Path.GetDirectoryName(
    Assembly.GetExecutingAssembly().GetName().CodeBase);
webBrowser1.Url = new Uri(Path.Combine(appDir, @"Documentation\index.html"));

4
  1. 将其放置在应用程序设置文件夹中或者放置在一个单独的文件夹下
  2. 当您的应用程序运行时,相对于当前目录引用它。

3
  1. 在你即将运行的程序集附近。
  2. 使用反射获取到你正在执行的程序集路径,然后进行一些操作来定位你的HTML文件。

就像这样:

var myAssembly = System.Reflection.Assembly.GetEntryAssembly();
var myAssemblyLocation = System.IO.Path.GetDirectoryName(a.Location);
var myHtmlPath = Path.Combine(myAssemblyLocation, "my.html");

1
我成功的做法是:
<WebBrowser Source="pack://siteoforigin:,,,/StartPage.html" />

这里。我将StartPage.html复制到与xaml文件相同的输出目录中,并从该相对路径加载它。


0

关于上面 @ghostJago 的回答的更新

对我来说,在 VS2017 中,以下几行代码是有效的

string curDir = Directory.GetCurrentDirectory();
this.webBrowser1.Navigate(new Uri(String.Format("file:///{0}/my_html.html", curDir)));

0

Windows 10 uwp 应用程序。

试试这个:

webview.Navigate(new Uri("ms-appx-web:///index.html"));

1
但是我应该将HTML文件复制到哪里呢?在*.sln文件所在的位置下面?在项目目录下面?还是在Assets目录下面? - Arjang
如果在项目目录下: "ms-appx-web:///index.html",如果在Assets中:"ms-appx-web:///Assets/index.html"。 - Ravshanbek Ahmedov

0
我一直在尝试这里的不同答案,但最终成功地得出了一些可行的东西,如下所示:
1- 在项目级别创建的文件夹WebPagesHelper中添加页面
2- 通过webBrowser控件打印页面。
string curDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);                
var uri = new Uri(curDirectory);
string myFile = Path.Combine(uri.AbsolutePath, @"WebPagesHelper\index.html");
Uri new_uri = new Uri(myFile);

我需要获取程序集路径,创建第一个URI以获取不带'file://'的绝对路径,接下来将此绝对路径与页面所在文件夹中的相对路径组合,然后从结果创建另一个URI。
然后将其传递给webBrowser URL属性webBrowser.URL = new_uri;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接