cefsharp等待页面加载,winforms C#

Roy*_* HF 7 c# pageload chromium-embedded cefsharp

首先,我是C#的新手并且学习Cefsharp + javascript,所以请尝试评论你认为必要的任何解决方案,这将拯救我提出愚蠢的问题.

我试图等到页面完成加载Cefsharp来执行我的代码,我已经尝试了在其他stackoverflow问题/ github上找到的几个解决方案,但没有去...

我认为解决方案是"NavStateChanged",但我得到一个C#错误:"ChromiumWebBrowser不包含'NavStateChanged'的定义"

任何人都可以指出我正确的方向或给我一个片段?我不是要求你为我写完整件事,但我真的迷失在这里,我一下子学习C#,Cefsharp和javascript,而且......压倒性的.

这是我在网上寻找解决方案时找到的代码,它也匹配了很多github引用,但似乎不起作用:/

EventHandler<NavStateChangedEventArgs> handler = null;
handler = (sender, args) = > {

    //TODO : show a loading gif until the page load completes

    //Wait for while page to finish loading not just the first frame
    if (!args.IsLoading)
    {
        chromeBrowser.NavStateChanged -= handler;

        MessageBox.Show("The page has completed loading", "Load completed", 
                        MessageBoxButtons.OK);
        //TODO : once load complete show the actual page
    }
Run Code Online (Sandbox Code Playgroud)

Roy*_* HF 7

对于其他任何想知道我做同样事情的人:是的他们已经过时了,谢谢你的链接amaitland!

https://github.com/cefsharp/CefSharp/wiki/General-Usage#handlers

这些似乎是与我相关的所有3个正确的加载状态:

browser.RenderProcessMessageHandler = new RenderProcessMessageHandler();

public class RenderProcessMessageHandler : IRenderProcessMessageHandler
{
  // Wait for the underlying `Javascript Context` to be created, this is only called for the main frame.
  // If the page has no javascript, no context will be created.
  void IRenderProcessMessageHandler.OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
  {
    const string script = "document.addEventListener('DOMContentLoaded', function(){ alert('DomLoaded'); });";

    frame.ExecuteJavaScriptAsync(script);
  }
}

//Wait for the page to finish loading (all resources will have been loaded, rendering is likely still happening)
browser.LoadingStateChanged += (sender, args) =>
{
  //Wait for the Page to finish loading
  if (args.IsLoading == false)
  {
    browser.ExecuteJavaScriptAsync("alert('All Resources Have Loaded');");
  }
}

//Wait for the MainFrame to finish loading
browser.FrameLoadEnd += (sender, args) =>
{
  //Wait for the MainFrame to finish loading
  if(args.Frame.IsMain)
  {
    args.Frame.ExecuteJavaScriptAsync("alert('MainFrame finished loading');");
  }
};
Run Code Online (Sandbox Code Playgroud)