如何停止在 WebView 中播放视频

How to stop video playing in WebView

我在开发 Xamarin.Forms 应用程序 (UWP!)。它具有主从架构。 Master page有一个ListView,里面的每一个item打开一个对应的Detail page。第一个详细信息页面只有一个在加载时播放 YouTube 视频的 WebView。第二个详细信息视图目前只有一个占位符标签。

我从第一个详细信息页面切换到第二个页面时,仍然可以听到第一个详细信息页面的视频声音。当我切换回第一个详细信息页面时,视频再次加载,现在我听到两个声音。如何在切换到第二个详细信息页面时停止视频并在返回时继续播放?如果这不可能,我怎样才能在离开详细信息页面时停止视频?

我想我可以在详细信息页面的重写 OnDisappearing() 方法中做一些事情:

    protected override void OnDisappearing()
    {
        MyWebView.NavigateToString(""); // This does not work, as NavigateToString() is not part of WebView. 
        base.OnDisappearing();
    }

我可以使用什么来停止在 WebView 中播放视频?

Could you please tell what I can use to stop playing video in WebView?

根据您的要求,您可以通过注入 Eval java 脚本来实现。

private  void Button_Clicked(object sender, EventArgs e)
{
    string pausefunctionString = @"
    var videos = document.querySelectorAll('video');  
    [].forEach.call(videos, function(video) { video.pause(); });
    "; 
    MyWebView.Eval(pausefunctionString);
}

更新

我已经重新检查了你的问题,当你导航到另一个页面时,WebView没有正确释放。如果你想停止 WebView 视频播放,你可以通过自定义 WebViewRenderer.

让它导航到空白页面
[assembly: ExportRenderer(typeof(WebView), typeof(CustomWebViewRender))]

namespace App4.UWP
{
    class CustomWebViewRender : WebViewRenderer
    {
        private Windows.UI.Xaml.Controls.WebView _WebView;
        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                var source = Element.Source as UrlWebViewSource;
                _WebView = new Windows.UI.Xaml.Controls.WebView();
                SetNativeControl(_WebView);
            }
        }
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == WebView.SourceProperty.PropertyName)
            {
                var source = Element.Source as UrlWebViewSource;
                if (source.Url == string.Empty)
                {
                    _WebView.NavigateToString(string.Empty);
                }
            }
        }
    }
}

用法

protected override void OnAppearing()
{
    base.OnAppearing();
    MyWebView.Source = "https://www.youtube.com";
}
protected override void OnDisappearing()
{
    MyWebView.Source = string.Empty;
    base.OnDisappearing();
}

Xaml

<WebView HeightRequest="500" WidthRequest="500"  x:Name="MyWebView"/>