.Net WebBrowser.DocumentText не меняется!

В моей программе vb.net я использую веб-браузер, чтобы показать пользователю предварительный просмотр HTML. Раньше я обращался к серверу, чтобы захватить HTML, а затем возвращался в асинхронный поток и генерировал событие для заполнения WebBrowser.DocumentText возвращаемой строкой HTML.

Теперь я настроил его, чтобы получить всю информацию о клиенте, даже не обращаясь к серверу, и я пытаюсь вызвать то же событие. Я смотрю, как проходит код, и в нем есть правильная строка HTML и все такое, но когда я пытаюсь сделать

browser.DocumentText = _emailHTML

содержимое DocumentText остается как "<HTML></HTML>"

Мне просто интересно, почему не устанавливается DocumentText. У кого-нибудь есть предложения?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
42
0
40 216
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

Попробуйте следующее:

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)

Я ценю помощь. Оказывается, мне удалось получить его с помощью browser.Document.OpenNew (True) Вы правы - мне нужно было его инициализировать.

Joe Morgan 06.10.2008 18:32

Почему после doc.Write следует DocumentText = ...? Разве не достаточно просто сделать браузер. Document.Write (_emailHTML) ;?

Nikodemus RIP 28.03.2012 18:03

Не думайте, что этот метод работает, если для AllowNavigation установлено значение false.

Brad Moore 30.01.2013 07:14

Спасибо, я часами боролся с этой проблемой ... Тем не менее, я не понимаю, почему решение работает. Могли бы объяснить, зачем нужен doc.Write (...)?

Moonwalker 06.02.2013 20:53

Прошло несколько лет с тех пор, как я работал с элементом управления в браузере, но, если я правильно помню, это было связано с инициализацией ... это, конечно, не идеально, но также не нужно переходить к about: blank как часть инициализации. . Я бы рекомендовал создать метод под названием «InitializeWebBrowser» или что-то в этом роде, чтобы смысл был ясен.

David Mohundro 06.02.2013 21:27

Только что заметил это в нашем старом коде.

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

Application.DoEvents();

По-видимому, DoEvents также запускает браузер в рендеринг

Неудивительно, что это может сработать, но я бы рекомендовал по возможности избегать использования DoEvents. Он сообщает циклу обработки сообщений остановить все и обработать все сообщения в очереди. См. codinghorror.com/blog/2004/12/is-doevents-evil.html.

David Mohundro 06.02.2013 21:29

пожалуйста, обратитесь к этому ответу 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();

Это тот, который у меня сработал. Единственное, чего мне не хватало, так это обновления.

Matt Winward 26.07.2013 14:34

Работает как шарм ... даже с AllowNav = false

Danny Fallas 19.03.2016 02:02

К сожалению, это не приведет к возникновению события DocumentCompleted.

Robert S. 30.11.2016 12:35

Убедитесь, что вы не отменяете событие Навигация из Веб-браузер для страницы 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.

ThunderGr 19.05.2014 14:51

Это сработало для меня:

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

Другие вопросы по теме