我有一个wpf程序,我想添加一个WebBrowser控件
我搜索如何检查WebBrowser是否成功加载页面,这里是代码:
private async Task PageLoad(int TimeOut)
{
TaskCompletionSource<bool> PageLoaded = null;
PageLoaded = new TaskCompletionSource<bool>();
int TimeElapsed = 0;
webBrowser.LoadCompleted += (s, e) =>
{
if (webBrowser.ReadyState != webBrowser.Complete) return;
if (webBrowser.Task.IsCompleted) return;
PageLoaded.SetResult(true);
};
while (PageLoaded.Task.Status != TaskStatus.RanToCompletion)
{
//interval of 10 ms worked good for me
await Task.Delay(10);
TimeElapsed++;
if (TimeElapsed >= TimeOut * 100)
{
//This prevents your method or thread from waiting forever
PageLoaded.TrySetResult(true);
}
}
}
但为什么它不适用于wpf。我如何转换它?
我检查了它,而ReadyState
Complete
和Task.IsCompleted
在wpf中没有这样的属性。 wpf的代码是什么?
答案 0 :(得分:2)
您可以只处理WebBrowser控件的LoadCompleted事件。当导航到的网页已完成下载时,将引发此事件:https://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.loadcompleted(v=vs.110).aspx
WebBrowser控件不提供您可以等待的任何异步API或Task属性。它只会引发一个事件,所以处理这个事件是你能做到的最好的事情:
webBrowser.LoadCompleted += (s, e) =>
{
//the page has been loaded here. Do your thing...
};
如果你只想等待加载页面的“TimeOut”秒数,你可以使用你在LoadCompleted事件处理程序中发布的SemaphoreSlim:
private async Task LoadPageAsync(string url, int timeOutInSeconds)
{
using (System.Threading.SemaphoreSlim semaphore = new System.Threading.SemaphoreSlim(0, 1))
{
bool loaded = false;
webBrowser.LoadCompleted += (s, e) =>
{
semaphore.Release();
loaded = true;
};
webBrowser.Navigate(url);
await semaphore.WaitAsync(TimeSpan.FromSeconds(timeOutInSeconds));
if (loaded)
{
//page was loaded
}
else
{
//page was not loaded...
}
}
}
答案 1 :(得分:0)
我一直在尝试几乎所有建议的解决方案。这是解决我问题的那个。在尝试与页面交互之前调用此方法:
public void CheckWebBrowser()
{
while (wb.IsBusy || wb.ReadyState != WebBrowserReadyState.Complete )
{
Application.DoEvents();
}
return;
}
我希望它有所帮助!
答案 2 :(得分:0)
这个线程很旧,但是如果有人需要解决这个问题,这对我有用。
https