我有一个 foreach 循环来多次调用 _webView.NavigateToLocalStreamUri(url[index], resolver)
。据我所知,每次导航到特定 URL 时,都会触发 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或1
时
程序仅调用 NavigationStarting
的事件处理程序,而不调用 NavigationCompleted
//当 i = 2
时(始终是 for
循环的最后一次迭代)
程序调用 NavigationStarting
和 NavigationCompleted
//有什么解决方案可以确保当 i = 0 或 1 时,NavigationCompleted
处理程序被调用吗?
最佳答案
我重现了您的问题。该问题是由 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
循环将停止等待并继续。
关于c# - UWP Webview 仅触发最后一个请求的 NavigationCompleted 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50398232/