MediaElement的当前状态(Buffering、Closed、Error、Opening、Paused、Playing或Stopped)会影响使用媒体的用户,如果某用户正在尝试查看一个大型视频,则 MediaElement将可能长时间保持在Buffering状态。在这种情况下,可能希望用户界面 (UI) 中提供某种还不能播放媒体的提示。当缓冲完成时,可能希望指示现在可以播放媒体。
表8.4概括了 MediaElement 可以处于的不同状态,这些状态与 MediaElementState 枚举的枚举值相对应。
表8.5概括了这些 MediaElement 状态与在 MediaElement 上采取的操作(如调用 Play 方法、调用 Pause 方法等)。如表8.5所示,可供 MediaElement 使用的状态取决于其当前状态。例如,对于当前处于 Playing 状态的 MediaElement,如果更改了 MediaElement 的源,则状态更改为 Opening; 如果调用了 Play 方法,则没有任何情况发生(无选项); 如果调用了 Pause 方法,则状态更改为 Paused,等。避免“未指定”状态。例如,当媒体处于 Opening 状态时不应调用 Play 方法。为避免发生这种情况,可以在允许调用 Play 之前检查 MediaElement 的 CurrentState。可以通过注册 CurrentStateChanged 事件可以跟踪到媒体的状态变化。CurrentStateChanged 事件可能会没有按预期工作。当状态迅速更改时,事件可能合并到一个事件引发中。例如,CurrentState 属性可能会从 Playing 切换为 Buffering 并很快又切换回 Playing,以致只引发了单个 CurrentStateChanged 事件,在这种情况下,该属性将并不表现为具有已更改的值。此外,应用程序不应采用事件发生的顺序,尤其是针对 Buffering 之类的瞬态。在事件报告中可能会跳过某一瞬态,因为该瞬态发生得太快。
表8.5 MediaElement 状态与在 MediaElement 上采取的操作
状态 | 源设置 | Play() | Pause() | Stop() | Seek() | 默认退出条件 |
Closed (default) | Opening | 未指定 | 未指定 | 未指定 | 未指定 | |
Opening | Opening(新源) | 未指定 | 未指定 | 未指定 | 未指定 | 如果源有效:Buffering(如果 AutoPlay == true)或 Stopped(如果 AutoPlay == false)(MediaOpened) 如果源无效:Opening (MediaFailed) |
Buffering | Opening | Playing | Paused | Stopped | Buffering(新位置) | BufferingTime 到达:Playing |
Playing | Opening | 无选项 | Paused | Stopped | Buffering(新位置) | 流结尾:Paused 缓冲区结尾:Buffering |
Paused | Opening | Buffering | 无选项 | Stopped | Paused(新位置) | |
Stopped | Opening | Buffering | Paused | 无选项 | Paused(新位置) |