Управление WebBrowser и GetElement по ID - PullRequest
2 голосов
/ 02 марта 2012

Я использую Visual C # Winforms для управления объектом WebBrowser.

В частности, я хочу использовать WebBrowser.Document.GetObjectByID ("myid"). Стиль для установки стиля объекта, который является частью документа, загружаемого в объект WebBrowser.

Я хочу, чтобы кнопка WinForm переключала стиль заголовка с «display: none» на «display: block; text-align: middle». Вот что я делаю:

private void frmView_Load(object sender, EventArgs e)
{
string question = "How many cows?";
string answer = "5 cows";
webBrowser1.Navigate("about:blank");
webBrowser1.Document.OpenNew(false);
webBrowser1.Document.Write("<html><body><div id='question'><h1>");
webBrowser1.Document.Write(question);
webBrowser1.Document.Write("</h1></div><div id='answer'><h2>");
webBrowser1.Document.Write(answer);
webBrowser1.Document.Write("</h2></div></body></html>");
webBrowser1.Refresh();
webBrowser1.Document.GetElementById("answer").Style = "display:none;";
//if I do a breakpoint here, I get the Style = "DISPLAY:NONE"
btnAnswer.Visible = true;
btnNext.Visible = true;
}

private void btnAnswer_Click(object sender, EventArgs e)
{
//if this is the first time ran, doing a breakpoint here will
//show Style to be NULL
webBrowser1.Document.GetElementById("answer").Style = "display:block;text-align:center";
//now the Style is properly set, and will remain that way, even after this function returns}

Обратите внимание, что я могу управлять свойством Style с помощью метода btnAnswer_Click, но не с помощью метода frmView_Load. Я знаю, что могу просто поместить информацию о стиле в тег div при создании (это работает), но почему не работает приведенный выше код?

Обновление:
Я нашел то, что может идти в правильном направлении. Если я позвоню webBrowser1.Update() в любой момент после webBrowser1.Navigate("about:blank"), все в frmView_Load работает. К сожалению, любые попытки изменить документ после выхода из frmView_Load не удастся. Они не только потерпят неудачу, но и после того, как frmView_Load вернет webBrowser1. Документ будет каким-то образом установлен в NULL. Кто-нибудь может пролить свет на то, как этот элемент управления должен работать?

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

После просмотра документации MS на элементе управления WebBrowser я понимаю, что все, что делает браузер, является асинхронным. Сказав это, это означает, что я должен заблокировать свои управляющие потоки после установки свойств, чтобы гарантировать, что эти свойства были установлены.

По сути, моя «запись» в документ не выполнена только потому, что возвращается функция «записи». Я должен блокировать поток управления, пока документ не отразит эти изменения, если я захочу сослаться на содержание этой записи. MS рекомендует цикл сна. Вот как выглядит моя функция write & block:

private void ChangeDocument(string documentText, double timeout)
{
    DateTime startTime = DateTime.Now;
    double elapsed = 0;

    if (webBrowser1.Document == null)
    {
        webBrowser1.Navigate("about:blank");
    }

    webBrowser1.Document.OpenNew(false);

    while ((webBrowser1.DocumentText != "") && (elapsed < timeout))
    {
        Thread.Sleep(50);
        elapsed = DateTime.Now.Subtract(startTime).TotalMilliseconds;
    }

    webBrowser1.Document.Write(documentText);

    startTime = DateTime.Now;
    elapsed = 0;

    while ((webBrowser1.DocumentText != documentText) && (elapsed < timeout))
    {
        System.Threading.Thread.Sleep(50);
        elapsed = DateTime.Now.Subtract(startTime).TotalMilliseconds;
    }
}

Спасибо за ваши ответы всем.

0 голосов
/ 02 марта 2012

Я не очень знаком с этим материалом, но я бы подумал, что вам нужно позвонить

webBrowser1.Refresh();

в самом конце frmView_Load

0 голосов
/ 02 марта 2012

Почему бы вам не поместить скрытый текст в <div> со стилем display:none?Когда вам нужно показать его, вам просто нужно обновить стиль display.Вы также можете применить этот стиль к элементу h2, который содержит ваш ответ в вашем примере кода.

...