Visual Studio 不允许我通过设计器将 CefSharpBrowserControl 添加到表单

Visual Studio is not letting me add CefSharpBrowserControl to a form via the designer

所以我决定试用 CefSharp 扩展,我遇到的第一件事是什么?一个不允许我使用附加组件的错误。

这太令人沮丧了,因为在我去过的任何论坛上,我都做了管理员或创建者让我做的每一件事。我试图只编译 CEFSharp 的 GitHub 上的源代码,但这没有用。

老实说,我认为他们应该只提供一个预编译的 .dll 文件或一组 .dll 文件,您可以将它们添加到引用中,而不是期望您自己做.只是很痛苦,CEFSharp。

我试过将配置设置为 x64 和任何 CPU。我试过引用几个与 CEFSharp 相关的不同 dll。我试图以编程方式添加浏览器元素,这很有效,但我不能用它做任何事情(例如在网页加载完成时执行代码)。到目前为止,这些解决方案中 none 完全有效。

Imports CefSharp
Imports CefSharp.WinForms
Public Class Browser
       Dim browser As New _ 
       CefSharp.WinForms.ChromiumWebBrowser("https://google.com/")
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles _ 
    MyBase.Load
       Me.Controls.Add(browser)
       browser.Parent = Panel1
       browser.Dock = DockStyle.Fill
    End Sub
End Class

任何时候我想通过设计器工具箱将浏览器控件添加到我的表单中,它都不会让我这样做。它一直显示这个错误框,上面写着 "Failed to load CefSharpBrowser, deleting from the toolbox." 或类似的内容。应该可以直接丢进设计器里,显然不行

在 CefSharp 的 google 组中也有类似的讨论:Adding CefSharp control to the toolbox and The name "WebView" does not exist in the namespace

他们说 Visual Studio 在使用混合模式 (C++/CLR) 程序集时有一些限制。 CefSharp 中没有开箱即用的 Visual Studio 设计器支持。 some hack 关于如何去做,但我认为不值得花时间在上面。大多数人只是接受事实并继续前进。

我们成功地将 CefSharp 用于我们的一个项目,并且我们以编程方式将 ChromiumWebBrowser 控件添加到表单中,这与您在示例中的做法非常相似。

I've tried to add the browser element programmatically, and that's worked, but I can't do anything with it (such as execute code when the webpage is done loading). So far none of these solutions have worked at all.

有一个 LoadingStateChanged 事件,您可以使用它来监视 Web 浏览器控件的状态。我们用它来显示进度指示,直到我们的网页完全加载。以下是我们的做法:

private System.Windows.Forms.PictureBox picProgress; 
bool loaded = false;   
ChromiumWebBrowser browse;      

public Main()
{
   var uiUrl = "some url or local html file";
   browse = new ChromiumWebBrowser(uiUrl);
   browse.Dock = DockStyle.Fill;
   Controls.Add(browse);
   browse.LoadingStateChanged += Browse_LoadingStateChanged;
}

private void Browse_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
    if (!e.IsLoading)
    {
        picProgress.BeginInvoke((Action)(() => {
            loaded = true;
            picProgress.Visible = false;
            browse.Visible = true;
        }));
    }
    else
    {
        browse.BeginInvoke((Action)(() => {
            loaded = false;
            browse.Visible = false;
        }));
    }
}

抱歉,它是用 C# 编写的,但我认为您可以轻松地将其改编为 VB.net。