2008-11-08 60 views
6

我正在使用WebBrowser控件编写C#应用程序,并且我希望显示的所有内容都来自嵌入式资源 - 不是静态本地文件,而不是远程文件。C#WebBrowser提供脚本和图像的HTML

设置控件嵌入HTML文件的初始文本,此代码由this post启发的伟大工程:

browser.DocumentText=loadResourceText("myapp.index.html"); 

private string loadResourceText(string name) 
{ 
    Assembly assembly = Assembly.GetExecutingAssembly(); 
    Stream stream = assembly.GetManifestResourceStream(name); 
    StreamReader streamReader = new StreamReader(stream); 
    String myText = streamReader.ReadToEnd(); 
    return myText; 
} 

如说是,文件中的HTML简称 - 的JavaScript,像<img src="whatever.png"/>图片等等,不起作用。我发现了类似的问题herehere,但都没有问究竟是我的意思是,指的是嵌入式资源中的exe,而不是文件。

我试过res://...和使用<base href='..."但似乎都没有工作(虽然我可能没有得到它的权利)。

也许(根据我自己对this question的建议),使用一个小小的嵌入式C#web服务器是唯一的方法......但我会认为有一些技巧可以实现这个目标吗?

谢谢!

回答

1

我可以看到三种方式来获取这是怎么回事:

1:写你需要在临时区域平面文件中的文件,浏览WebBrowser到HTML文件,并删除它们一旦在页面加载

2:如你所说,一个嵌入式Web服务器 - herhaps HttpListener - 但请注意,这里使用HTTP.SYS,因此需要管理priveleges(或者你需要pre-open the port

3:1相似,但使用命名管道服务器,以避免写入文件

我不得不说,第一个很简单,需要零配置。

0
/// Hi try this may help u. 
private string CheckImages(ExtendedWebBrowser browser) 
{ 
     StringBuilder builderHTML = new StringBuilder(browser.Document.Body.Parent.OuterHtml); 
     ProcessURLS(browser, builderHTML, "img", "src");     
     ProcessURLS(browser, builderHTML, "link", "href"); 
     // ext... 

     return builderHTML.ToString(); 

} 

private static void ProcessURLS(ExtendedWebBrowser browser, StringBuilder builderHTML, string strLink, string strHref) 
{ 
    for (int k = 0; k < browser.Document.Body.Parent.GetElementsByTagName(strLink).Count; k++) 
    { 
      string strURL = browser.Document.Body.Parent.GetElementsByTagName(strLink)[k].GetAttribute(strHref); 
      string strOuterHTML = browser.Document.Body.Parent.GetElementsByTagName(strLink)[k].OuterHtml; 
      string[] strlist = strOuterHTML.Split(new string[] { " " }, StringSplitOptions.None); 
      StringBuilder builder = new StringBuilder(); 
      for (int p = 0; p < strlist.Length; p++) 
      { 
       if (strlist[p].StartsWith(strHref))       
        builder.Append (strlist[p].Contains("http")? strlist[p] + " ": 
         (strURL.StartsWith("http") ? strHref + "=" + strURL + " ": 
          strHref + "= " + "http://xyz.com" + strURL + " "));       
       else 
        builder.Append(strlist[p] + " "); 
      } 

      builderHTML.Replace(strOuterHTML, builder.ToString()); 
     } 
}