CEFSharp (Chromium Embedded Framework) в Interop User Control

Я пытаюсь использовать привязки CefSharp CLR для Chromium Embedded Framework, чтобы создать альтернативный элемент управления веб-браузером, который мы можем встроить в приложение, которое поддерживает только устаревшие элементы управления ActiveX (ЧМИ WonderWare InTouch), в попытке получить некоторую поддержку HTML5 для некоторых реальных старые машины.

До сих пор я создал Interop User Control, используя Microsoft InteropForms Toolkit и внедрил CefSharp.WinForms WebView в элемент управления простым способом, т.е.

Private Sub WebControl_Load(sender As Object, e As EventArgs) Handles Me.Load

    Dim Settings = New CefSharp.Settings
    If (CEF.Initialize(Settings)) Then
        WebView = New WebView(homepage, New BrowserSettings())
        WebView.Dock = DockStyle.Fill
    End If

    Me.Controls.Add(WebView)

End Sub

Когда я создаю DLL, я регистрирую ее с помощью команды

regasm /tlb /codebase Cefsharp.WebControl.dll

Кажется, это работает по большей части, но у меня есть некоторые проблемы, которые я не совсем понимаю. Я тестирую его с помощью форм VBA в Excel (исключительно для удобства), и когда я использую Form Builder, он фактически инициализирует элемент управления, когда он добавляется в пользовательскую форму, и отлично загружает веб-страницу:

Пример IDE

Однако, когда я пытаюсь показать UseForm, кажется, что он либо уничтожает дескриптор, либо экземпляр веб-просмотра (или и то, и другое), и я не могу понять, как это исправить. Как только я попытаюсь показать форму и попробовать что-то вроде

Sub Test()
    WebForm.Show
    WebForm.WebControl.Navigate "www.google.com"
End Sub

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

Если у кого-то есть понимание этого, я был бы очень признателен. Спасибо!


person Karter    schedule 11.12.2013    source источник


Ответы (1)


Хорошо, я понял это! Я думаю, что это частично было связано с обработчиком, а частично с тем, как/когда я инициализировал веб-просмотр. Решение, которое я выбрал, закончилось использованием CefSharp.Wpf вместо формы Windows, но в основном это то же самое. Основное отличие заключается в добавлении инициализации элемента управления ElementHost в WebControl Designer и создании нового WebView как части инициализации компонента:

'Do not change this subroutine in the code editor. Use the designer.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
    Me.WebHost = New System.Windows.Forms.Integration.ElementHost()
    Me.SuspendLayout
    '
    'WebHost
    '
    Me.WebHost.Dock = System.Windows.Forms.DockStyle.Fill
    Me.WebHost.Location = New System.Drawing.Point(0, 0)
    Me.WebHost.Name = "WebHost"
    Me.WebHost.Size = New System.Drawing.Size(404, 244)
    Me.WebHost.TabIndex = 0
    Me.WebHost.Text = "WebHost"
    Me.WebHost.Child = New WebView(homepage, New CefSharp.BrowserSettings)
    '
    'WebControl
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!)
    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    Me.Controls.Add(Me.WebHost)
    Me.Name = "WebControl"
    Me.Size = New System.Drawing.Size(404, 244)
    Me.ResumeLayout(false)

End Sub

Friend WithEvents WebHost As System.Windows.Forms.Integration.ElementHost
person Karter    schedule 12.12.2013