UWP Webview仅触发上次请求的NavigationCompleted事件

时间:2018-05-17 18:27:39

标签: c# webview uwp

我有一个foreach循环多次调用_webView.NavigateToLocalStreamUri(url[index], resolver)。据我所知,每次导航到特定网址时,都会触发事件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 or 1时 程序只调用NavigationStarting的事件处理程序,而不调用NavigationCompleted

的调用事件处理程序

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

的事件处理程序

//是否有任何解决方案可以确保当i = 0或1时,调用NavigationCompleted处理程序?

2 个答案:

答案 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。