2011-07-28 4 views
1

Je poste le code complet ci-dessous, de sorte que vous pouvez voir ce que je fais.webbrowser pas rafraîchissant stylesheet

Situation: créer un pointage de CurrentDoc IHTMLDocument2 au DomDocument j'écris la chaîne appropriée je ferme le programme CurrentDoc

me montre le code html, y compris les trucs CSS 100% correct. Travaux

Maintenant, je veux changer le CSS, au lieu de 2 colonnes, je mets à 3 colonnes (Il suffit de changer la largeur: 48% à la largeur: 33%)

et exécutez à nouveau le code avec le nouveau 33 % maintenant il ne s'applique soudainement plus au style CSS.

Quand je ferme le programme, puis changer le CSS à 33% de plus, il fonctionne sans défaut

donc, en quelque sorte, sans disposer du navigateur Web complet, je ne peux pas charger le CSS une 2ème fois .. ou, le premier CSS est quelque part dans un cache, et les conflits avec le 2e CSS .. Juste cribler ici .. vraiment besoin d'aide sur la façon de résoudre ce problème

J'ai cherché sur Internet et stackoverflow assez longtemps que j'ai besoin de poster ce , même si quelqu'un d'autre sur cette planète l'a déjà posté quelque part, je ne l'ai pas trouvé.

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(); 
    } 
+0

Il est juste mettre en cache votre CSS? Avez-vous fait un rafraîchissement? (CTRL + F5) – abney317

+0

Oui. J'ai aussi essayé beaucoup de variantes différentes. Y compris stocker un fichier sur le disque et utiliser naviguer.La chose est: pour une raison quelconque, une feuille de style nommée "div # video_box" Je ne peux pas changer pendant une session. Même lorsque je mets le webbrowser sous une forme propre et que j'ouvre/ferme ce formulaire où C# devrait se positionner automatiquement, je ne peux pas changer la feuille de style. si je le renommer à la fois en CSS et en HTML, il charge correctement les données modifiées (une fois!) mais chaque fois que je change quelque chose, je dois prendre un nouveau nom. Je pourrais trouver une solution de contournement en utilisant un recenseur, mais ce n'est bien sûr pas une bonne solution. – Vince

+0

http://www.eggheadcafe.com/software/aspnet/30119924/dynamic-stylesheet-problem.aspx Je pense que c'est une description du problème similaire. On dirait quelque chose d'étrange dans l'implémentation de C# webbrowser – Vince

Répondre

0

I maintenant mis en œuvre avec succès la méthode Berkelium-forte à mon projet A le même bug! J'ai trouvé une solution!

Première tentative qui n'a pas fonctionné: J'avais un formulaire persistant (forme principale) et à l'intérieur un WebBrowser imbriqué. Après avoir changé le code HTML avec son CSS, je lui ai dit de naviguer vers ce nouveau code HTML!

Cela n'a pas fonctionné non plus: Ensuite, j'ai essayé de mettre webbrowser sur un formulaire personnel. Ce que je simplement ouvrir/fermer chaque fois j'ai besoin d'un rafraîchissement. Être sûr que le garbage collector nettoie tout

Alors j'ai essayé le Berkelium et réécrite à mes besoins: même logique que tentative 2 avec le navigateur Web. Pas de chance non plus.

J'ai donc essayé d'ouvrir firefox lui-même et de voir si je peux émuler ce comportement avec un vrai navigateur. Effectivement! Quand j'ouvre firefox, et forcer l'ouverture du fichier (si vous ouvrez simplement un nouveau fichier, firefox n'y navigue pas, mais détecte que celui-ci était déjà ouvert et le rafraîchit simplement) Je l'ai remarqué en raison de l'ouverture rapide du page! Un petit script pour forcer l'ouverture du même fichier deux fois (naviguer) dans une session firefox a eu le même effet: tout CSS corrompu! Par conséquent, pour une raison ou une autre, vous ne devriez pas naviguer deux fois dans le même fichier, mais au lieu de tout fermer, forcez simplement un rafraîchissement! Pas « Naviguer »

Espoir cette info peut aider les autres, puisque j'ai perdu beaucoup de temps à trouver qu'il est le « Navigate » dans le même fichier plus d'une fois provoquant la corruption des feuilles de style