当访问 Video 中的 Audio 属性时,会造成 Video 的所有事件失效。
经过反汇查看源码,原来在访问Audio属性时,Audio会通过当前Video对象创建一个新实例。
而这个新实例会覆盖掉当前的 Video 对象,因此所有之前注册的事件都会失效。

解决办法,就是利用 Audio 来进行事件注册。
但是要注意的是,必须要访问过一次 Audio,让 Audio 生成实例之后,再进行动态事件的绑定!
同时,不要再使用 Video 的静态绑定了,原先的动态绑定也没关系,因为都会失效,所以不需要取消事件绑定了。

另外:记得一定要用变量来保存Audio对象,否则每次使用 Video.Audio 访问的都是一个新创建的对象!!!

Dim vod As New Video("视频路径")
Dim ado As Audio = vod.Audio '这里Audio会覆盖Video的实例
ado.Volume = -    '静音
' 绑定事件
AddHandler ado.Starting, AddressOf vod_Starting
AddHandler ado.Ending, AddressOf vod_Ending
' 绑定容器
vod.Owner = Panel1
vod.Owner.Width = vod.DefaultSize.Width
vod.Owner.Height = vod.DefaultSize.Height
' 开始播放
vod.Play()

附一个完整的安全实例:

Dim vod As Video

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim fp As String
    Using op As New OpenFileDialog
        If op.ShowDialog = Windows.Forms.DialogResult.Cancel Then
            Return
        End If
        fp = op.FileName
    End Using

    If vod IsNot Nothing AndAlso vod.Playing Then
        vod.Stop()
        vod.Dispose()
        vod = Nothing
    End If

    ' 尝试第一次视频实例化
    Try
        vod = New Video(fp)
    Catch ex As Exception
        MsgBox("视频载入问题")
        Return
    End Try

    Dim ado As Audio = Nothing
    ' 尝试音频实例化
    Try
        ado = vod.Audio
        ado.Volume = -
        ' 尝试将事件绑定(采用Audio)
        AddHandler ado.Starting, AddressOf vod_Starting
        AddHandler ado.Ending, AddressOf vod_Ending
    Catch ex As Exception
        'MsgBox("音频出错!")

        ' 音频出错表示视频没有音频,但实例化Audio即会让Video所有事件无效化,因此仍需要重新实例化一个新对象
        ado.Dispose()
        vod.Dispose()
        vod = New Video(fp)
        ' 尝试将事件绑定(采用Video)
        AddHandler vod.Starting, AddressOf vod_Starting
        AddHandler vod.Ending, AddressOf vod_Ending
    End Try

    ' 其他设置
    vod.Owner = Panel1
    vod.Owner.Width = vod.DefaultSize.Width
    vod.Owner.Height = vod.DefaultSize.Height

    ' 播放~
    vod.Play()
End Sub

Private Sub vod_Starting(ByVal sender As Object, ByVal e As System.EventArgs)
    ' 开始播放
End Sub

Private Sub vod_Ending(ByVal sender As Object, ByVal e As System.EventArgs)
    vod.CurrentPosition = 0.0 '立刻重播
    'vod.Play() '这行无所谓
End Sub

【DirectX】 AudioVideoPlayback 中的事件BUG的更多相关文章

  1. onbeforeunload与a标签在IE中的冲突bug(转载)

    onbeforeunload与a标签在IE中的冲突bug   onbeforeunload 是window的一个事件,目前Firefox,IE都支持,主要用来提示用户是否真的要离开该页面,通常在一些比 ...

  2. React 中阻止事件冒泡的问题

    在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...

  3. C++中的事件分发

    本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...

  4. javascript中的事件冒泡和事件捕获

    1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...

  5. jQuery文本框中的事件应用

    jQuery文本框中的事件应用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  6. 怎么理解js中的事件委托

    怎么理解js中的事件委托 时间 2015-01-15 00:59:59  SegmentFault 原文  http://segmentfault.com/blog/sunchengli/119000 ...

  7. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

  8. 四、jquery中的事件与应用

    当用户浏览页面时,浏览器会对页面代码进行解释或编译--这个过程实质上是通过时间来驱动的,即页面在加载时,执行一个Load事件,在这个事件中实现浏览器编译页面代码的过程.时间无论在页面元素本身还是在元素 ...

  9. ActiveX(二)Js 监听 ActiveX中的事件

    在上一篇随笔:ActiveX(一)第一个简单的Demo 中,已经可以实现 js 单向调用 ActiveX 中的方法,在很多情况下ActiveX中的方法的执行时相对耗时.耗性能的.在这样的情况下.Act ...

随机推荐

  1. idea部署tomcat-404错误

    今天在部署数据质量web工程在tomcat后,访问时报404错误,在网上搜了很多相关配置,也都是一步一步来的 Application Context 也配置好了,Artifact也添加了,就是访问不了 ...

  2. nginx的hash

    hash结构中有若干个桶,桶内是hash(key)值相同的若干数据. 查找数据时,首先对key值进行hash计算,然后hash值对桶的个数进行求余,得到数据所在的桶.然后在桶中使用key逐个查找,直到 ...

  3. JavaScript中hasOwnProperty函数

      JavaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性. 使用方法: object.hasOwnProperty(proName) 其中参数 ...

  4. JQuery中after() append() appendTo()的区别

    首先 after() 是追加在元素外边而append() appendTo()是追加在元素里面. $(selector).after(content) $("span").afte ...

  5. 2018.11.07 bzoj1965: [Ahoi2005]SHUFFLE 洗牌(快速幂+exgcd)

    传送门 发现自己的程序跑得好慢啊233. 管他的反正AC了 先手玩样例找了一波规律发现题目要求的就是a∗2m≡l(modn+1)a*2^m\equiv l \pmod {n+1}a∗2m≡l(modn ...

  6. 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)

    传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...

  7. 使用bat批处理文件定时自动备份oracle数据库并上传ftp服务器

    一.使用bat批处理文件备份oracle(前提是配置好oracle数据库客户端) @echo off set databasename=orcl  //数据库名 set username=ninic ...

  8. Vue、 React比较

    关键词:MVVM(Model-View-VIewModel)数据模型双向绑定.视图的数据变化会同时修改数据资源,数据资源的变化也会立刻反应到视图View上. 一.vue.js vue是一套构建用户界面 ...

  9. char类型

    1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a';  //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...

  10. ★ prototype、__proto__ 详解

    # var Person = function(name) { this.name = name; } var p = new Person(); //new操作符的操作是 var p = {} p. ...