webbrowser没有刷新样式表

时间:2011-07-28 17:20:53

标签: c# css browser reloading

我发布了下面的完整代码,所以你可以看到我在做什么。

情况: 我创建了一个指向DomDocument的IHTMLDocument2 currentDoc 我写了正确的字符串 我关闭了currentDoc

程序向我显示包含CSS内容的HTML代码100%正确。作品

现在我想更改CSS,而不是2列我将其设置为3列 (只需更改宽度:48%到宽度:33%)

并使用新的33%重新运行代码 现在它突然不再应用任何CSS样式了。

当我关闭程序,然后再次将CSS更改为33%时,它可以完美无缺地

所以,不知怎的,没有配置完整的webbrowser,我无法第二次加载CSS .. 或者,第一个CSS在某个缓存中的某个地方,并与第二个CSS发生冲突..只是在这里搞砸..真的需要帮助来解决这个问题

我搜索了互联网和stackoverflow足够长的时间,我需要发布这个,即使这个星球上的其他人已经发布了它,我也没有找到它。

    private void doWebBrowserPreview()
    {
        if (lMediaFiles.Count == 0)
        {
            return;
        }

        Int32 iIndex = 0;
        for (iIndex = 0; iIndex < lMediaFiles.Count; iIndex++)
        {
            if (!lMediaFiles[iIndex].isCorrupt())
            {
                break;
            }
        }

        String strPreview = String.Empty;
        String strLine = String.Empty;

        // Set example Media
        String strLinkHTM = lMediaFiles[iIndex].getFilePath();
        FileInfo movFile = new FileInfo(strLinkHTM + lMediaFiles[iIndex].getFileMOV());
        String str_sizeMB = (movFile.Length / 1048576).ToString();
        if (str_sizeMB.Length > 3)
        {
            str_sizeMB.Insert(str_sizeMB.Length - 3, ".");
        }

        //Get info about our media files 
        MediaInfo MI = new MediaInfo();
        MI.Open(strLinkHTM + lMediaFiles[iIndex].getFileM4V());
        String str_m4vDuration = // MI.Get(0, 0, 80);
        MI.Get(StreamKind.Video, 0, 74);
        str_m4vDuration = "Duration: " + str_m4vDuration.Substring(0, 8) + " - Hours:Minutes:Seconds";
        String str_m4vHeightPixel = MI.Get(StreamKind.Video, 0, "Height");  // "Height (Pixel): " +
        Int32 i_32m4vHeightPixel;
        Int32.TryParse(str_m4vHeightPixel, out i_32m4vHeightPixel);
        i_32m4vHeightPixel += 16; // for the quicktime embed menu
        str_m4vHeightPixel = i_32m4vHeightPixel.ToString();
        String str_m4vWidthPixel = MI.Get(StreamKind.Video, 0, "Width"); //"Width (Pixel): " +

        foreach (XElement xmlLine in s.getTemplates().getMovieHTM().Element("files").Elements("file"))
        {
            var query = xmlLine.Attributes("type");
            foreach (XAttribute result in query)
            {
                if (result.Value == "htm_header")
                {
                    foreach (XElement xmlLineDes in xmlLine.Descendants())
                    {
                        if (xmlLineDes.Name == "dataline")
                        {
                            strLine = xmlLineDes.Value;
                            strLine = strLine.Replace(@"%date%", lMediaFiles[iIndex].getDay().ToString() + " " + lMediaFiles[iIndex].getMonth(lMediaFiles[iIndex].getMonth()) + " " + lMediaFiles[iIndex].getYear().ToString());
                            strPreview += strLine + "\n";
                        }
                    }
                }
            }
        }

        strLine = "<style type=\"text/css\">" + "\n";
        foreach (XElement xmlLine in s.getTemplates().getLayoutCSS().Element("layoutCSS").Elements("layout"))
        {
            var query = xmlLine.Attributes("type");
            foreach (XAttribute result in query)
            {
                if (result.Value == "layoutMedia")
                {
                    foreach (XElement xmlLineDes in xmlLine.Elements("layout"))
                    {
                        var queryL = xmlLineDes.Attributes("type");
                        foreach (XAttribute resultL in queryL)
                        {
                            if (resultL.Value == "layoutVideoBox")
                            {
                                foreach (XElement xmlLineDesL in xmlLineDes.Descendants())
                                {
                                    if (xmlLineDesL.Name == "dataline")
                                    {
                                        strLine += xmlLineDesL.Value + "\n";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        strLine += "</style>" + "\n";
        strPreview = strPreview.Insert(strPreview.LastIndexOf("</head>", StringComparison.Ordinal), strLine);


        for (Int16 i16Loop = 0; i16Loop < 3; i16Loop++)
        {
            foreach (XElement xmlLine in s.getTemplates().getMovieHTM().Element("files").Elements("file"))
            {
                var query = xmlLine.Attributes("type");
                foreach (XAttribute result in query)
                {
                    if (result.Value == "htm_videolist")
                    {
                        foreach (XElement xmlLineDes in xmlLine.Descendants())
                        {
                            if (xmlLineDes.Name == "dataline")
                            {
                                strLine = xmlLineDes.Value;
                                strLine = strLine.Replace(@"%m4vfile%", strLinkHTM + lMediaFiles[iIndex].getFileM4V());
                                strLine = strLine.Replace(@"%moviefile%", strLinkHTM + lMediaFiles[iIndex].getFileMOV());
                                strLine = strLine.Replace(@"%height%", str_m4vHeightPixel);
                                strLine = strLine.Replace(@"%width%", str_m4vWidthPixel);
                                strLine = strLine.Replace(@"%duration%", str_m4vDuration);
                                strLine = strLine.Replace(@"%sizeMB%", str_sizeMB);
                                strLine = strLine.Replace(@"%date%", lMediaFiles[iIndex].getDay().ToString() + " " + lMediaFiles[iIndex].getMonth(lMediaFiles[iIndex].getMonth()) + " " + lMediaFiles[iIndex].getYear().ToString());
                                strPreview += strLine + "\n";
                            }
                        }
                    }
                }
            }
        }

        foreach (XElement xmlLine in s.getTemplates().getMovieHTM().Element("files").Elements("file"))
        {
            var query = xmlLine.Attributes("type");
            foreach (XAttribute result in query)
            {
                if (result.Value == "htm_footer")
                {
                    foreach (XElement xmlLineDes in xmlLine.Descendants())
                    {
                        if (xmlLineDes.Name == "dataline")
                        {
                            strPreview += xmlLineDes.Value + "\n";
                        }
                    }
                }
            }
        }
        webBrowserPreview.Navigate("about:blank");
        webBrowserPreview.Document.OpenNew(false);
        mshtml.IHTMLDocument2 currentDoc = (mshtml.IHTMLDocument2)webBrowserPreview.Document.DomDocument;
        currentDoc.clear();
        currentDoc.write(strPreview);
        currentDoc.close();

        /*
        try
        {
            if (webBrowserPreview.Document != null)
            {
                IHTMLDocument2 currentDocument = (IHTMLDocument2)webBrowserPreview.Document.DomDocument;
                int length = currentDocument.styleSheets.length;

                IHTMLStyleSheet styleSheet = currentDocument.createStyleSheet(@"", 0);
                //length = currentDocument.styleSheets.length;
                //styleSheet.addRule("body", "background-color:blue");
                strLine = String.Empty;
                foreach (XElement xmlLine in s.getTemplates().getLayoutCSS().Element("layoutCSS").Elements("layout"))
                {
                    var query = xmlLine.Attributes("type");
                    foreach (XAttribute result in query)
                    {
                        if (result.Value == "layoutMedia")
                        {
                            foreach (XElement xmlLineDes in xmlLine.Elements("layout"))
                            {
                                var queryL = xmlLineDes.Attributes("type");
                                foreach (XAttribute resultL in queryL)
                                {
                                    if (resultL.Value == "layoutVideoBox")
                                    {
                                        foreach (XElement xmlLineDesL in xmlLineDes.Descendants())
                                        {
                                            if (xmlLineDesL.Name == "dataline")
                                            {
                                                strLine += xmlLineDesL.Value;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                //TextReader reader = new StreamReader(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "basic.css"));
                //string style = reader.ReadToEnd();
                styleSheet.cssText = strLine;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }*/

        webBrowserPreview.Refresh();
    }

1 个答案:

答案 0 :(得分:0)

我现在成功地为我的项目实施了berkelium-sharp方法 有同样的错误! 找到了解决方案!

首次尝试不起作用: 我有一个持久的形式(主窗体),里面有一个嵌套的WebBrowser。 用它的css更改html后,我告诉它导航到这个新的HTML!

这也不起作用: 然后我尝试将webbrowser放在自己的表单上。我只是打开/关闭每个 时间我需要刷新。确保垃圾收集器清理所有内容

然后我尝试了Berkelium并根据我的需要重写了它: 与使用webbrowser的尝试2相同的逻辑。也没有运气。

所以我尝试打开firefox本身,看看我是否可以使用真正的浏览器来模拟这种行为。确实!当我打开firefox,并强行打开文件时(如果你只是打开一个新文件,firefox实际上并没有导航到它,但检测到它已经打开并只是刷新它) 由于页面快速打开,我注意到了这一点! 在1个firefox会话中强制打开同一个文件两次(导航)的小脚本具有相同的效果:所有CSS都已损坏!

因此,出于某种原因,您不应该两次导航同一个文件,而是只需强制刷新,而不是关闭任何内容!不是“导航”

希望这些信息可以帮助其他人,因为我失去了很多时间,发现它是“导航”到同一个文件,然后一次导致样式表损坏