WPF中的音频——(5)
MediaPlayer比起SoundPlayer来说,有很大的灵活性,但它仍然是为程序代码设计的。为了方便在XAML中能使用它,WPF提供了一个MediaElement类,它封装了MediaPlayer类,如同SoundPlayerAction封装了SoundPlayer一样。
MediaElement继承自FrameworkElement,因此,它可以嵌入用户界面参与布局。通过为MediaElement的Source属性赋一个音频文件的Uri,它就能在加载之后进行播放。且MediaElement提供了MediaPlayer的许多属性和事件,方便用户在XAML中进行设置。
如果你想控制MediaElement的播放,那么,你应该试着用MediaTimeline的动画来设置MediaElement的Source属性。当MediaTimeline的TargetName是MediaElement时,将依据设置的媒体源自动创建一个MediaClock并将其分配给MediaElement关联的播放器(MediaPlayer)。MediaElement关联的播放器得到MediaClock后,会工作在时钟模式,自动进行媒体的播放。另外,通过MediaTimeline设置的Duration和BeginTime等属性,都能关联到MediaElement上,从而控制媒体源播放的时间和开始时间等。
使用MediaElement和MediaTimeline来播放音频文件的代码如下:
<MediaElement Name="audio"/>
<Button Content="Play">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<MediaTimeline Source="BLOW.WAV" Storyboard.TargetName="audio"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
除了BeginStoryboard外,可以对同一个Storyboard使用PauseStoryboard、ResumeStoryboard、SeekStoryboard和StopStoryboard动作分别来暂停、继续、Seek、停止一段音频。
如果想循环听一段背景音乐,可以设置MediaTimeline的RepeatBehavior为Forever或“3x”等。
如果不想在XAML中完成音频的控制动作,想挪到后台代码中,那么,你首先需要设置MediaElement的LoadedBehavior属性为Manual(且MediaElement不是MediaTimeline的动画目标,否则它的行为始终受MediaClock的Clock影响,无法交互式控制),才能使用Play、Pause和Stop方法交互式控制媒体。