веб-браузер не обновляет таблицу стилей - PullRequest
1 голос
/ 28 июля 2011

Я выкладываю полный код ниже, чтобы вы могли видеть, что я делаю.

Положение: Я создаю IHTMLDocument2 currentDoc, указывающий на DomDocument Я пишу правильную строку Я закрываю currentDoc

Программа показывает мне HTML-код, включая CSS-код, на 100% правильный. Работает

Теперь я хочу изменить CSS, вместо 2 столбцов я установил 3 столбца. (Просто измените ширину: 48% на ширину: 33%)

и перезапустите код с новыми 33% теперь он неожиданно больше не применяет стиль CSS.

Когда я закрываю программу, а затем снова изменяю CSS на 33%, она работает безупречно

Так что, каким-то образом, не избавляясь от полного веб-браузера, я не могу загрузить 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 голосов
/ 30 июля 2011

Я успешно внедрил метод берклия-острый в мой проект Имеет такую ​​же ошибку! Нашел решение!

Первая попытка, которая не сработала: У меня была постоянная форма (основная форма) и внутри нее вложенный WebBrowser. После изменения HTML с помощью CSS, я сказал ему, чтобы перейти к этому новому HTML!

Это тоже не сработало: Затем я попытался поместить веб-браузер в собственную форму. Который я просто открываю / закрываю каждый раз мне нужно освежиться. Чтобы быть уверенным, что сборщик мусора очищает все

Затем я попробовал Berkelium и переписал его для своих нужд: та же логика, что и при попытке 2 с веб-браузером. Не повезло тоже.

Итак, я попытался открыть Firefox сам и посмотреть, смогу ли я подражать этому поведению с реальным браузером. В самом деле! Когда я открываю firefox и принудительно открываю файл (если вы просто открываете новый файл, firefox фактически не переходит к нему, а обнаруживает, что он уже открыт, и просто обновляет его) Я заметил это из-за быстрого открытия страницы! Небольшой сценарий для принудительного открытия одного и того же файла дважды (навигации) в 1 сеансе Firefox имел тот же эффект: все CSS повреждены!

поэтому по какой-то причине вам не следует перемещаться по одному и тому же файлу дважды, а вместо того, чтобы что-то закрывать, просто принудительно обновить! Не "Навигация"

Надеюсь, что эта информация может помочь другим, так как я потерял много времени, узнав, что это "переход" к одному и тому же файлу не раз, что приводит к повреждению таблиц стилей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...