C# Otworzenie konkretnego mp4 po kliknięciu w któryś element listboxa.

0

Zacząłem pisać na informatykę prosty program do karaoke. Stworzyłem listbox'a, w którym wyświetlane są nazwy plików .txt.mp4 z folderu (żeby mi jakiś śmieszek nie podrzucił samego .mp3), w którym są teksty piosenek .mp4, wygląda to tak:

DirectoryInfo dinfo = new DirectoryInfo(@"ścieżka do folderu z .mp4");
                FileInfo[] Files = dinfo.GetFiles("*.mp4");
                foreach (FileInfo file in Files) 
                {
                    ListaTytulow.Items.Add(Path.GetFileNameWithoutExtension(file.Name));
                }

Chciałbym, żeby kliknięcie w którykolwiek element powodowało otworzenie tekstu w textbox'ie, który dalej by się przewijał i inne takie rzeczy (to się pobawi kolega mam nadzieję, sam wszystkiego robić nie zamierzam :D) oraz odtworzenie mp3 o nazwie takiej samej jak i tekst piosenki. Player do obsługi to będzie kolejny problem. O ile z buttonami i ich widocznością (tak się nauczyłem, nie wiem czy lepiej zrobić w xamlu i potem visuality ustawiać i zmieniać wraz z kolejnymi kliknięciami w programie czy lepiej, żeby tworzyć je kiedy są potrzebne co jest mniej wygodne) to chciałbym, żeby na przykład wstrzymanie utworu powodowało również wstrzymanie animacji. wideo.

EDIT: Otwieranie .mp3 i .txt nie jest mi potrzebne, kolega stwierdził, że zamiast bawić się z .mp3 i .txt zrobi .mp4. Pomysł nie głupi.

Potrzebuję więc, żeby pobrało mi z listboxa nazwę wybranego pliku i później dopisać do stringa ścieżkę do pliku oraz rozszerzenie .mp4 i odtworzyć później to w MediaElement (tak mi się wydaje, że to będzie najlepsze, jeżeli nie to mnie poprawcie), któremu bym nadał nazwę np. OdtwarzenieTytulu. Do tego jakieś buttony, np. Start, Wstrzymaj, Zatrzymaj, może jakiś do Odtwórz losowo oraz fajnie by było jakby można było przewijać to .mp4 (do tego to chyba Slider będzie odpowiedni).

0

O ile z buttonami i ich widocznością (...) to chciałbym, żeby na przykład wstrzymanie powodowało również wstrzymanie wideo.

Co?

Weź to jeszcze raz napisz, z sensem, bez tych skreśleń, bo nie wiadomo o co ci chodzi.

Potrzebuję więc, żeby pobrało mi z listboxa nazwę wybranego pliku i później dopisać do stringa ścieżkę do pliku oraz rozszerzenie .mp4 i odtworzyć później to w MediaElement (...), któremu bym nadał nazwę np. OdtwarzenieTytulu. Do tego jakieś buttony, np. Start, Wstrzymaj, Zatrzymaj, może jakiś do Odtwórz losowo oraz fajnie by było jakby można było przewijać to .mp4

No dobrze, a w czym problem?

0

Właściwie trochę już nieaktualne, bo z większością problemów sobie poradziłem. Natomiast pozostało mi kilka kwestii:
-nie wyświetla mi się obraz w mediaelement, dźwięk słychać;
-jak zrobić, żeby po kliknięciu buttona okno MainWindow ginęło a pojawiało się inne (np. KaraokeWindow) i jak go ustawić wedle upodobań w xamlu i jak się odwołać do tego okna w C# (domyślam się, że wyglądałoby to tak: public partial class KaraokeWindow : Window);
-jak zrobić, żeby po wyświetleniu już swojego odtwarzacza po zakończeniu odtwarzania pojawiał się znów wcześniejszy stan okna czyli lista z piosenkami (coś z if <skończenie odtwarzania pliku w mediaelement> i z goto, np. Lista).

