Элемент MediaElement
93WPF --- Элементы управления WPF --- Элемент MediaElement
MediaElement — это элемент WPF, служащий оболочкой функциональности класса MediaPlayer. Подобно всем элементам, MediaElement помещается непосредственно в пользовательский интерфейс. В случае применения MediaElement для воспроизведения аудио его расположение не имеет значения, но если воспроизводится видео, он должен быть размещен там, где планируется отображаться видео-окно.
Простейший дескриптор MediaElement — это все, что понадобится для воспроизведения звука. Например, если добавить следующую разметку к пользовательскому интерфейсу:
<MediaElement Source="test.mp3"></MediaElement>
то аудиофайл test.mp3 будет воспроизведен немедленно после загрузки (что более или менее совпадет с загрузкой окна).
Программное воспроизведение аудио
Обычно в тонком управлении воспроизведением необходимости нет. Например, может потребоваться, чтобы в определенный момент оно было запущено, постоянно воспроизводилось повторно и т.д. Один способ достичь этого заключается в применении методов класса MediaElement в надлежащий момент.
Поведение MediaElement при запуске определяется его свойством LoadedBehavior, которое является одним из нескольких свойств, которые добавлены в классе MediaElement и отсутствуют в классе MediaPlayer.
Свойство LoadedBehavior принимает любое значение из перечисления MediaState. По умолчанию оно равно Play, но можно также использовать Manual — в этом случае файл загружается, а за запуск воспроизведения в нужный момент отвечает код. Другое значение этого свойства — Pause, установка которого приостанавливает воспроизведение, но не позволяет использовать методы воспроизведения. (Вместо этого придется запускать воспроизведение с помощью триггеров и раскадровки)
Класс MediaElement также предоставляет свойство UnloadedBehavior, определяющее, что произойдет при выгрузке элемента. В данном случае единственным осмысленным выбором может быть Close, поскольку это закроет файл и освободит все системные ресурсы.
Итак, чтобы воспроизвести аудиофайл программно, необходимо начать с изменения LoadedBehavior, как показано ниже:
<MediaElement Source="music.mp3" LoadedBehavior="Manual" Name="media"></MediaElement>
Кроме того, понадобится выбрать имя, чтобы можно было взаимодействовать с медиа-элементом в коде. Обычно взаимодействие предусматривает вызов очевидных методов Play(), Pause() и Stop(). Также можно установить свойство Position, чтобы перемещаться по аудиозаписи. Ниже приведен простой обработчик событий, который осуществляет перемотку записи в начало и запускает воспроизведение:
Если этот код запускается во время воспроизведения, то его первая строка сбросит позицию в начало, и воспроизведение начнется оттуда. Вторая строка не будет иметь эффекта, поскольку медиафайл уже воспроизводится. Если же попытаться применить этот код в отношении MediaElement, у которого свойство LoadedBehavior не установлено в Manual, возникнет исключение.
В типичном медиапроигрывателе можно выполнять типовые команды вроде воспроизведения, паузы и останова более чем одним способом. Очевидно, что это отличное место для того, чтобы применить модель команд WPF. Фактически, для этого существует класс команд, который уже включает некоторую удобную инфраструктуру, и этот класс — System.Windows.Input.MediaCommands. Однако MediaElement не имеет никаких привязок команд по умолчанию, которые поддерживают класс MediaCommands.
Другими словами, на вас возлагается задача написания логики обработки событий, которая реализует каждую команду и вызовет соответствующий метод MediaElement. В ваших силах организовать код так, чтобы несколько элементов пользовательского интерфейса были привязаны к одной и той же команде для сокращения дублирования кода.
MediaElement не генерирует исключение, если не может найти или загрузить файл. Вместо этого предлагается обработать событие MediaFailed. К счастью, задача это несложная. Просто подкорректируйте дескриптор MediaElement:
<MediaElement ... MediaFailed="media_MediaFailed"></MediaElement>