webview2:EnsureCoreWebView2Async 被调用但 CoreWebView2InitializationCompleted 事件在处置和重新创建后未触发

webview2: EnsureCoreWebView2Async is called but CoreWebView2InitializationCompleted event not triggered after disposing and recreating it

我有一个浏览器 class,我在其中添加了 webview2 控件。 我有一个用例,我在 class 中删除了 webview2 浏览器(检查 ShowData 方法)。

如果再次需要,我会在我的 class 中创建一个新的 webview2 实例(检查 InitializeWebBrowser)并导航到该页面。

这在已安装的应用程序中运行良好。正确加载没有任何问题。

通过本地开发人员中的代码构建的应用程序首次显示 webview2 浏览器。 EnsureCoreWebView2Async 通过构造函数调用并触发 CoreWebView2InitializationCompleted 事件并加载页面。删除 webview2 实例并创建一个新实例后 EnsureCoreWebView2Async 被调用但 CoreWebView2InitializationCompleted 根本没有被调用,即使我们等待了很长时间。

注意:CoreWebView2InitializationCompleted事件在webview2.dispose被调用失败状态时触发。

知道为什么 CoreWebView2InitializationCompleted 没有被第二次调用吗?

public MyBrowser()
    {
      InitializeComponent();
      InitializeBrowserCoreWebViewAsync();
    }
    
    public async void InitializeBrowserCoreWebViewAsync()
    {
      webBrowser.CoreWebView2InitializationCompleted += WebBrowser_CoreWebView2InitializationCompleted;      
      await webBrowser.EnsureCoreWebView2Async(null);
    }
    
    private void WebBrowser_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
    {
      if (e.IsSuccess)
      {
        if (!string.IsNullOrEmpty(m_sDocumentText)) // m_sDocumentText is Private which contains HTML Content
        {         
          webBrowser.NavigateToString(m_sDocumentText);
          m_sDocumentText = string.Empty;
        }
      }
      else
      {
        Log.Error($"WebBrowser_CoreWebView2InitializationCompleted - CoreWebView2 Initialization failed", e.InitializationException);
      }
    }
    
    public void ShowData(string url)
    {
      if (!String.IsNullOrEmpty(url))
      {
        Uri uri = new Uri(url);        
        InitializeWebBrowser();               
        webBrowser.Source = uri;                
      }
      else 
      {        
        if (webBrowser != null)
        {          
          webBrowser.Dispose();
          webBrowser = null;
        }
      }
    }
    private void InitializeWebBrowser()
    {
      if (webBrowser == null)
      {        
        webBrowser = new Microsoft.Web.WebView2.WinForms.WebView2();
        webBrowser.Dock = DockStyle.Fill;
        webBrowser.Location = new System.Drawing.Point(0, 0);
        webBrowser.MinimumSize = new System.Drawing.Size(20, 20);
        webBrowser.Name = "webBrowser";
        webBrowser.Size = new System.Drawing.Size(150, 150);
        webBrowser.TabIndex = 0;
        Controls.Clear();
        Controls.Add(this.webBrowser);
        InitializeBrowserCoreWebViewAsync();
      }
    }
    
    
     public void SetDocumentText(string docText)
    {      
      InitializeWebBrowser();
      if (webBrowser.CoreWebView2 != null)
        webBrowser.NavigateToString(docText);
      else       
        m_sDocumentText = docText;
    }

附加信息:

基本上,WebView2 控件本身在处理和创建新实例后不可见 我已订阅 Webview2 VisibleChanged 活动。调用 EnsureCoreWebView2Async 后,VisibleChanged 事件被触发,webview2.visible 属性 的值为 false。 (第二次)

初始化后,显式调用以下方法,并将 Visible 属性 设置为 true

public void ShowWebBrowser()
{       
   if (webBrowser?.Visible == false)
   {       
     webBrowser.Visible = true;
   }          
}

但是 VisibleChanged 事件被触发 webview2.visible 属性 值 false 即使它被设置为 true

这是一个有点奇怪的问题,它过去只发生在某些机器上,而不是所有机器上。

进行以下更改后,它开始为我工作。

主要变化是在构造函数中停止对 corewebview2 的初始化,并在正常方法中进行。

以前的变化是 first-time corewebview2 初始化是在构造函数中完成的,第二次是在创建新实例后在 Normal 方法中发生的。

更改 1:停止在 Constructor 中初始化 CoreWebView2

public MyBrowser()
{
  InitializeComponent();
  //InitializeBrowserCoreWebViewAsync(); --> Removed this line
}

更改 2:在下面的方法中,以前仅在创建新实例时才调用 InitializeBrowserCoreWebViewAsync() 现在移到外面每次都调用。

private void InitializeWebBrowser()
{
  if (webBrowser == null)
  {        
    webBrowser = new Microsoft.Web.WebView2.WinForms.WebView2();
    webBrowser.Dock = DockStyle.Fill;
    webBrowser.Location = new System.Drawing.Point(0, 0);
    webBrowser.MinimumSize = new System.Drawing.Size(20, 20);
    webBrowser.Name = "webBrowser";
    webBrowser.Size = new System.Drawing.Size(150, 150);
    webBrowser.TabIndex = 0;
    Controls.Clear();
    Controls.Add(this.webBrowser);   
//    InitializeBrowserCoreWebViewAsync(); --> Moved outside if condition
  }
  InitializeBrowserCoreWebViewAsync();
}

其余保持不变:

public async void InitializeBrowserCoreWebViewAsync()
{
  if (webBrowser.CoreWebView2 == null)
  {
     webBrowser.CoreWebView2InitializationCompleted += WebBrowser_CoreWebView2InitializationCompleted;      
     await webBrowser.EnsureCoreWebView2Async(null);
  }
}

private void WebBrowser_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
  if (e.IsSuccess)
  {
    if (!string.IsNullOrEmpty(m_sDocumentText)) // m_sDocumentText is Private which contains HTML Content
    {         
      webBrowser.NavigateToString(m_sDocumentText);
      m_sDocumentText = string.Empty;
    }
  }
  else
  {
    Log.Error($"WebBrowser_CoreWebView2InitializationCompleted - CoreWebView2 Initialization failed", e.InitializationException);
  }
}

public void ShowData(string url)
{
  if (!String.IsNullOrEmpty(url))
  {
    Uri uri = new Uri(url);        
    InitializeWebBrowser();               
    webBrowser.Source = uri;                
  }
  else 
  {        
    if (webBrowser != null)
    {          
      webBrowser.Dispose();
      webBrowser = null;
    }
  }
}

public void SetDocumentText(string docText)
{      
  InitializeWebBrowser();
  if (webBrowser.CoreWebView2 != null)
    webBrowser.NavigateToString(docText);
  else       
    m_sDocumentText = docText;
}