2008-10-06 15 views
35

In meinem vb.net-Programm verwende ich einen Webbrowser, um dem Benutzer eine HTML-Vorschau zu zeigen. Ich habe zuvor einen Server getroffen, um den HTML-Code zu erhalten, und dann einen asynchronen Thread zurückgegeben und ein Ereignis ausgelöst, um den WebBrowser.DocumentText mit der von mir zurückgegebenen HTML-Zeichenfolge zu füllen..Net WebBrowser.DocumentText ändert sich nicht!

Jetzt habe ich es eingerichtet, um alle Informationen auf dem Client zu greifen, ohne jemals den Server zu treffen, und ich versuche, das gleiche Ereignis zu erheben. Ich sehe der Code gehen, und es hat die HTML-Zeichenfolge richtig und alles, aber wenn ich versuche,

browser.DocumentText = _emailHTML 

den Inhalt von Documenttext zu tun bleiben als „<HTML></HTML>

Ich frage mich, warum der Documenttext wurde nicht eingestellt. Hat jemand irgendwelche Vorschläge?

Antwort

49

Versuchen Sie Folgendes:

browser.Navigate("about:blank"); 
HtmlDocument doc = browser.Document; 
doc.Write(String.Empty); 
browser.DocumentText = _emailHTML; 

ich gefunden habe, dass die WebBrowser Kontrolle in der Regel ohnehin about:blank initialisiert werden muss. Das gleiche gilt für die Navigation zu verschiedenen Inhaltstypen (z. B. text/xml zu text/html), da der Renderer anders ist (mshtml für text/html, etwas anderes für text/xml).

(via http://geekswithblogs.net/paulwhitblog/archive/2005/12/12/62961.aspx)

+5

Ich schätze die Hilfe. Stellt sich heraus, ich konnte es mit browser.Document.OpenNew (True) Sie haben Recht - ich musste es initialisieren. –

+1

Erstaunlich. Schöne Beschwörung. –

+2

Warum der doc.Write gefolgt von DocumentText = ...? Ist es nicht genug, nur einen Browser zu tun.Document.Write (_emailHTML) ;? – Nikodemus

1

Gerade entdeckt dies in einigen unserer alten Code.

_webBrowser.DocumentText = builder.WriteToString(...); 

Application.DoEvents(); 

offenbar ein DoEvents schlägt auch den Browser in

+0

Es ist nicht überraschend, dass dies funktioniert, aber ich würde empfehlen, die Verwendung von DoEvents möglichst zu vermeiden. Er weist die Nachrichtenschleife an, alles zu stoppen und alle Nachrichten in der Warteschlange zu verarbeiten. Siehe http://www.codinghorror.com/blog/2004/12/is-doevents-evil.html. –

0

Während Application.DoEvents() es in einem WinForms-Projekt zu beheben, war es in einem WPF-Projekt irrelevant.

Ich habe es endlich zur Arbeit mit webBrowser.Write(htmlContent) (anstelle von webBrowser.DocumentText = htmlContent).

0

Dies gilt immer

using mshtml; 


private IHTMLDocument2 Document 
{ 
    get 
    { 
     if (Browser.Document != null) 
     { 
      return Browser.Document.DomDocument as IHTMLDocument2; 
     } 

     return null; 
    } 
} 


if (Document == null) 
{ 
    Browser.DocumentText = Contents; 
} 
else 
{ 
    Document.body.innerHTML = Contents; 
} 
31

ich folgendes und es funktionierte gefunden!

webBrowser.Navigate("about:blank"); 
    webBrowser.Document.OpenNew(false); 
    webBrowser.Document.Write(html); 
    webBrowser.Refresh(); 
+1

Dies ist die eine, die für mich arbeitete. Das einzige, was mir gefehlt hat, war die Erfrischung. –

+0

Funktioniert wie ein Zauber ... sogar mit dem AllowNav = false –

+1

Leider wird dies das 'DocumentCompleted' Ereignis nicht auslösen. –

0

Vergewissern Sie sich, dass Sie nicht kündigen Navigation Fall WebBrowser für about: blank Seite. WebBrowser navigiert zu über: leer vor der Einstellung DocumentText. Also, wenn Sie für sich selbst behandeln Links wollen, müssen Sie folgende Prozedur von Navigation Ereignis erstellen:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    if(e.Url.OriginalString.StartsWith("about:")) 
    { 
     return; 
    } 
    e.Cancel = true; 
    // ... 
} 
8

ich den besten Weg zu handhaben gefunden wird, wird wie folgt dar:

if (this.webBrowser1.Document == null) 
{ 
    this.webBrowser1.DocumentText = htmlSource; 
} 
else 
{ 
    this.webBrowser1.Document.OpenNew(true); 
    this.webBrowser1.Document.Write(htmlSource); 
} 
+0

Denken Sie daran, die Refresh() in den Else-Block zu legen. – ThunderGr

1

That arbeitete für mich:

webBrowser.Navigate("about:blank"); 
webBrowser.Document?.Write(htmlString);