12

我正在创建 Microsoft.Web.WebView2.WinForm.WebView2 的对象,但这个 coreWebView2 的子对象为空

Microsoft.Web.WebView2.WinForm.WebView2 webView = new Microsoft.Web.WebView2.WinForm.WebView2()
// Change some GUI properties of webView
webView.CoreWebView.NavigateUrl(url)
// I can not access the above line because CoreWebView is null
4

10 回答 10

10

使用该EnsureCoreWebView2Async方法初始化基础CoreWebView2属性。这记录在 MSDN 上。此属性在类对象null的初始化上。WebView2

CoreWebView2 底层 CoreWebView2。

公共CoreWebView2 CoreWebView2

使用此属性可对 WebView2 内容执行比在 WebView2 上公开的操作更多的操作。该值在初始化之前为空。您可以强制底层 CoreWebView2 通过 InitializeAsync (EnsureCoreWebView2Async - 显然微软未能更新他们的文档) 方法进行初始化。

来源(https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/winforms/0-9-515/microsoft-web-webview2-winforms-webview2

于 2020-07-27T13:51:04.947 回答
8

我尝试了所有网络上的所有内容,但CoreWebView2总是null.

事实证明,我错过了Edge 的运行时。

然后我使用来自Microsoft Edge WebView2的 Evergreen Standalone 安装程序安装它。然后它起作用了!

于 2021-03-16T12:39:54.513 回答
4

您可以使用EnsureCoreWebView2Async它来确保在进行任何导航之前初始化对象。但是,更简单的是,您可以设置Source确保触发初始化的属性(如果尚未触发):

Microsoft.Web.WebView2.WinForm.WebView2 webView = new Microsoft.Web.WebView2.WinForm.WebView2();
webView.Soure = url;
于 2020-07-27T18:08:06.043 回答
1

我在我的 Visual Basic 项目中通过在 WebView2.CoreWebView2Ready 事件中设置一个布尔变量解决了这个问题,然后调用了一个一次性事件循环来等待表单激活事件以检查变量以确保它已初始化并准备好利用

我注意到即使在等待异步之后它仍然没有准备好立即使用并且 corewebview2 仍然为空,但这可能是 vb 的事情

这是一个从我的 webview2 Visual Basic 项目转换为 c# 的示例,它应该在 c# 中工作

class SurroundingClass
{
    private bool FstRun = true;
    private bool WebReady = false;

    private void Form1_Activated(object sender, EventArgs e)
    {
        if (FstRun == true)
        {
            FstRun = false;
            InitAsync();
            Wait();  // wait for webview to initiaise
           // code or sub here to reference the control navigate ect
        }
    }
    private void WebView21_CoreWebView2Ready(object sender, EventArgs e)
    {
        WebReady = true;
    }

    private async void InitAsync()
    {
        await WebView21.EnsureCoreWebView2Async;
    }

    private void Wait()
    {
        while (!WebReady == true)
            System.Windows.Forms.Application.DoEvents();
    }
}
于 2020-12-29T15:55:11.737 回答
1

首先,您必须使用以下代码初始化 webview2。

WebView21.EnsureCoreWebView2Async()

然后您应该在名为 CoreWebView2InitializationCompleted 的事件中编写以下代码。

WebView21.CoreWebView2.Navigate(yoururl)
于 2021-07-31T21:42:10.313 回答
1

正如@Abbas Tambawala 在评论中所说,您必须确保您的项目设置为特定位数。有时默认的“AnyCPU”设置似乎可以工作,但控件不会初始化,await webView.EnsureCoreWebView2Async将返回一个永远不会完成的任务,CoreWebView2将为 null,其他症状将成为检查项目中该设置的线索。

另外,请注意,如果您正在开发具有多个项目的解决方案,就像我一样......您需要确保所有项目都始终正确标记。

我正在处理的 DLL 项目被标记为 X86,但加载我的 DLL 的项目被标记为“AnyCPU”。WTF 的许多时刻正在进行……关于 Ryan 的回答“更喜欢 32 位”的评论给了“啊哈”的时刻。

此外,您可能想要检查您正在设置 webView2.Source 或调用 EnsureCoreWebView2Async 的事件或方法... webView2 需要完全初始化 UI 线程并显示表单。我通常将我的 webView2 初始化代码放在 Form.Shown 事件中。这是描述表单事件顺序的链接:MS-Docs 表单事件

于 2020-12-10T21:16:23.440 回答
0

如果您可以在后面的代码中访问您的控件,则可以使用CoreWebView2InitializationCompleted事件处理程序来获得一个状态,在哪里CoreWebView2被初始化。(在我的情况下是控件。WebView2x:name

        WebView2.CoreWebView2InitializationCompleted += (sender, args) =>
        {
            if (args.IsSuccess)
            {
                var vw2 = (WebView2)sender;
                vw2!.CoreWebView2.Settings.AreDevToolsEnabled = false;
            }
        };

有关详细信息,请参阅最新版本中事件处理程序的工具提示。

使用 WebView2 1.0.1108.44。

于 2022-03-01T15:38:22.170 回答
0

文档报告这是一项繁重的操作,因此我建议在需要时初始化 corewebview2。VB.net 中的示例如下:

Dim uriFile as string = "https://YourURLgoeshere"
    Try
      If WebView21 IsNot Nothing AndAlso Webview21.CoreWebView2 IsNot Nothing Then
         WebView21.CoreWebView2.Navigate(uriFile)
      Else
         WebView21.Source = New Uri(uriFile)
      End If
    Catch x As Exception
      'Do some exception management...
      
    End Try
于 2021-07-03T17:44:05.477 回答
0
    private async void Form1_Load(object sender, EventArgs e)
    {
        await webView2.EnsureCoreWebView2Async();
        webView2.CoreWebView2.Settings.IsStatusBarEnabled = false;
        webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;

        webView2.Source = new Uri("https://someurl.com/");
    }
于 2022-01-11T13:39:45.993 回答
0

如果是 Windows 应用程序,请确保在表单构造函数中有 InitializeComponent() 方法。

于 2021-10-24T13:04:53.523 回答