UWP Webview только вызывает событие NavigationCompleted для последнего запроса - PullRequest
0 голосов
/ 17 мая 2018

У меня есть цикл 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 or 1 программа вызывает только обработчик событий NavigationStarting, но не вызывает обработчик событий NavigationCompleted

// когда i = 2 (всегда последняя итерация цикла for) программа вызывает обработчик событий обоих событий NavigationStarting и NavigationCompleted

// Есть ли какое-нибудь решение, чтобы убедиться, что при i = 0 или 1 вызывается обработчик NavigationCompleted?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я думаю, что решение @ sunteen-wu-msft немного сложнее.Небрежное использование AutoResetEvent может привести к сильной головной боли.Если цель состоит в том, чтобы разрешить запуск NavigationCompleted, то почему бы просто не перейти к следующему URL-адресу после завершения первого, например, позвонить 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);
}

Другой вариантбыло бы просто создать несколько веб-просмотров и переместить их всех в разные Uris.Однако это может занять довольно много ресурсов, поскольку все загруженные веб-сайты будут жить в памяти, пока вы не уничтожите их веб-просмотр.

0 голосов
/ 22 мая 2018

Я воспроизвел вашу проблему.Проблема вызвана продолжением цикла 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 прекратил ожидание и продолжил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...