何よりもまず、私は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
}
私がしたのと同じことを疑問に思っている他の人のために:はい、彼らは時代遅れです、リンク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');");
}
};