Myślę, że na tę chwilę to wszystko, czego mi potrzeba. Można by jeszcze pomyśleć o jakiejś optymalizacji kodu i dobrych nawykach, kilka dni w C# dopiero robię i nie chciałbym przecież utrwalać w sobie złe nawyki także poniżej kod:

XAML:

<Window x:Class="Karaoke.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Karaoke"
        mc:Ignorable="d"
        Title="MainWindow" Height="359" Width="525">
    <Grid>
        <TextBlock x:Name="Informacja" Margin="168,152,168,118" TextWrapping="Wrap"><Run Text="Aby rozpocząć, naciśnij Start."/><LineBreak/><Run Text="Aby zakończyć, naciśnij Zamknij."/></TextBlock>
        <Button x:Name="start" Content="Start" Margin="149,222,149,52" Click="start_Click"/>
        <Button x:Name="zamknij" Content="Zamknij" Margin="206,286,206,10" Click="zamknij_Click"/>
        <ListBox x:Name="ListaTytulow" Visibility="Hidden" HorizontalAlignment="Left" Height="276" VerticalAlignment="Top" Width="400" SelectionChanged="ListaTytulow_SelectionChanged"/>
        <Button x:Name="Odtworz" Content="Odtworz" Visibility="Hidden" HorizontalAlignment="Left" Margin="419,137,0,0" VerticalAlignment="Top" Width="75" Click="Odtworz_Click"/>
        <MediaElement x:Name="mediaElement" Visibility="Hidden" HorizontalAlignment="Left" Height="276" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" LoadedBehavior="Manual"/>
        <Slider x:Name="Volume" Visibility="Hidden" HorizontalAlignment="Left" Margin="419,291,0,0" VerticalAlignment="Top" Width="88" ValueChanged="Volume_ValueChanged" Value="103" Maximum="100"/>
        <Slider x:Name="Suwak" Visibility="Hidden" HorizontalAlignment="Left" Margin="10,267,0,0" VerticalAlignment="Top" Width="497" ValueChanged="Suwak_ValueChanged"/>
        <Button x:Name="Play" Visibility="Hidden" HorizontalAlignment="Left" Margin="10,291,0,0" VerticalAlignment="Top" Width="21" Height="21" Click="Play_Click">
            <Image Source="H:\Karaoke\Icons\IconPlay.png"/>
        </Button>
        <Button x:Name="Pause" Visibility="Hidden" HorizontalAlignment="Left" Margin="36,291,0,0" VerticalAlignment="Top" Width="21" Height="21" Click="Pause_Click">
            <Image Source="H:\Karaoke\Icons\IconPause.png" Height="17" Width="17"/>
        </Button>
        <Button x:Name="Stop" Visibility="Hidden" HorizontalAlignment="Left" Margin="62,291,0,0" VerticalAlignment="Top" Width="21" Height="21" Click="Stop_Click">
            <Image Source="H:\Karaoke\Icons\IconStop.png" Height="17" Width="17"/>
        </Button>
        <Label x:Name="Glosnosc" Visibility="Hidden" Content="Głośność" HorizontalAlignment="Left" Margin="467,298,0,0" VerticalAlignment="Top" FontSize="8" FontWeight="Thin" Height="22" Width="50" TextOptions.TextHintingMode="Fixed" FontStretch="ExtraCondensed" FontStyle="Italic"/>
    </Grid>
</Window>
/*tutaj jak dobrze kombinuję musi być <Window x:Class="Karaoke.KaraokeWindow"> i przeniesienie tego wszystkiego co by pojawiało się w nowym oknie po kliknięciu Start */

C#:

using System;
using System.IO;
using System.Windows;

