【问题标题】:Audio Keeps Playing After Closing Window With WebBrowser In WPF在 WPF 中使用 WebBrowser 关闭窗口后音频继续播放
【发布时间】: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 方法并确保所有事件处理程序都断开连接。

标签: c# .net wpf xaml caliburn.micro


【解决方案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() 表单是不够的。)这似乎可以解决问题 - 在调用表单关闭之前处理控件。投票^
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多