Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP Webview仅为最后一个请求触发NavigationCompleted事件_C#_Webview_Uwp - Fatal编程技术网

C# UWP Webview仅为最后一个请求触发NavigationCompleted事件

C# UWP Webview仅为最后一个请求触发NavigationCompleted事件,c#,webview,uwp,C#,Webview,Uwp,我有一个foreach循环要多次调用\u webView.NavigateToLocalStreamUri(url[index],解析器)。正如我所知,每次导航到特定URL时,都会触发事件NavigationStarting和NavigationCompleted。但是在我的例子中,每个请求都会调用NavigationStarting,但是NavigationCompleted只会触发最后一个请求。 我想知道是否有办法确保每个请求都调用NavigationCompleted。我搜索了一下,但没有

我有一个foreach循环要多次调用
\u webView.NavigateToLocalStreamUri(url[index],解析器)
。正如我所知,每次导航到特定URL时,都会触发事件
NavigationStarting
NavigationCompleted
。但是在我的例子中,每个请求都会调用
NavigationStarting
,但是
NavigationCompleted
只会触发最后一个请求。 我想知道是否有办法确保每个请求都调用
NavigationCompleted
。我搜索了一下,但没有找到符合我目的的答案

for (int i = 0; i < 3; i++){
// here I raise event to call `NavigateToLocalStreamUri` of _webview
}
for(int i=0;i<3;i++){
//在这里,我引发一个事件来调用webview的“NavigateToLocalStreamUri”
}
_webview有两个事件
NavigationStarting
NavigationCompleted

//当
i=0或1时
程序仅调用
导航开始的事件处理程序,但不调用
导航完成的事件处理程序

//当
i=2
时(始终是
循环的最后一次迭代)
程序调用两个事件的事件处理程序
NavigationStarting
NavigationCompleted


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

我重现了您的问题。该问题是由于在上一次导航完成之前,for
循环继续导致的

解决此问题的关键点是等待上一个
导航完成
事件句柄发生。您可以使用它通知等待的线程已发生事件。例如:

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();
}
public主页()
{
this.InitializeComponent();
URL=新列表();
waitForNavComplete=新的自动重置事件(false);
添加(…);
}
列出网址;
自动resetevent waitForNavComplete;
私有异步无效bTNAVAGATE\u单击(对象发送方,路由目标)
{
对于(int i=0;i<3;i++)
{
导航(URL[i]);
wait Task.Run(()=>{waitForNavComplete.WaitOne();});
}
}
私有void mywebview_NavigationCompleted(WebView发件人、WebViewNavigationCompletedEventArgs args args)
{
System.Diagnostics.Debug.WriteLine(args.Uri.ToString());
waitForNavComplete.Set();
}

使用方法将已完成事件的状态设置为signaled,以便
for
循环将停止等待并继续。

我认为@sunteen wu msft的解决方案有点复杂。随意使用
AutoResetEvent
会导致很多头痛。如果目标是让
NavigationCompleted
触发,那么为什么不在第一个URL完成时导航到下一个URL,例如在
NavigationCompleted
本身中调用
NavigateToLocalStreamUri

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);
}
private Stack toNavigate=。。。
私有void mywebview_NavigationCompleted(WebView发件人、WebViewNavigationCompletedEventArgs args args)
{
//句柄导航已完成
...  
//导航到下一个Uri
var uri=toNavigate.Pop();
NavigateToLocalStreamUri(uri,解析器);
}

另一种选择是简单地创建几个Web视图,并将它们全部导航到不同的URI。不过,这可能需要大量资源,因为所有加载的网站都将保留在内存中,直到您终止其webview。

如果在前一个导航请求完成之前启动下一个导航请求,则前一个导航请求将永远不会完成,因此不会触发NavigationCompleted。似乎通过在循环中调用
NavigateToLocalStreamUri
就可以做到这一点。完成的事件句柄应该可以正常工作。请提供必要的代码片段,让我们重现您的问题。@AndreyAshikhmin您所说的正是我遇到的。你有解决方案吗?@suntenwu MSFT,我更新了我的代码片段,请检查谢谢你的支持,我会检查你的解决方案谢谢你,我会看看你的解决方案。是的,创建几个Web视图似乎是个坏主意。