namespace Karaoke
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void zamknij_Click(object sender, RoutedEventArgs e)
        {
            System.Diagnostics.Process.GetCurrentProcess().Kill();
        }

        private void start_Click(object sender, RoutedEventArgs e)
        {
            if (start.Visibility == Visibility.Visible)
            {
                Informacja.Visibility = Visibility.Hidden;
                start.Visibility = Visibility.Hidden;
                zamknij.Visibility = Visibility.Hidden;
                DirectoryInfo dinfo = new DirectoryInfo(@"H:\Karaoke\MP4");
                FileInfo[] Files = dinfo.GetFiles("*.mp4");
                foreach (FileInfo file in Files)
                {
                    ListaTytulow.Items.Add(Path.GetFileNameWithoutExtension(file.Name));
                }

                ListaTytulow.Visibility = Visibility.Visible;
                Odtworz.Visibility = Visibility.Visible;
            }
        }

        private void ListaTytulow_SelectionChanged(object sender, EventArgs e)
        {
            string wybranaPiosenka = ListaTytulow.SelectedItem.ToString();
            var sciezkaKaraoke = (@"H:\Karaoke\MP4\");
            string sciezkaWybranejPiosenki = sciezkaKaraoke + wybranaPiosenka + ".mp4";
            mediaElement.Source = new Uri(sciezkaWybranejPiosenki);
            Suwak.Value = mediaElement.Position.TotalSeconds;
        }

        private void Odtworz_Click(object sender, RoutedEventArgs e)
        {
            ListaTytulow.Visibility = Visibility.Hidden;
            Odtworz.Visibility = Visibility.Hidden;
            Play.Visibility = Visibility.Visible;
            Pause.Visibility = Visibility.Visible;
            Stop.Visibility = Visibility.Visible;
            Glosnosc.Visibility = Visibility.Visible;
            Volume.Visibility = Visibility.Visible;
            Suwak.Visibility = Visibility.Visible;
            mediaElement.Play();
        }

        private void Play_Click(object sender, RoutedEventArgs e)
        {
            mediaElement.Play();
        }

        private void Pause_Click(object sender, RoutedEventArgs e)
        {
            mediaElement.Pause();
        }

        private void Stop_Click(object sender, RoutedEventArgs e)
        {
            mediaElement.Stop();
        }

        private void Suwak_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            TimeSpan ts = TimeSpan.FromSeconds(e.NewValue);
            mediaElement.Position = ts;
        }

        private void Volume_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            mediaElement.Volume = Volume.Value;
        }

        private void mediaElement_MediaOpened(object sender, RoutedEventArgs e)
        {
            if (mediaElement.NaturalDuration.HasTimeSpan)
            {
                TimeSpan ts = TimeSpan.FromMilliseconds(mediaElement.NaturalDuration.TimeSpan.TotalMilliseconds);
                Suwak.Maximum = ts.TotalSeconds;
            }
        }
    }
}
//to NaturalDuration żywcem przepisałem z filmiku na yt odnośnie tworzenia odtwarzacza filmu, nie do końca rozumiem użycie :D
0

Poradziłem sobie ze wszystkim, brakuje mi jedynie zamknięcie programu wciskając klawisz Esc w dowolnym momencie.

0

Wciąż nie rozumiem, mógłbyś pomóc?
Dopisałem w xamlu do Window PreviewKeyDown="Window_PreviewKeyDown" a do cs

         private static void Window_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            Window MainWindow = (Window)sender;
            if (e.Key == Key.Escape)
                MainWindow.Close();
        }

i mam przy kompilacji
'MainWindow.Window_PreviewKeyDown(object, KeyEventArgs)' cannot be accessed with an instance reference; qualify it with a type name instead.

0

Pod event KeyUp Twojego okna podepnij handler i sprawdź w nim czy puszczony klawisz to Escape. Jeśli tak wywołaj this.Close():

 
private void Window_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Escape)
        this.Close();
}

W xaml'u:

Title="MainWindow" Height="350" Width="525" KeyUp="Window_KeyUp">

0

Błąd się znalazł - static. Miałem jeszcze ochotę na MessageBox, ale sobie dałem spokój.
Dzięki wielkie za pomoc ;)

0

Ahh, w ogóle do mnie nie dotarło jaki masz problem w ostatnim poście więc moja odpowiedź była bez sensu. Tak to jest jak się czyta i odpowiada na szybko. No ale ważne że sam sobie poradziłeś ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1