【问题标题】:YouTube video play after navigating away from WebView离开 WebView 后播放 YouTube 视频
【发布时间】:2018-06-19 17:49:52
【问题描述】:

我在一个页面中有一个 WebView,我正在播放一个 youtube 视频。当我从页面导航到堆栈上的上一页时,网络视图中的 youtube 视频会继续播放 youtube 视频。当用户离开页面时,任何人都知道如何防止这种情况并杀死 WebView?

编辑:

这是我返回的方式

private void HtmlViewerPage_BackRequested(object sender, BackRequestedEventArgs e)
{
    if (Viewer.CanGoBack)
    {
        Viewer.GoBack();
        e.Handled = true;
        return;
    }
{

GoBack 将导航帧堆栈。然后它允许 youtube 视频继续在后台播放。

编辑:我创建了一个示例项目来演示我的问题。

https://github.com/themimcompany/WebViewIssue

【问题讨论】:

    标签: c# uwp


    【解决方案1】:

    您已经在MainPageWebViewPage 中注册了BackRequested 事件,但是当您导航到其他页面时您并没有取消注册它。这将导致您的问题。当您单击WebViewPage 上的返回按钮时,BackRequested 处理程序将被多次触发。

    您可以在 MainPage.xaml.csWebViewPage.xaml.cs 上的 OnNavigatingFrom 处理程序中删除它。

    请看以下代码:

    public sealed partial class WebViewPage : Page
    {
        public WebViewPage()
        {
            this.InitializeComponent();
        }
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            var currentView = SystemNavigationManager.GetForCurrentView();
            currentView.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
            SystemNavigationManager.GetForCurrentView().BackRequested += WebViewPage_BackRequested;
            var site = (e.Parameter as Dictionary<string, string>)["site"];
            WebViewer.Navigate(new Uri(site));
        }
        private void WebViewPage_BackRequested(object sender, BackRequestedEventArgs e)
        {
            //always try to go back within the WebView first, then try the frame!
            if (this.Frame.CanGoBack)
            {
                if (WebViewer.CanGoBack)
                {
                    WebViewer.GoBack();
                    e.Handled = true;
    
                }
                else
                {
                    WebViewer.NavigateToString("<html>Unloaded.</html>");
                    WebViewer.NavigateToString("");
                    var source = WebViewer.Source; // is cleared to null
                    Frame.GoBack();
                    e.Handled = true;
                }
            }
        }
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            SystemNavigationManager.GetForCurrentView().BackRequested -= WebViewPage_BackRequested;
        }
    }
    
        //MainPage.xaml.cs
        private void AppBackRequested(object sender, BackRequestedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;
            if (rootFrame == null)
                return;
    
            // If we can go back and the event has not already been handled, do so.
            if (rootFrame.CanGoBack && e.Handled == false)
            {
                e.Handled = true;
                rootFrame.GoBack();
            }
        }
    
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            var currentView = SystemNavigationManager.GetForCurrentView();
            currentView.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
            SystemNavigationManager.GetForCurrentView().BackRequested += AppBackRequested;
        }
    
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            SystemNavigationManager.GetForCurrentView().BackRequested -= AppBackRequested;
        }
    

    【讨论】:

    • @visc 你试过我的代码看它是否适合你吗?
    • 是的,我在看到您的回答之前就找到了解决方案。肯定是造成我的问题。谢谢!
    【解决方案2】:

    重写 OnNavigatingFrom 方法并停止 webview 怎么样?

    protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
    {
        base.OnNavigatingFrom(e);
    }
    

    在方法内部尝试将 WebView 设置为 null,或将 Source 设置为 null 或其他内容

    【讨论】:

    【解决方案3】:

    这将阻止它:

        protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
        {
            // this will stop any video from playing back.
            WebView.NavigateToString("<html>Unloaded.</html>");
    
            base.OnNavigatingFrom(e);
        }
    

    【讨论】:

    猜你喜欢
    • 2012-12-14
    • 2012-06-07
    • 1970-01-01
    • 2011-01-18
    • 2013-07-13
    • 2014-02-10
    • 2013-11-19
    • 2017-12-23
    • 2013-07-16
    相关资源
    最近更新 更多