Изменить источник медиаэлемента на основе действий

У меня есть проект WPF 4 и VB.net 2010. Я воспроизводю видео в одном медиаэлементе. Вот что мне нужно сделать:

Когда окно открывается впервые, у меня первое видео воспроизводится просто отлично. Однако именно после воспроизведения этого видео у меня возникли проблемы с выяснением того, как сделать следующее.

  1. Мне нужно, чтобы источник видео менялся сразу после одного воспроизведения любого видео, и мне нужно, чтобы это видео (далее именуемое «эмбиентным» видео) зацикливалось бесконечно.

  2. Когда происходит определенное событие, мне нужно снова изменить источник видео, воспроизвести его один раз, а затем вернуться к зацикливанию окружающего видео на шаге 1.

Однако вот в чем загвоздка. Многие видео-триггеры находятся внутри операторов If-Then или Select Case в коде позади, поэтому я не использую исключительно простые события WPF, такие как «MouseUp» или «MouseEnter».

Кроме того, все видео должны воспроизводиться в одном медиаэлементе по соображениям производительности.

Заранее спасибо!

Как мне это сделать?


person CodeMouse92    schedule 15.04.2011    source источник


Ответы (2)


Источник медиа-элемента является DependencyProperty, поэтому любые изменения в нем будут немедленно отражены в пользовательском интерфейсе.

Если вы объедините это с MediaEnded, вы можете установить источник, и ваша проблема будет решена.

Когда вы нажимаете триггеры в коде, вы можете либо вызвать метод, либо запустить событие. Вам придется использовать некое подобие Шаблона состояния для работы с другой логикой. Кроме того, ознакомьтесь с Programming Without Ifs, это отличное введение о том, как избежать безумной условной логики.

person Nate Noonen    schedule 21.04.2011
comment
По какой-то причине запуск изменения источника из MediaEnded не работает. Что должно быть установлено для UnloadedBehavior медиаэлемента? - person CodeMouse92; 21.04.2011
comment
Что вы имеете в виду, запуская изменение источника? Когда срабатывает событие MediaEnded, просто установите новый источник в качестве источника. Возможно, вам придется сделать это с помощью делегата. - person Nate Noonen; 21.04.2011
comment
Вот что я имею в виду ... Я пробовал именно это. В событии MediaElement я помещаю код для изменения источника, но этот код никогда не запускается при срабатывании события (хотя я подозреваю, что само событие не запускается). Итак, это снова возвращает меня к вопросу: для того, чтобы это опосредованное событие работало, какое значение должно быть установлено для unloadedbehavior в медиаэлементе WPF? - person CodeMouse92; 21.04.2011
comment
Хм... можешь попробовать MarkerReached? И установить маркер в конце клипа? msdn .microsoft.com/en-us/library/ - person Nate Noonen; 21.04.2011
comment
Хорошая идея... Я посмотрю на это. - person CodeMouse92; 21.04.2011
comment
Нашел проблему. Смотрите мой ответ ниже. Поскольку вы изначально шли по правильному пути, а я ненавижу принимать собственные ответы, вы получаете награду. ТЫ! - person CodeMouse92; 25.04.2011
comment
Рад слышать это. Нет проблем, если вы решите принять свои собственные ответы, большую часть времени я делаю то же самое, так как мне нужно исправить это быстрее, чем SO сможет найти для него ответ. - person Nate Noonen; 25.04.2011

Я установил для LoadedBehavior медиаэлемента значение «Воспроизвести», а для Unloadedbehavior — «Стоп», после чего я смог просто изменить источник самого медиаэлемента в коде и поместить видео, которое мне нужно было воспроизвести после каждого видео, в событие MediaEnded.

Оказывается, MediaEnded не срабатывает автоматически, когда для LoadedBehavior установлено значение «Вручную», если в коде явно не вызывается «Стоп».

Я ненавижу принимать свои собственные ответы, поэтому награду получает Нейт Нунен (изначально он шел по правильному пути)! ТЫ!

person CodeMouse92    schedule 24.04.2011