在 WPF 中使用 WebBrowser 关闭窗口后音频继续播放

Posted

技术标签:

【中文标题】在 WPF 中使用 WebBrowser 关闭窗口后音频继续播放【英文标题】:Audio Keeps Playing After Closing Window With WebBrowser In WPF 【发布时间】:2016-06-10 06:50:44 【问题描述】:

我有一个由 Caliburn.Micro 显示的窗口。此窗口包含一个可以播放 youtube 视频的 WebBrowser 控件。如果 Youtube 视频正在播放并且用户关闭窗口,则音频继续在后台播放。窗口关闭时如何让音频停止播放?我假设由于某种原因没有处理视图。

显示窗口

public void Handle(VideoButtonClick message)

    var manager = new WindowManager();
    Video = new VideoViewModel(message.VideoID);
    dynamic settings = new ExpandoObject();
    settings.ResizeMode = ResizeMode.NoResize;
    settings.Icon = null;

    manager.ShowDialog(Video, null, settings);

在窗口中显示的视图

<UserControl .....>
    <Grid>
        <WebBrowser ctrl:BrowserBehavior.html="Binding VideoHTML"
                    ScrollViewer.CanContentScroll="False"
                    ScrollViewer.VerticalScrollBarVisibility="Hidden" />
    </Grid>
</UserControl>

【问题讨论】:

设置 dispose 方法并确保所有事件处理程序都断开连接。 【参考方案1】:

您可以在您的VideoViewModel 中实现IDeactivate

public class VideoViewModel : PropertyChangedBase, IDeactivate

    private bool _isClosing;
    public bool IsClosing
    
        get  return _isClosing; 
        set
        
            _isClosing = value;
            NotifyOfPropertyChange(() => IsClosing);
        
    

    public void Deactivate(bool close)
    
        IsClosing = close;
    

    public event EventHandler<DeactivationEventArgs> AttemptingDeactivation;
    public event EventHandler<DeactivationEventArgs> Deactivated;

Deactivate 方法中设置一个名为IsClosing 的属性。

在你看来:

<UserControl .....
             x:Name="ThisUserControl">
    <i:Interaction.Triggers>
        <ei:DataTrigger Binding="Binding IsClosing" Value="True">
            <ei:CallMethodAction MethodName="DisposeBrowser" TargetObject="Binding ElementName=ThisUserControl"/>
        </ei:DataTrigger>
    </i:Interaction.Triggers>

    <Grid>
        <WebBrowser x:Name="MyWebBrowser"
                    ctrl:BrowserBehavior.Html="Binding VideoHTML"
                    ScrollViewer.CanContentScroll="False"
                    ScrollViewer.VerticalScrollBarVisibility="Hidden" />
    </Grid>
</UserControl>

UserControl 的代码隐藏中:

public void DisposeBrowser()

    MyWebBrowser.Dispose();

【讨论】:

我有常规的 Windows 窗体应用程序:我的退出事件只是 = webBrowser1.Dispose() 在我的 webBrowser 控件上,然后是 this.Close(); 在窗体上。 (Close() 表单是不够的。)这似乎可以解决问题 - 在调用表单关闭之前处理控件。投票^

以上是关于在 WPF 中使用 WebBrowser 关闭窗口后音频继续播放的主要内容,如果未能解决你的问题,请参考以下文章

WPF:如何在弹出窗口中自动调整 WebBrowser 的大小?

wpf中我想在WebBrowser控件上放置一个Border控件

如何在 webbrowser WPF 顶部打开用户控件作为弹出窗口

StackPanel中的WebBrowser不会在WPF中扩展到其内容大小

有没有办法在 wpf WebBrowser 控件之上呈现 WPF 控件?

WPF c# webbrowser 在顶部菜单上滚动