Windows.Forms.WebBrowser加载包含本地SVG文件的页面

时间:2016-07-28 10:27:01

标签: javascript c# html svg webbrowser-control

我有一个在C#项目中生成的HTML页面。当我在IE中打开这个页面时它可以工作。

<!DOCTYPE HTML>
<meta http-equiv='X-UA-Compatible' content='IE=10' />
<html lang='en'>
<head>
    <title>TemplateSVG</title>
    <script type='text/javascript' src='InterfaceSVG.js'></script>
</head>
<body style='margin: 0; overflow: hidden;'>
    <div class="page-content">
        <object id='idSVG'  type='image/svg+xml' data='D:\Examples\ExampleFla.svg'></object>
    </div>
</body>
</html>

我在Web浏览器中加载了文本

    if (webBrowser.Document == null)
    {
        webBrowser.DocumentText = theHTMLtext;
    }
    else
    {
        webBrowser.Document.OpenNew(true);
        webBrowser.DocumentText = theHTMLtext;
    }

但找不到文件 InterfaceSVG.js

当我提供js文件src='D:\[Path]\InterfaceSVG.js'的完整路径时 JS脚本在getSVGDocument()上生成异常。

var SvgDoc;
window.addEventListener('load', function () {  
    SvgDoc = document.getElementById("idSVG");
    if (SvgDoc == null) { alert("error"); return; }
    SvgDoc = SvgDoc.getSVGDocument(); // IE created Access Deny.
});

修改: 尝试从js文件中插入文本。

<script>Text from InterfaceSVG.js </scipt>    

但它会在getSVGDocument()

的基础上生成相同的异常( Access Deny

我将结果HTML页面保存在包含SVG文件的文件夹中,并使用函数Navigate而不是DocumentText。现在它可以工作......但我不想在磁盘上写任何东西。

    string path =  Path.GetDirectoryName(pathToSvgFile);
    string file = "\\"+Path.GetFileNameWithoutExtension(pathToSvgFile);
    string newfile = path + file;
    File.WriteAllText(newfile, theHTMLtext);
    webBrowser.Navigate(newfile);

1 个答案:

答案 0 :(得分:0)

我发现需要打开一个用户页面。

  1. 创建没有脚本的模板HTML页面。
  2. <!DOCTYPE HTML>
    <meta http-equiv='X-UA-Compatible' content='IE=10' />
    <html lang='en'>
    <head>
        <title>Empty Page</title>
    </head>
    <body style='margin: 0; overflow: hidden; '>
        <div class="page-content">
            <object id='idSVG' style='height: 100%; width: 100%;  position:absolute;' type='image/svg+xml' data='{0}'></object>
        </div>
    </body>
    </html>

    1. 在事件webBrowser.Navigated中添加脚本文件并更改HTML页面的文本正文。

          static string PathToSvgFile;
          public static void OpenSVG(this WebBrowser webBrowser, string pathToSvgFile)
          {
              if (webBrowser.ReadyState == WebBrowserReadyState.Complete || webBrowser.ReadyState == WebBrowserReadyState.Uninitialized)
              {
                  webBrowser.Navigate([Path to emptyPage.html]);
                  PathToSvgFile = pathToSvgFile;
                  webBrowser.Navigated += webBrowser_Navigated;
              } 
          }
      
          private static void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
          {
              var webBrowser = ((WebBrowser)sender);
              HtmlElementCollection head = webBrowser.Document.GetElementsByTagName("head");
      
              if (head != null)
              {
                  var element = webBrowser.Document.CreateElement("script");
                  element.SetAttribute("type", "text/javascript");
                  var elementDom = (MSHTML.IHTMLScriptElement)element.DomElement;
                  elementDom.src = [JavaScriptFile.js];
                  ((HtmlElement)head[0]).AppendChild(element);
              }
      
              webBrowser.Document.Body.InnerHtml = String.Format(webBrowser.Document.Body.InnerHtml, PathToSvgFile);
              webBrowser.Navigated -= webBrowser_Navigated; 
          }