Элемент MediaElement

93

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>
Пройди тесты
Лучший чат для C# программистов