Contrôle WebBrowser et GetElement par ID

J’utilise Visual C # Winforms pour contrôler un object WebBrowser.

Plus précisément, je souhaite utiliser WebBrowser.Document.GetObjectByID (“myid”). Style pour définir le style d’un object appartenant au document chargé dans l’object WebBrowser.

Je veux avoir le bouton sur le WinForm bascule le style d’un en-tête de “display: none” à “display: block; text-align: middle”. Voici ce que je fais:

private void frmView_Load(object sender, EventArgs e) { ssortingng question = "How many cows?"; ssortingng answer = "5 cows"; webBrowser1.Navigate("about:blank"); webBrowser1.Document.OpenNew(false); webBrowser1.Document.Write("

"); webBrowser1.Document.Write(question); webBrowser1.Document.Write("

"); webBrowser1.Document.Write(answer); webBrowser1.Document.Write("

"); webBrowser1.Refresh(); webBrowser1.Document.GetElementById("answer").Style = "display:none;"; //if I do a breakpoint here, I get the Style = "DISPLAY:NONE" btnAnswer.Visible = true; btnNext.Visible = true; } private void btnAnswer_Click(object sender, EventArgs e) { //if this is the first time ran, doing a breakpoint here will //show Style to be NULL webBrowser1.Document.GetElementById("answer").Style = "display:block;text-align:center"; //now the Style is properly set, and will remain that way, even after this function returns}

Notez que je suis en mesure de contrôler la propriété Style avec la méthode btnAnswer_Click, mais pas avec la méthode frmView_Load. Je sais que je peux simplement mettre les informations de style dans une balise div lorsque je les crée (cela fonctionne), mais pourquoi le code ci-dessus ne fonctionne-t-il pas?

Mettre à jour:
J’ai trouvé quelque chose qui pourrait aller dans la bonne direction. Si j’appelle webBrowser1.Update() à tout moment après webBrowser1.Navigate("about:blank") tout fonctionne dans frmView_Load. Malheureusement, toute tentative de modification du document après la fermeture de frmView_Load échouera. Non seulement ils échoueront, mais après le retour de frmView_Load, webBrowser1.Document sera défini sur NULL d’une manière ou d’une autre. Quelqu’un peut-il nous expliquer comment ce contrôle est censé fonctionner?

Après avoir examiné la documentation MS sur le contrôle WebBrowser, je me rends compte que tout ce que fait le navigateur est asynchrone. Cela dit, cela signifie que je dois bloquer mes threads de contrôle après avoir défini les propriétés afin de m’assurer que ces propriétés ont bien été définies.

Fondamentalement, mon “écriture” dans le document n’est pas effectuée simplement parce que la fonction “écriture” est renvoyée. Je dois bloquer le fil de contrôle jusqu’à ce que le document reflète ces modifications si je souhaite référencer le contenu de cette écriture. MS recommande une boucle de sumil. Voici à quoi ressemble ma fonction d’écriture et de blocage:

 private void ChangeDocument(ssortingng documentText, double timeout) { DateTime startTime = DateTime.Now; double elapsed = 0; if (webBrowser1.Document == null) { webBrowser1.Navigate("about:blank"); } webBrowser1.Document.OpenNew(false); while ((webBrowser1.DocumentText != "") && (elapsed < timeout)) { Thread.Sleep(50); elapsed = DateTime.Now.Subtract(startTime).TotalMilliseconds; } webBrowser1.Document.Write(documentText); startTime = DateTime.Now; elapsed = 0; while ((webBrowser1.DocumentText != documentText) && (elapsed < timeout)) { System.Threading.Thread.Sleep(50); elapsed = DateTime.Now.Subtract(startTime).TotalMilliseconds; } } 

Merci à tous pour vos réponses.

Pourquoi ne mettez-vous pas votre texte masqué dans un

avec le style display:none ? Lorsque vous devez l’afficher, il vous suffit de mettre à jour le style d’ display . Vous pouvez également appliquer ce style à l’élément h2 qui contient votre réponse dans votre exemple de code.

Je ne suis pas vraiment familier avec ce genre de choses, mais j’aurais pensé qu’il fallait appeler

 webBrowser1.Refresh(); 

tout à la fin de frmView_Load