C# WebBrowser - такой простой и такой сложный. Часть 3

среда, 29 сентября 2010, Александр Краковецкий

На днях столкнулся с еще несколькими вопросами & проблемами, связанных с WebBrowser.

Как обработать событие, когда пользователь скролит WebBrowser

По сути, необходимо события аля onscroll, которого в WebBrowser попросту нет. Но это событие присутствует на более низком DOM уровне.

Вот этот код позволяет выводить сообщение, когда пользователь скролит WebBrowser:

{
    webBrowser1.Navigate("some_url_string");
    while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }
    IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
    IHTMLWindow2 wnd = (IHTMLWindow2)doc.parentWindow;
    var ievents3 = (HTMLWindowEvents2_Event)wnd;
    ievents3.onscroll += new HTMLWindowEvents2_onscrollEventHandler (ievents3_onscroll);
}
void ievents3_onscroll(IHTMLEventObj pEvtObj)
{
    MessageBox.Show("scroll2");
}

Как проскролить WebBrowser программно?

Для работы со скролом есть несколько методов и свойств, а именно:

webBrowser1.Document.Body.ScrollIntoView(true) // позволяет проскролить в самый верх
webBrowser1.Document.Body.ScrollIntoView(false) // позволяет проскролить в самый низ
webBrowser1.Document.Body.ScrollLeft = 100; // устанавливает смещение влево
webBrowser1.Document.Body.ScrollTop = 100; // устанавливает смещение вверх
var rect = webBrowser1.Document.Body.ScrollRectangle; // возвращает текущую позицию

Как установить DocumentText программно

Другими словами, каким образом можно обойтись без использования метода Navigate() и установить значение DocumentText из строки.

Такой подход работать не будет:

webBrowser1 = new WebBrowser();
webBrowser1.DocumentText = html;
var text = webBrowser1.DocumentText; // text != html

Причина в том, что свойство Document должно быть инициализировано, например вот так:

webBrowser1 = new WebBrowser();
webBrowser1.Navigate("about:blank");
webBrowser1.DocumentText = html;
var text = webBrowser1.DocumentText; // text == html

Еще одним способом является использование такого кода:

webBrowser1 = new WebBrowser();
HtmlDocument doc = webBrowser1.Document;
doc.Write(String.Empty);
webBrowser1.DocumentText = html;
var text = webBrowser1.DocumentText; // text == html

Оговорюсь, что встречал стучаи, когда эти примеры не работают, в таком случае нужно комбинировать либо искать причину в другом месте.

Как выполнить JavaScript программно?

Внедряем JavaScript код в страницу и выполняем его таким образом:

HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = "function sayHello() { alert('hello!') }";
head.AppendChild(scriptEl);
webBrowser1.Document.InvokeScript("sayHello");

По этой теме на сегодня все.


Ищите нас в интернетах!

Комментарии

Свежие вакансии