#.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, которое имело дополнительное преимущество в упрощении моего кода