c# - UWP Webview 仅触发最后一个请求的 NavigationCompleted 事件

标签 c# webview uwp

我有一个 foreach 循环来多次调用 _webView.NavigateToLocalStreamUri(url[index], resolver) 。据我所知,每次导航到特定 URL 时,都会触发 NavigationStartingNavigationCompleted 事件。但就我而言,每个请求都会调用 NavigationStarting ,但 NavigationCompleted 仅在最后一个请求时触发。 我想知道是否有办法确保为每个请求调用 NavigationCompleted 。我搜索过,但没有符合我目的的答案。

for (int i = 0; i < 3; i++){
// here I raise event to call `NavigateToLocalStreamUri` of _webview
}

_webview 有 2 个事件 NavigationStartingNavigationCompleted

//当i = 0或1时 程序仅调用 NavigationStarting 的事件处理程序,而不调用 NavigationCompleted

的事件处理程序

//当 i = 2 时(始终是 for 循环的最后一次迭代) 程序调用 NavigationStartingNavigationCompleted

事件的事件处理程序

//有什么解决方案可以确保当 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/

相关文章:

c# - 使用 c# 的 Thread 和 Task 之间的性能比较

android - 如何使用 session ID和用户ID详细信息在Webview中保持登录到我的域URL

windows - 如何在 UWP XAML MVVM 应用程序上接收最简单的 Windows 消息?

c# - 从 UpdatePanel 以编程方式强制完全回发

c# - 检测 sql-server 表上的更改

android - 禁用 Android WebView WebRTC

javascript - 单击在 WebView 中不起作用

c# - 如何使用数据绑定(bind)在 ItemsControl 中设置 Z-Index?

c# - Azure 注销异步

c# - 在 Xamarin/Visual Studio 中构建的 native iOS 应用程序打开然后立即关闭