Как обеспечить контроль WebBrowser и манипулировать HTML-документом? - PullRequest
1 голос
/ 16 декабря 2010

Добрый день

У меня есть вопрос об отображении HTML-документов в приложениях Windows Form. Приложение, над которым я работаю, должно отображать информацию из

база данных в формате html. Я попытаюсь описать действия, которые я предпринял (и которые потерпели неудачу):

1) Я попытался загрузить «виртуальную» HTML-страницу, которая существует только в памяти, и динамически изменить ее параметры (webbMain - это элемент управления WebBrowser):

public static string CreateBookHtml()
{
 StringBuilder sb = new StringBuilder();

 //Declaration
 sb.AppendLine(@"<?xml version=""1.0"" encoding=""utf-8""?>");
 sb.AppendLine(@"<?xml-stylesheet type=""text/css"" href=""style.css""?>");
 sb.AppendLine(@"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.1//EN"" 
                    ""http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"">");
 sb.AppendLine(@"<html xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"">"); 

 //Head
 sb.AppendLine(@"<head>");
 sb.AppendLine(@"<title>Exemplary document</title>");
 sb.AppendLine(@"<meta http-equiv=""Content-Type"" content=""application/xhtml+xml; 
                                                                charset=utf-8""/   >");
 sb.AppendLine(@"</head>");

 //Body
 sb.AppendLine(@"<body>");
 sb.AppendLine(@"<p id=""paragraph"">Example.</p>");
 sb.AppendLine(@"</body>");
 sb.AppendLine(@"</html>");

 return sb.ToString();
}

void LoadBrowser () { this.webbMain.Navigate ( "о: пустой"); this.webbMain.DocumentText = CreateBookHtml (); HtmlDocument doc = this.webbMain.Document; } * +1010 *

Это не удалось, поскольку doc.Body имеет значение null, а doc.getElementById ("абзац") также возвращает значение NULL. Поэтому я не могу изменить свойство InnerText абзаца.

Кроме того, this.webbMain.DocumentText имеет значение "\ 0" ...

2) Я попытался создать html-файл в указанной папке, загрузить его в веб-браузер и затем изменить его параметры. HTML такой же, как созданный

Метод CreateBookHtml ():

private void LoadBrowser()
        {
            this.webbMain.Navigate("HTML\\BookPage.html"));             
            HtmlDocument doc = this.webbMain.Document;
        }

На этот раз this.webbMain.DocumentText содержит Html-данные, прочитанные из файла, но doc.Body снова возвращает значение null, и я все еще не могу получить элемент, используя

getByElementId () метод. Конечно, когда у меня есть текст, я бы попробовал regex, чтобы получить указанные поля, или, возможно, сделал бы другие трюки для достижения цели, но мне интересно - есть ли просто способ mainipulate html? Для меня идеальным способом было бы создать текст HTML в памяти, загрузить его в элемент управления WebBrowser, а затем динамически изменять его параметры с помощью идентификаторов. Является ли это возможным? Спасибо за ответы заранее, с наилучшими пожеланиями,

1025 * Paweł *

Ответы [ 2 ]

6 голосов
/ 16 декабря 2010

Я работал некоторое время назад с WebControl, и, как вы хотели загрузить HTML из памяти, но у меня та же проблема, тело не имеет значения.После некоторого исследования я заметил, что методы Navigate и NavigateToString работают асинхронно, поэтому для загрузки документа требуется немного времени, документ не доступен сразу после вызова Navigate.Итак, я сделал что-то вроде (wbChat - это элемент управления WebBrowser):

wbChat.NavigateToString("<html><body><div>first line</div></body><html>");

DoEvents();

, где DoEvents () реализован как:

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public void DoEvents()
{
    DispatcherFrame frame = new DispatcherFrame();
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
                new DispatcherOperationCallback(ExitFrame), frame);
    Dispatcher.PushFrame(frame);
}

, и он работал для меня после вызова DoEventsЯ мог бы получить ненулевое тело:

mshtml.IHTMLDocument2 doc2 = (mshtml.IHTMLDocument2)wbChat.Document;

mshtml.HTMLDivElement div = (mshtml.HTMLDivElement)doc2.createElement("div");
div.innerHTML = "some text";
mshtml.HTMLBodyClass body = (mshtml.HTMLBodyClass)doc2.body;

if (body != null)
{
    body.appendChild((mshtml.IHTMLDOMNode)div);

    body.scrollTop = body.scrollHeight;
}
else
    Console.WriteLine("body is still null");

Я не знаю, является ли это правильным способом сделать это, но это исправило проблему для меня, возможно, это помогаетВы тоже.

Позже Правка:

public object ExitFrame(object f)
{
    ((DispatcherFrame)f).Continue = false;
    return null;
}

Метод DoEvents необходим в WPF.Для System.Windows.Forms можно использовать Application.DoEvents ().

1 голос
/ 04 апреля 2012

Еще один способ сделать то же самое:

webBrowser1.DocumentText = "<html><body>blabla<hr/>yadayada</body></html>";

это работает без дополнительной инициализации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...