2009-08-28 12 views
16

Mam aplikację WPF z MediaElement, którego używam do uruchomienia wideo. Nie chcę, aby wideo było odtwarzane automatycznie po załadowaniu, więc ustawiłem LoadedBehavior na Manual.Pokaż pierwszą klatkę wideo w WPF MediaElement

<MediaElement LoadedBehavior="Manual" 
       Source="foo.wmv" 
       MediaOpened="videoElement_MediaOpened" /> 

Jednak; Chcę, aby element wyświetlał pierwszą klatkę wideo po załadowaniu. Czy istnieje jakiś magiczny sposób robienia tego?

Odpowiedz

21

Trzeba również

ScrubbingEnabled="True" 

Następnie ustaw zdarzenie obciążenia

Loaded="Video1_Loaded" 

W metodzie Video1_Load dodać następujące:

Video1.Play(); 
Video1.Pause(); 

Żadna z treści wideo staje przed metoda odtwarzania jest wywoływana. Więc nawet jeśli ustawisz pozycję za pierwszą ramką, nie otrzymasz żadnych danych.

Uważam, że właściwość to klucz do właściwości MediaElement.ScrubbingEnabled.

Pobiera lub ustawia wartość wskazującą, czy MediaElement zaktualizuje klatek na poszukiwania operacji podczas wstrzymane. Jest to właściwość zależności.

Próbowałem tego samego podejścia bez opcji ScrubbingEnabled, ale odkryłem, że pierwsza ramka nie wyrenderuje. Nie jestem pewien, czy to tylko sprzęt, którego używam do tego. Kolejną rzeczą do zapamiętania jest to, że sposób działania MediaElement, po wywołaniu funkcji Play(), nie może faktycznie zatrzymać() na pierwszej klatce dokładnie, więc możesz chcieć zmniejszyć głośność w strumieniu przed wywołaniem Odtwarzania i resetowania po wywołaniu Pauza.

+1

Thx - to działa! Muszę powiedzieć, że nie czuję się dobrze z wyzwalaczem Play() Pause(). Zobaczyłem, że ktoś też to sugeruje, ale uznało to podejście za nieco "hacky". Ale jeśli to jedyny sposób, jak sądzę, będziemy musieli z tym żyć. ScrubbingEnabled to dobra właściwość, ale nie ma nic wspólnego z wyświetlaniem pierwszej klatki wideo przy starcie. – stiank81

8

Nie trzeba, aby stworzyć wydarzenie, patrz poniższa

<MediaElement Source="foo.wmv" 
       MediaOpened="videoElement_MediaOpened" 
       LoadedBehavior="Pause" ScrubbingEnabled="True" /> 
+0

nie można kontrolować MediaElement za pomocą play, stop ... Musisz ustawić LoadedBehavior na manual. jeśli ustawisz, aby wstrzymać, jak byś zaczął grać? –

+0

@AlexanderZwitbaum: Przez wywołanie metody "Play" na podstawie innego zdarzenia, niezwiązanego ze zintegrowanymi przyciskami? –

1

nie mogę się wypowiedzieć, więc tutaj jest moja odpowiedź: Szorowanie odnosi się do aktualizowania renderowany obraz kiedy MediaElement jest wstrzymana.

//Todo: Set your source 

//if not stated in the xmal, you can still set this here. 
Player.LoadedBehavior = MediaState.Manual; 

//Turn scrubbing on 
Player.ScrubbingEnabled = true; 

Player.Pause(); 

Player.Position = TimeSpan.FromTicks(1); 

Dzięki za końcówkę szorującą!