2011-05-12 2 views
7

Sto riproducendo un video in WPF. Voglio farlo in modo che ciò che ho fatto sia quando l'evento mediato si attiva, riproduco il mio video. quindi questo mi farà fare un ciclo. è perché devo creare di nuovo una nuova fonte? perché non posso chiamare "play"?C# WPF come ripetere la riproduzione di MediaElement dal gestore di eventi mediato senza dichiarare una nuova fonte?

Non voglio farlo in XAML come per qualche motivo.

uno sguardo al mio frammento di codice:

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(); 
    } 

o c'è un modo corretto di ciclo non in XAML, ma qui il file cs?

risposta

12

Invece di reimpostare la sorgente all'inizio del gestore di Media_Ended, provare a riportare il valore di posizione nella posizione iniziale. La proprietà position è un periodo quindi probabilmente si desidera qualcosa di simile ...

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

thnx per la risposta. ho provato prima, ma nessun success.video non riproduce. – Psychocryo

+0

Hmmm ... è strano. L'ho provato, ma con un file audio non un video. Non sono sicuro del motivo per cui il video sarebbe diverso - darò un'altra occhiata. – IanR

+1

Per alcune ragioni questa combinazione non funziona a volte! Nel mio caso per gif. – Evgeny

0

Non è necessario impostare la fonte again.Just impostare la posizione del MediaElement alla partenza sull'evento media_ended

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

potrebbe essere necessario impostare MediaElement.LoadedBehavior su Manuale

EDIT

ho cercato di caricare un file ASF con il tag REPEAT e il suo bel lavoro

<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> 

ma penso che il meccanismo di gestione delle playlist MediaElement integrato ha alcune flaws.I consigliamo i seguenti la soluzione di cui al link in basso

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

Invia un commento qui se avete qualche problema

+0

sembra che funzioni se il file multimediale è un singolo file ma non funziona se uso un file di playlist come .wpl o .asx – Psychocryo

+0

Quindi dopo che l'intera playlist è finita ... vuoi ripetere dal primo file vero? – biju

+0

Anche come gestisci la tua playlist? AFIK MediaElement non ha un meccanismo di gestione delle playlist incorporato. – biju

1

credo che si dovrebbe utilizzare questo codice:

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

Spero che questo possa essere d'aiuto.

+0

Non fornire risposte "solo codice". Perché pensi che questa sia la risposta? –

+0

Questo ha funzionato per me, non è possibile chiamare "Play" se LoadBehaviour è già stato impostato su Play in XAML. –

5

ho farlo funzionare l'impostazione del UnloadedBehavior = "Manuale" e il codice follwing

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

Impostazione della posizione di lavoro Zero non ha ancora ...

+0

questo ha funzionato per me! l'impostazione su zero non ha funzionato. ho seguito le istruzioni qui e ha funzionato per me. il mio caso era una gif animata. – faldeland

6

Non c'è nemmeno bisogno di impostare LoadedBehavior come Manuale basta lasciare come Riproduzione.

E su evento MediaEnded si dovrebbe impostare nuova posizione del video che sarà non è uguale a zero:

private void MediaElement_MediaEnded(object sender, RoutedEventArgs e) 
{ 
    media.Position = TimeSpan.FromMilliseconds(1); 
}