c # WPF, как повторить воспроизведение MediaElement из обработчика событий mediaended, не объявляя новый источник? - PullRequest
8 голосов
/ 12 мая 2011

я играю видео в WPF. Я хочу, чтобы оно зацикливалось, поэтому я запускаю медиафайлы при воспроизведении видео.так что это даст мне петлю.Вероятно, почему пользователь должен снова создать новый источник?почему я не могу просто назвать 'play'?

Я не хочу делать это в XAML, как по какой-то причине.

взгляните на мой фрагмент кода:

string startPath System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);


public Window1()
    {
        InitializeComponent();
        media.Source = new Uri(startPath + @"playlist.wpl");
        media.play();
    }

private void Media_Ended(object sender, EventArgs e)
    {
        media.Source = new Uri(startPath + @"playlist.wpl"); //if i dont put this line, video wont play..seems like it cant get the source
        media.Play();
    }

или есть правильный способ зацикливаться НЕ в XAML, а в файле .cs здесь?

Ответы [ 5 ]

15 голосов
/ 12 мая 2011

Вместо сброса источника в начале вашего обработчика Media_Ended, попробуйте установить значение позиции обратно в начальную позицию.Свойство Position является TimeSpan, поэтому вы, вероятно, хотите что-то вроде ...

private void Media_Ended(object sender, EventArgs e)
{
    media.Position = TimeSpan.Zero;
    media.Play();
}
8 голосов
/ 21 октября 2014

Вам даже не нужно устанавливать LoadedBehavior как Вручную , просто оставьте его как Воспроизвести .

И на событии MediaEnded вы должны установить новую позицию видео, котораябудет не равно нулю :

private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
     media.Position = TimeSpan.FromMilliseconds(1);
}
6 голосов
/ 12 сентября 2012

Я заставляю его работать, устанавливая UnloadedBehavior = "Manual" и следующий код

 private void gifAnimation_MediaEnded(object sender, RoutedEventArgs e)
 {
    gifAnimation.Position = new TimeSpan(0,0,1);
    gifAnimation.Play();
 }

Установка нулевого положения не сработала ...

1 голос
/ 17 июля 2011

Я думаю, вы должны использовать этот код:

private void Media_Ended(object sender, EventArgs e)
{
   media.Position = TimeSpan.Zero;
   media.LoadedBehavior = MediaState.Play;
}

Надеюсь, это поможет.

0 голосов
/ 12 мая 2011

Вам не нужно снова устанавливать источник. Просто установите позицию медиаэлемента на начало события media_ended

 private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
        {
            ((MediaElement)(sender)).Stop();
            ((MediaElement)(sender)).Position = new TimeSpan(0, 0, 0);
            ((MediaElement)(sender)).Play();
        }

Возможно, вам потребуется установить MediaElement.LoadedBehavior на Manual

EDIT

Я попытался загрузить файл asf с тэгом REPEAT, и он работает нормально

<ASX version = "3.0">
   <TITLE>Simple ASX Demo</TITLE>
<REPEAT> 
      <ENTRY>
         <TITLE>Vista Butterfly Video</TITLE>
         <AUTHOR>Microsoft Corporation</AUTHOR>
         <COPYRIGHT>(c)2007 Microsoft Corporation</COPYRIGHT>
         <REF HREF = "Butterfly.wmv" />
     </ENTRY>
</REPEAT> 
</ASX>

Но я думаю, что встроенный механизм обработки списка воспроизведения медиаэлемента имеет некоторые недостатки. Я рекомендую использовать обходной путь, упомянутый в ссылке ниже

http://blog.revolunet.com/index.php/general/wpf-mediaelement-asx-workaround

Оставьте комментарий здесь, если у вас возникли проблемы

...