互操作用户控制中的 CEFSharp(Chromium 嵌入式框架)

问题描述 投票:0回答:2

我正在尝试使用 Chromium 嵌入式框架的 CefSharp CLR 绑定来创建替代 Web 浏览器控件,我们可以将其嵌入到仅支持旧版 ActiveX 控件 (WonderWare InTouch HMI) 的应用程序中,以尝试为某些应用程序获得一些 HTML5 支持。确实是旧机器。

到目前为止,我已经使用 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 /代码库 Cefsharp.WebControl.dll

这似乎在大多数情况下都有效,但我遇到了一些我不完全理解的问题。我正在使用 Excel 中的 VBA 表单对其进行测试(纯粹是出于方便),当我使用表单生成器时,它实际上在将控件添加到用户表单时初始化该控件并完美加载网页:

IDE Example

但是,当我尝试显示 UseForm 时,它似乎会破坏 webview 的句柄或实例(或两者),并且我不知道如何修复它。一旦我尝试显示表格并尝试类似的事情

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

我收到一个错误,指出该对象不存在。我搞砸了一点,有时我会得到不同的错误,比如指针无效,但到目前为止我还没有弄清楚如何正确设置它。我认为这是处理用户表单事件的问题,但我不确定。

如果有人对此有任何见解,我将不胜感激。谢谢!

.net vb.net interop chromium-embedded cefsharp
2个回答
1
投票

好吧,我明白了!我认为这部分与处理程序有关,部分与我如何/何时初始化网络视图有关。我采用的解决方案最终使用 CefSharp.Wpf 而不是 Windows 窗体,但它基本上是相同的。主要区别是在 WebControl 设计器上添加 ElementHost 控件的初始化,并创建新的 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

0
投票

确实是老话题了,但你介意分享你的项目吗?

© www.soinside.com 2019 - 2024. All rights reserved.