如何停止在 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"/>
我在开发 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"/>