Элемент управления WebBrowser не рисует до тех пор, пока я не изменю размер родительской формы

#.net #vb.net #winforms #webbrowser-control

Вопрос:

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

Я попытался добавить WebBrowser.Refresh() , но это не помогло.

Функция, которая создает всплывающую форму:

 Public Function PopupHtmlForm(title As String, body As String, Optional formSize As Size = Nothing) As Form
    Dim formWidth = IIf(formSize = Nothing, 300, formSize.Width)
    Dim formHeight = IIf(formSize = Nothing, 500, formSize.Height)

    Dim frm = New Form
    frm.Size() = New Size(formWidth, formHeight)
    frm.Icon = Main.Icon
    frm.Text = title

    Dim htmlBody = New WebBrowser With {
        .DocumentText = body,
        .Location = New Point(5, 5),
        .Width = frm.ClientSize.Width - 10,
        .Height = frm.ClientSize.Height - 15,
        .BackColor = Color.White,
        .AutoSize = True,
        .MaximumSize = New Size(frm.ClientSize.Width - 10, 0)
    }

    frm.Controls.Add(htmlBody)
    frm.StartPosition = FormStartPosition.Manual
    frm.Location = New Size(1000, 50)
    frm.AutoScroll = True
    If frm.VerticalScroll.Visible Then htmlBody.MaximumSize = New Size(frm.ClientSize.Width - 10 - SystemInformation.VerticalScrollBarWidth, 0)
    AddHandler frm.SizeChanged, Sub()
                                    htmlBody.MaximumSize = New Size(frm.ClientSize.Width - 10, 0)
                                    htmlBody.Width = frm.ClientSize.Width - 10
                                    htmlBody.Height = frm.ClientSize.Height - 15
                                End Sub

    htmlBody.Refresh() 'Added to try to get the control to draw
    Return frm

End Function
 

Код вызова:

 Dim lorem As String = "..."
PopupHtmlForm("This is a popup", lorem).ShowDialog()
 

Вы можете увидеть результат ниже — пустая форма диалога может перемещаться, но как только она изменяется, она, наконец, отображает содержимое:

введите описание изображения здесь

Из процесса устранения кажется, что изменение htmlBody.Height -это то, что вызывает перерисовку, но когда я пытаюсь сделать это до отображения формы, содержимое DocumentText все еще не отображается.

Есть ли способ заставить элемент управления WebBrowser рисовать без этого взаимодействия с пользователем?

Комментарии:

1. Dim htmlBody as New WebBrowser() With {.Dock = DockStyle.Fill, .DocumentText = body} frm.Controls.Add(htmlBody) . Удалите все остальное. Там у вас есть некоторые проблемы, такие как установка значения Location свойства Size и неправильные меры, принятые в неподходящее время. Вы можете удалить SizeChanged обработчик. — Я не знаю, что это такое: frm.Size() (Опечатка?). Также, If formSize = Nothing Then formSize = New Size(300, 500) frm.Size = formSize

2. Вы можете рассмотреть возможность использования WebView2 . Видишь docs.microsoft.com/en-us/microsoft-edge/webview2 для получения дополнительной информации.

3. @Jimi Спасибо — я адаптировал это из функции, которую я создал, которая использовала ярлык, но ваше упрощение решило проблему!

Ответ №1:

Когда вы вызываете форму, попробуйте сделать это:

     Dim lorem As String = "..."
    Dim PopupForm As Form = PopupHtmlForm("This is a popup", lorem)

    PopupForm.Height  = 1
    PopupForm.Height -= 1
    PopupForm.ShowDialog()
 

Я знаю, что это не лучший подход, но он все равно работает.

Комментарии:

1. Спасибо — это действительно работает! В конечном счете я выбрал решение для комментариев @Jimi, которое имело дополнительное преимущество в упрощении моего кода