В моей программе vb.net я использую веб-браузер, чтобы показать пользователю предварительный просмотр HTML. Раньше я обращался к серверу, чтобы захватить HTML, а затем возвращался в асинхронный поток и генерировал событие для заполнения WebBrowser.DocumentText возвращаемой строкой HTML.
Теперь я настроил его, чтобы получить всю информацию о клиенте, даже не обращаясь к серверу, и я пытаюсь вызвать то же событие. Я смотрю, как проходит код, и в нем есть правильная строка HTML и все такое, но когда я пытаюсь сделать
browser.DocumentText = _emailHTML
содержимое DocumentText остается как "<HTML></HTML>"
Мне просто интересно, почему не устанавливается DocumentText. У кого-нибудь есть предложения?





Попробуйте следующее:
browser.Navigate("about:blank");
HtmlDocument doc = browser.Document;
doc.Write(String.Empty);
browser.DocumentText = _emailHTML;
Я обнаружил, что элемент управления WebBrowser обычно необходимо инициализировать как about:blank. То же самое необходимо сделать между переходами к разным типам контента (например, text / xml в text / html), потому что средство визуализации отличается (mshtml для text / html, что-то еще для text / xml).
(через http://geekswithblogs.net/paulwhitblog/archive/2005/12/12/62961.aspx)
Почему после doc.Write следует DocumentText = ...? Разве не достаточно просто сделать браузер. Document.Write (_emailHTML) ;?
Не думайте, что этот метод работает, если для AllowNavigation установлено значение false.
Спасибо, я часами боролся с этой проблемой ... Тем не менее, я не понимаю, почему решение работает. Могли бы объяснить, зачем нужен doc.Write (...)?
Прошло несколько лет с тех пор, как я работал с элементом управления в браузере, но, если я правильно помню, это было связано с инициализацией ... это, конечно, не идеально, но также не нужно переходить к about: blank как часть инициализации. . Я бы рекомендовал создать метод под названием «InitializeWebBrowser» или что-то в этом роде, чтобы смысл был ясен.
Только что заметил это в нашем старом коде.
_webBrowser.DocumentText = builder.WriteToString( ... );
Application.DoEvents();
По-видимому, DoEvents также запускает браузер в рендеринг
Неудивительно, что это может сработать, но я бы рекомендовал по возможности избегать использования DoEvents. Он сообщает циклу обработки сообщений остановить все и обработать все сообщения в очереди. См. codinghorror.com/blog/2004/12/is-doevents-evil.html.
пожалуйста, обратитесь к этому ответу C# filenotfoundexception в веб-браузере?
В то время как Application.DoEvents() исправляет это в проекте WinForms, это не имеет отношения к проекту WPF.
Я наконец заставил его работать, используя webBrowser.Write( htmlContent ) (вместо webBrowser.DocumentText = htmlContent).
Это всегда работает
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;
}
Я нашел следующее, и это сработало!
webBrowser.Navigate("about:blank");
webBrowser.Document.OpenNew(false);
webBrowser.Document.Write(html);
webBrowser.Refresh();
Это тот, который у меня сработал. Единственное, чего мне не хватало, так это обновления.
Работает как шарм ... даже с AllowNav = false
К сожалению, это не приведет к возникновению события DocumentCompleted.
Убедитесь, что вы не отменяете событие Навигация из Веб-браузер для страницы about: blank. Веб-браузер переходит к about: blank перед установкой DocumentText. Поэтому, если вы хотите обрабатывать ссылки самостоятельно, вам необходимо создать следующий обработчик события Навигация:
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
if (e.Url.OriginalString.StartsWith("about:"))
{
return;
}
e.Cancel = true;
// ...
}
Я нашел лучший способ справиться с этим:
if (this.webBrowser1.Document == null)
{
this.webBrowser1.DocumentText = htmlSource;
}
else
{
this.webBrowser1.Document.OpenNew(true);
this.webBrowser1.Document.Write(htmlSource);
}
не забудьте поместить Refresh () в блок else.
Это сработало для меня:
webBrowser.Navigate("about:blank");
webBrowser.Document?.Write(htmlString);
Я ценю помощь. Оказывается, мне удалось получить его с помощью browser.Document.OpenNew (True) Вы правы - мне нужно было его инициализировать.