WPF multimédia lejátszó készítése C#-ban 6

Ebben az esztendőben ez lesz az utolsó programozásos bejegyzésem, amiben a filmben való tekerést fogjuk megoldani, ami már réges-régóta hiányzott a programunkból.

Az előző blogbejegyzéshez hasonlóan keressük meg a Window1.xaml fájlban a MediaElementünk sorát és egészítsük ki, hogy így nézzen ki:


<MediaElement x:Name="Media" Margin="10" Volume="{Binding ElementName=slidVolume, Path=Value}" Balance="{Binding ElementName=slidBalance, Path=Value}" MediaOpened="Media_MediaOpened" MediaEnded="Media_MediaEnded" LoadedBehavior="Manual" MouseLeftButtonUp="Media_MouseLeftButtonUp"/>

A Window1.xaml.cs állományban hozzunk létre egy logikai változót arra, hogy mozgatjuk-e a csúszkát és egy DispatcherTimer-t, aminek a Tick eseményével fog majd a mozival együttesen a csúszkánk haladni. Ehhez még be kell biggyesztenünk a System.Windows.Threading függvénykönyvtárat a névterünk elé, hogy helyesen működjön az időzítőnk.


using System.Windows.Threading;
//A csúszka mozog-e
bool isDragging = false;
//Timer létrehozása
DispatcherTimer dispTimer = new DispatcherTimer();

A Window1 konstruktort egészítsük ki úgy, hogy megadjuk a Timer milyen időközönként miféle eseményt hajtson végre.


//Timer tickjei közti időköz beállítása
dispTimer.Interval = TimeSpan.FromSeconds(1);
//Tickelésnél végbemenő esemény
dispTimer.Tick += new EventHandler(dispTimer_Tick);

Írjuk meg az időzítőnk Tick eseményét, amiben ha a csúszkát nem mozgatjuk, akkor a médiával együtt fog futni folytonosan.


void dispTimer_Tick(object sender, EventArgs e)
{
//Ha a csúszkát nem mozgatjuk, akkor átadja a slidernek a média jelenlegi idejét
if (!isDragging)
{
slidPosition.Value = Media.Position.TotalSeconds;
}
}

A btnPlay_Click eseményünket egészítsük ki, hogy a mozi elindításakor a Timer is elinduljon.


private void btnPlay_Click(object sender, RoutedEventArgs e)
{
//Média lejátszása
Media.Play();
//Timer indítása
dispTimer.Start();
}

A fájl megnyitásakor a csúszka legnagyobb értékének beállítjuk a fájl időtartamát és ezt a hosszúságot kitesszük egy labelbe, aminek a neve lbDuration.


private void Media_MediaOpened(object sender, RoutedEventArgs e)
{
//Slider maximumának beállítása a média hosszához
slidPosition.Maximum = Media.NaturalDuration.TimeSpan.TotalSeconds;
//TimeSpan létrehozása és a slider maximumának átadása
TimeSpan ts = TimeSpan.FromSeconds(slidPosition.Maximum);
//Média hosszának kiírása
lbDuration.Content = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
}

Ha vége lett a médiánknak a csúszka álljon vissza az elejére, a nulla értékre.


private void Media_MediaEnded(object sender, RoutedEventArgs e)
{
//A slider értékének visszaállítása
slidPosition.Value = 0;
}

Most álljunk meg egy kicsit pihenni, mert elég sok volt ez így egy szuszra. Majd folytassuk.

Térjünk vissza a Window1.xaml fájlhoz és a slidPosition csúszkát változtassuk meg az alábi sorra, hogy a csúszka mozgatásához eseményeket generáljunk.


<Slider x:Name="slidPosition" VerticalAlignment="Center" Grid.ColumnSpan="3" Grid.Column="1" ValueChanged="slidPosition_ValueChanged" Thumb.DragStarted="slidPosition_DragStarted" Thumb.DragCompleted="slidPosition_DragCompleted"/>

Újra a Window1.xaml.cs-ben legyünk.
Ha elkezdjük mozgatni a csúszkát a logikai változónk legyen igaz értékű.


private void slidPosition_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
{
//Csúszka mozog
isDragging = true
}

Ha megszüntetjük a mozgatást értelemszerűen legyen az isDragging hamis és a csúszka értékét adjuk át a MediaElementnek.


private void slidPosition_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
//Csúszka nem mozog
isDragging = false;
//Média elugrik a slider jelenlegi idejére
Media.Position = TimeSpan.FromSeconds(slidPosition.Value);
}

Amint megváltozik a csúszkánk értéke írjuk ki az lbPosotionba.


private void slidPosition_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
//TimeSpan létrehozása és a slider jelenlegi értékének átadása
TimeSpan ts = TimeSpan.FromSeconds(slidPosition.Value);
//Hol tart jelenleg a média
lbPosition.Content = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
}

A kész programot forráskóddal együtt le tudják tölteni: Letöltés
A programhoz szükség van a Windows Media Player 10-re: Letöltés

Ha valami hibát vettél észre a működése közben vagy van valami ötleted a továbbfejlesztéshez akkor írj egy e-mailt nekem: orcsikj[kukac]yahoo.com

0 megjegyzés :

Megjegyzés küldése