我有一个foreach循环多次调用_webView.NavigateToLocalStreamUri(url[index], resolver)
。据我所知,每次导航到特定网址时,都会触发事件NavigationStarting
和NavigationCompleted
。但就我而言,每个请求都会调用NavigationStarting
,但NavigationCompleted
仅触发最后一个请求。
我想知道有没有办法确保为每个请求调用NavigationCompleted
。我搜索过但没有答案符合我的目的。
for (int i = 0; i < 3; i++){
// here I raise event to call `NavigateToLocalStreamUri` of _webview
}
_webview有2个活动NavigationStarting
和NavigationCompleted
// i = 0 or 1
时
程序只调用NavigationStarting
的事件处理程序,而不调用NavigationCompleted
// i = 2
时(始终是for
循环的最后一次迭代)
该程序调用事件NavigationStarting
和NavigationCompleted
//是否有任何解决方案可以确保当i = 0或1时,调用NavigationCompleted
处理程序?
答案 0 :(得分:1)
我转载了你的问题。问题是由上一次导航完成前for
循环继续引起的。
解决此问题的关键是等待上一个NavigationCompleted
事件句柄发生。您可以使用AutoResetEvent
通知等待线程已发生事件。例如:
public MainPage()
{
this.InitializeComponent();
urls = new List<Uri>();
waitForNavComplete = new AutoResetEvent(false);
urls.Add(...);
}
List<Uri> urls;
AutoResetEvent waitForNavComplete;
private async void btnnavigate_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 3; i++)
{
mywebview.Navigate(urls[i]);
await Task.Run(() => { waitForNavComplete.WaitOne(); });
}
}
private void mywebview_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
{
System.Diagnostics.Debug.WriteLine(args.Uri.ToString());
waitForNavComplete.Set();
}
使用Set
方法将已完成事件的状态设置为已发出信号,以便for
循环停止等待并继续。
答案 1 :(得分:0)
我认为@ sunteen-wu-msft的解决方案有点复杂。笨拙地使用AutoResetEvent
会导致很多头痛。如果目标是让NavigationCompleted
触发,那么为什么不在第一个网址完成时导航到下一个网址,例如在NavigateToLocalStreamUri
本身中致电NavigationCompleted
:
private Stack<Uri> toNavigate = ...
private void mywebview_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
{
// Handle NavigationCompleted
...
// Navigate to the next Uri
var uri = toNavigate.Pop();
mywebview.NavigateToLocalStreamUri(uri, resolver);
}
另一种选择是简单地创建几个webview并将它们全部导航到不同的Uris。这可能需要相当多的资源,因为所有加载的网站都将存在于内存中,直到您终止其webview。