C# contrôle WebBrowser ne pas appliquer la css
J'ai un projet que je suis en train de travailler avec VS2005. J'ai ajouté un contrôle WebBrowser. J'ajoute un page vide pour le contrôle
private const string _basicHtmlForm = "<html> "
+ "<head> "
+ "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> "
+ "<title>Test document</title> "
+ "<script type='text/javascript'> "
+ "function ShowAlert(message) { "
+ " alert(message); "
+ "} "
+ "</script> "
+ "</head> "
+ "<body><div id='mainDiv'> "
+ "</div></body> "
+ "</html> ";
private string _defaultFont = "font-family: Arial; font-size:10pt;";
private void LoadWebForm()
{
try
{
_webBrowser.DocumentText = _basicHtmlForm;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
puis ajouter différents éléments via les dom (à l'aide de _webBrowser.Document.CreateElement). Je suis également le chargement d'un fichier css:
private void AddStyles()
{
try
{
mshtml.HTMLDocument currentDocument = (mshtml.HTMLDocument) _webBrowser.Document.DomDocument;
mshtml.IHTMLStyleSheet styleSheet = currentDocument.createStyleSheet("", 0);
TextReader reader = new StreamReader(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath),"basic.css"));
string style = reader.ReadToEnd();
styleSheet.cssText = style;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Voici le css de la page table des matières:
body {
background-color: #DDDDDD;
}
.categoryDiv {
background-color: #999999;
}
.categoryTable {
width:599px; background-color:#BBBBBB;
}
#mainDiv {
overflow:auto; width:600px;
}
Le style de la page de chargement avec succès, mais les seuls éléments de la page qui sont touchés sont ceux qui sont initialement dans la page (corps et mainDiv). J'ai aussi essayé d'inclure le css dans un élément dans la section d'en-tête, mais encore, elle affecte uniquement les éléments qui sont là quand la page est créée.
Donc ma question est, quelqu'un a une idée sur le pourquoi de la css n'est pas appliqué à des éléments qui sont créés après le chargement de la page? J'ai également essayé le pas de l'application de la css jusqu'à ce que après tous mes éléments sont ajoutés, mais les résultats ne changent pas.
Je sais que c'est probablement ce qui n'aide pas du tout (c'est pourquoi c'est un commentaire), mais je voulais vous dire par expérience que C#'s composant WebBrowser est indésirable. Apparemment trivial, les choses ont tendance à finir comme massive des maux de tête et quand il n'est pas de faire ce que vous voulez, vous finissent souvent par avoir à passer par les sous-jacents composant ActiveX... ce qui est un gâchis pour dire le moins (~5 différentes interfaces totalement désorganisés, ayant arbitraire ensembles de fonctionnalités). Je recommande fortement un autre composant de navigateur chaque fois que possible, par exemple GeckoFX, basé sur le moteur de Firefox.
Il y a une part de l'information qui manque ici: les éléments que vous êtes en train de créer, ceux qui ne sont pas de style. Sans doute, la configuration de l'attribut de classe de
"categoryDiv"
, "categoryTable"
, etc... Mais, ce n'est pas explicitement mentionné dans votre question. Étant donné les résultats que vous décrivez, je suis beaucoup plus enclins à penser qu'il y a un bug dans ton élément de la création de tout ce qui est directement connecté à votre feuille de style de création. Cela étant dit, vous ne réalisez que vous êtes forçant la nouvelle feuille de style pour être le premier dans le document (et donc moins prioritaire), à droite?Je soupçonne que vous êtes en droit. J'ai créé une version d'essai de James projet et j'obtiens les styles appliqués à de nouveaux éléments de l'affaire (donné quelques petits mods).
heh, j'ai fait de même, avec les mêmes résultats. Bon travail sur la réponse!
OriginalL'auteur JamesL | 2010-04-01
Vous devez vous connecter pour publier un commentaire.
J'ai fait une légère modification à votre AddStyles() la méthode et cela fonctionne pour moi.
Où en êtes-vous de l'appeler à partir? Je l'ai appelé de "_webBrowser_DocumentCompleted".
Je dois préciser que je suis d'appel AddStyles après je modifie le DOM.
Voici mon DocumentCompleted gestionnaire (j'ai ajouté quelques styles de base.css pour les tests):
C'est ce que je reçois (modifié le style pour le rendre plus laid qu'un seul être humain peut espérer le faire 😀 ):
le texte d'alt http://www.freeimagehosting.net/uploads/2e372f7276.png
La Mission Est Accomplie. 🙂
OriginalL'auteur Andre Artus
une solution consiste à inspecter le code html avant le réglage de la DocumentText et injecter CSS côté client. Je n'ai pas le contrôle de la propriété de l'url, mais plutôt s'en HTML via un client web et ensuite définir la DocumentText. peut-être mettre en DocumentText (ou, dans votre cas, le Document) après avoir manipuler le DOM pourrait obtenir à nouveau s'afficher correctement
OriginalL'auteur MarkDav.is
Il serait assez difficile de dire, à moins que vous envoyer un lien de cette.
mais généralement la meilleure méthode pour faire style liées truc, c'est que vous avez le css déjà dans la page et dans votre code c# de n'ajouter des id ou des classes d'éléments pour voir les styles d'effets.
avez-vous des styles en ligne peut être votre css perd à leur hiérarchie d'héritage?
non, je n'ai pas de styles en ligne.
c'est probablement mieux si vous envoyez un lien afin que je puisse firebug. il est difficile de simplement poser des questions pour connaître le fond de cette.
Il n'y a pas de lien. C'est un contrôle WebBrowser à l'intérieur d'un formulaire windows.
OriginalL'auteur Ali Habibzadeh
J'ai trouvé que les étiquettes générées avec un attribut de classe de ne pas obtenir leurs styles appliqués.
C'est ma solution de contournement qui se fait après le document est généré:
Je ne peux pas vous aider avec ça, qui sonne comme quelque chose mérite une question de sa propre
OriginalL'auteur hultqvist
- Je utiliser des approches similaires de contrôle au lieu de WebBrowser, je charge une page HTML avec "par défaut" des règles de style et j'ai changer les règles au sein du programme.
(Inconvénient d'entretien, quand j'en ai besoin pour ajouter une règle, j'ai aussi besoin de changer dans le code)
OriginalL'auteur Atara
Il se pourrait que les objets sur la page d'EXISTER au moment où la page est en cours de chargement, de sorte que chaque style peut être appliqué. juste parce que vous ajoutez un nœud de l'arborescence DOM, qui ne veut pas dire qu'il peut avoir tous ses attributs manipulé et transformé à l'intérieur du navigateur.
les méthodes ci-dessus semblent utiliser une approche de la recharge la page (DOM), ce qui suggère que cela peut être le cas.
En bref, actualiser la page une fois que vous avez ajouté un élément
OriginalL'auteur rigamonk
Il sonne comme si krpphv a connu ce. Je pense que la façon dont je l'approche, c'est d'ajouter une référence à jquery pour votre document html (depuis le début).
Puis à l'intérieur de la page, créer une fonction javascript qui accepte l'id de l'élément et le nom de la classe à s'appliquer. À l'intérieur de la fonction, l'utilisation de jquery pour dynamtically appliquer la classe en question ou de modifier le css directement. Par exemple, utiliser .addClass ou .css fonctions de jquery pour modifier l'élément.
À partir de là, dans votre code C#, après l'ajout de l'élément invoquer dynamiquement ce javascript tel que décrit par Rick Strahl ici: http://www.west-wind.com/Weblog/posts/493536.aspx
OriginalL'auteur j03m