none
Media-Player und Dispatcher-Timer RRS feed

  • Frage

  • Hallo und schönen Ostermontag

    Zuerst bitte ich um Entschuldigung, wegen der Länge dieses Beitrags.

    Vor vielen Jahren hatte ich (sehr kurz) mit C# begonnen. Dann leider pausiert.

    Nun war mein erster neuer Versuch (WPF) nicht gerade erfolgreich. Ein von hier C# WPF Material Design UI: MP3 Music App - YouTube nachgebautes Projekt fliegt mir jedes Mal kräftig um die Ohren und ich bin zu unerfahren, um das Problem zu lösen.

    Es geht um diesen Abschnitt:

    void Timer_Tick(object sender, EventArgs e)

            {

               try

                {

                    TimerSlider.Value = mediaPlayer.Position.TotalSeconds;

                    lblCurrenttime.Text = mediaPlayer.Position.ToString(@"mm\:ss");

                    lblMusiclength.Text = mediaPlayer.NaturalDuration.TimeSpan.ToString(@"mm\:ss");

                    lblCountdown.Text = mediaPlayer.NaturalDuration.Subtract(mediaPlayer.Position).TimeSpan.ToString(@"mm\:ss");

                   

                  

                    lblTime.Text = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00") + ":" + DateTime.Now.Second.ToString("00");

     

                    if (lblTime.Text == lblAlarm.Text)

                    {

                        mediaPlayer2.Play();

                    }

                }

                catch

                {

                    Exception exception = new Exception();

                    System.Windows.MessageBox.Show(exception.ToString());

                }

            }

    Wenn mediaPlayer2 (Wecker) zuerst gestartet wird, bleibt alles von mediaPlayer leer. Das mag DispatcherTimer nicht. Ein zweiter Timer (und Timer2_Tick) funktioniert nicht.

    Was kann ich ändern, um beide Player zu behalten?

    Falls es notwendig ist, werde ich alles in einen freigegebenen OneDrive-Ordner kopieren.

    Montag, 5. April 2021 12:41

Antworten

  • Hallo ch.f.1!

    Ich habe gerade keine Zeit mehr.

    Du müsstest deine Fragen konkreter stellen. Ich habe dir mal ein Grundgerüst nach deiner Fragestellung: 

    In diesem Projekt wollte ich zwei MediaPlayer (einen nur zum Anspielen von Musik-Dateien, einen als Wecker), die unabhängig voneinander verwendbar sind.

    gebaut. Funktioniert auch problemlos, solang die Weck-Melodie größer als 1 Minute ist. Kleiner bekommt man auch hin, wenn an der Logik noch etwas gearbeitet wird.

    Sieh es dir mal in Ruhe an. 

    using System;
    using System.IO;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Threading;
    
    namespace MusicApp2
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            readonly Microsoft.Win32.OpenFileDialog dlgMusik_Datei = new Microsoft.Win32.OpenFileDialog();
            readonly Microsoft.Win32.OpenFileDialog dlgWecker_Datei = new Microsoft.Win32.OpenFileDialog();
            readonly MediaPlayer MP_Musik = new MediaPlayer();
            readonly MediaPlayer MP_Wecker = new MediaPlayer();
            readonly DispatcherTimer Timer1 = new DispatcherTimer();                                            // Timer initalisieren
            bool Wecker_aktiv = false;                                                                          // Indikator Wecker aktiv initalisieren
    
    
            private void WndMediaPlayer_Loaded(object sender, RoutedEventArgs e)
            {
                // Anfangsverzeichnisse initalisieren
                dlgMusik_Datei.InitialDirectory = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Musik";     // Pfad zu den Musikdateien
                dlgWecker_Datei.InitialDirectory = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Wecker";   // Pfad zu den Weckerdateien
                // Weckzeit initalisieren
                Tbo_Weckzeit_Stunde.Text = DateTime.Now.Hour.ToString("00");
                Tbo_Weckzeit_Minute.Text = DateTime.Now.AddMinutes(2).Minute.ToString("00");
                // Timer initalisieren
                Timer1.Tick += new EventHandler(Timer1_Tick);                                       // Timer-Event zuordnen
                Timer1.Interval = new TimeSpan(0, 0, 1);                                            // Event auf 1s setzen
                Timer1.Start();                                                                     // Timer (jetzt) starten
            }
    
            private void Btn_Musik_Datei_Click(object sender, RoutedEventArgs e)
            {
                if (dlgMusik_Datei.ShowDialog() == true)
                {
                    Lbl_Musik_Datei.Content = dlgMusik_Datei.SafeFileName;
                    MP_Musik.Open(new Uri(dlgMusik_Datei.FileName));
                    MP_Musik.Play();
                }
            }
    
            private void Btn_Wecker_Datei_Click(object sender, RoutedEventArgs e)
            {
                if (dlgWecker_Datei.ShowDialog() == true)
                {
                    Lbl_Wecker_Datei.Content = dlgWecker_Datei.SafeFileName;
                    MP_Wecker.Open(new Uri(dlgWecker_Datei.FileName));
                }
            }
    
            private void Tbo_Weckzeit_Stunde_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Tbo_Weckzeit_Minute_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Tbo_Weckzeit_Sekunde_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Btn_Stop_Click(object sender, RoutedEventArgs e)
            {
                Timer1.Stop();
                MP_Musik.Stop(); MP_Musik.Close();
                MP_Wecker.Stop(); MP_Wecker.Close();
            }
    
            private void Timer1_Tick(object sender, EventArgs e)
            {
                Lbl_AktZeit.Content = DateTime.Now.ToString("HH:mm:ss");
    
                if (DateTime.Now.Hour == Convert.ToInt32(Tbo_Weckzeit_Stunde.Text) &&
                    DateTime.Now.Minute == Convert.ToInt32(Tbo_Weckzeit_Minute.Text))      // Weck-Minute erreicht
                {
                    if (!Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan && MP_Wecker.Position.TotalSeconds == 0)    // Weck-Sound angegeben?
                    {
                        Tbo_Weckzeit_Stunde.Background = Brushes.Red; Tbo_Weckzeit_Minute.Background = Brushes.Red;
                        MP_Musik.Pause();                       // Musikwiedergabe stoppen
                        MP_Wecker.Play();                       // Wecksound wiedergeben
                        Wecker_aktiv = true;                    // Indikator Wecker aktiv, setzen
                    }
                }
                if (Wecker_aktiv && MP_Wecker.Position == MP_Wecker.NaturalDuration.TimeSpan) // Weck-Sound beendet?
                {
                    Tbo_Weckzeit_Stunde.Background = Brushes.White; Tbo_Weckzeit_Minute.Background = Brushes.White;
                    Wecker_aktiv = false;                       // Indikator Wecker aktiv, zurücksetzen
                    MP_Wecker.Stop();                           // Weckersound anhalten 
                    MP_Wecker.Position = new TimeSpan(0);       // Wecksound-Position (wieder) auf Anfang stellen
                    MP_Musik.Play();                            // Musikwiedergabe fortsetzen
                }
            }
        }
    }
    

    <Window x:Name="WndMediaPlayer" x:Class="MusicApp2.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"
            mc:Ignorable="d" 
            Title="MainWindow" Height="150" Width="600" Loaded="WndMediaPlayer_Loaded">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Grid.Column="0" Grid.Row="0" Content="Musik-Datei (Player 1)" />
            <Label Grid.Column="1" Grid.Row="0" x:Name="Lbl_Musik_Datei"/>
            <Button Grid.Column="2" Grid.Row="0" x:Name="Btn_Musik_Datei" Content="Auswahl" Click="Btn_Musik_Datei_Click" />
            <Label Grid.Column="0" Grid.Row="1" Content="Wecker-Datei (Player 2)" />
            <Label Grid.Column="1" Grid.Row="1" x:Name="Lbl_Wecker_Datei" />
            <Button Grid.Column="2" Grid.Row="1" x:Name="Btn_Wecker_Datei" Content="Auswahl" Click="Btn_Wecker_Datei_Click" />
            <Label Grid.Column="0" Grid.Row="2" Name="lblTest" Content="Weckzeit"/>
            <StackPanel Orientation="Horizontal" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,3,0,0">
                <TextBox x:Name="Tbo_Weckzeit_Stunde" Width="25" Text="00"  PreviewTextInput="Tbo_Weckzeit_Stunde_PreviewTextInput" MaxLength="2" />
                <Label Content=":" Padding="0" />
                <TextBox x:Name="Tbo_Weckzeit_Minute" Width="25" Text="00" PreviewTextInput="Tbo_Weckzeit_Minute_PreviewTextInput" MaxLength="2"/>
            </StackPanel>
            <Label Grid.Column="2" Grid.Row="2" Name="Lbl_AktZeit" Content="00:00:00" Foreground="Gray"/>
            <Button x:Name="Btn_Stop" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="3" Content="Stop!" Margin="3,5,3,2" Click="Btn_Stop_Click" />
        </Grid>
    </Window>
    

    Wenn die Weckzeit erreicht wird, wird der MediaPlayer MP_Musik gestoppt und über den MediaPlayer MP_Wecker der Wecksound wiedergegeben.

    Viele Grüße Fred.

    • Als Antwort markiert ch.f.1 Donnerstag, 8. April 2021 00:15
    Mittwoch, 7. April 2021 14:00
  • Hallo Chris!

    Um deine Optik mach ich mir überhaupt keine Sorgen! :-) Wenn ich mal einen Designer brauche, melde ich mich! ;-)

    Ich habe meinen Code mal um die Verrieglung, dass wenn der Weck-Sound kürzer als eine Minute ist, der (Weck) Sound nicht mehrfach abgespielt wird, erweitert.

    public MainWindow()
    {
        InitializeComponent();
    }
    
    ...
    
    KeyValuePair<string, int> KvpWekzeitZaehler = new KeyValuePair<string, int>("",0);                  // Weckzeit-Zähler initalisieren
    
    ...
    
    
    private void Timer1_Tick(object sender, EventArgs e)
    {
        Lbl_AktZeit.Content = DateTime.Now.ToString("HH:mm:ss");
    
        if (DateTime.Now.Hour == Convert.ToInt32(Tbo_Weckzeit_Stunde.Text) &&
            DateTime.Now.Minute == Convert.ToInt32(Tbo_Weckzeit_Minute.Text))           // Weck-Minute erreicht
        {
            if (!Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan && MP_Wecker.Position.TotalSeconds == 0)    // Weck-Sound angegeben?
            {
                string StrWeckzeit = Tbo_Weckzeit_Stunde.Text + " | " + Tbo_Weckzeit_Minute.Text;                       // Weckzeit 
                if (!KvpWekzeitZaehler.Key.Contains(StrWeckzeit))                       // Noch kein Weckzeit-Eintrag vorhanden?
                    KvpWekzeitZaehler = new KeyValuePair<string, int>(StrWeckzeit, 0);  // Weckzeit-Eintrag mit Zählerstand 0 setzen
                if(KvpWekzeitZaehler.Value == 0)                                        // 1. Durchlauf? -> Wecker starten, ansonsten (Beim Folgeaufruf innerhalb der Weck-Minute) nichts machen
                {
                    Tbo_Weckzeit_Stunde.Background = Brushes.Red; Tbo_Weckzeit_Minute.Background = Brushes.Red;
                    MP_Musik.Pause();                                                   // Musikwiedergabe stoppen
                    MP_Wecker.Play();                                                   // Wecksound wiedergeben
                    Wecker_aktiv = true;                                                // Indikator Wecker aktiv, setzen
                    KvpWekzeitZaehler = new KeyValuePair<string, int>(StrWeckzeit, 1);  // Weckzeit-Eintrag mit Zählerstand 1 setzen
                }
            }
        }
        if (Wecker_aktiv && MP_Wecker.Position == MP_Wecker.NaturalDuration.TimeSpan)   // Weck-Sound beendet?
        {
            Tbo_Weckzeit_Stunde.Background = Brushes.White; Tbo_Weckzeit_Minute.Background = Brushes.White;
            Wecker_aktiv = false;                                                       // Indikator Wecker aktiv, zurücksetzen
            MP_Wecker.Stop();                                                           // Weckersound anhalten 
            MP_Wecker.Position = new TimeSpan(0);                                       // Wecksound-Position (wieder) auf Anfang stellen
            MP_Musik.Play();                                                            // Musikwiedergabe fortsetzen
        }
    }

    Was ich an deinem Projekt nicht verstehe: Was willst du mit den ganzen Timern???

    Du brauchst doch nur einen Timer, um ein Intervall zu haben, damit du regelmäßig die aktuelle Uhrzeit abfragen kannst. Und das auch nur, um die Funktionalität Wecker bereit zu stellen.

    Der Musikplayer "arbeitet" vollständig autark und der Weck(er)player wird nur in Abhängigkeit der Uhrzeit aktiviert.  Es existieren keine weiteren zeitgesteuerten Prozesse.

    Viel Freude beim Umsetzen deiner Ideen.

    Fred.

    • Als Antwort markiert ch.f.1 Freitag, 9. April 2021 21:16
    Donnerstag, 8. April 2021 14:30
  • Hallo Chris!

    Aus Zeitmangel mal im Schnelldurchlauf, ich antworte dir noch einmal Detaillierter.

    - Bei (während) der Weck-Zeiteingabe musst du die Umformung der Eingabe mit try/catch abfangen:

    #region Wecker
    int nWeckStunde = -1;                                                           // Weckzeit Stunden initalisieren
    int nWeckMinute = -1;                                                           // Weckzeit Minuten initalisieren
    
    try
    {
        nWeckStunde = Convert.ToInt32(Tbo_Weckzeit_Stunde.Text);
        nWeckMinute = Convert.ToInt32(Tbo_Weckzeit_Minute.Text);
    }
    catch (Exception) { }       // Wenn Eingabewert nicht umgeformt werden konnte, ungültige Werte verwenden -> Weckzeit übergehen
    
    if (DateTime.Now.Hour == nWeckStunde && DateTime.Now.Minute == nWeckMinute)   // Weck-Minute erreicht

    - 12/24 Stunden Anzeige: Sieh mal, ob du bei deinem Zielframework (für das aktuelle Projekt) auch das Languagepack (Deutsch) des Frameworks auf dem Entwicklungs-Rechner installiert hast! Sonst wird der Standard (englisch), mit der 12 Stunden Anzeige verwendet. Wie man sieht, ist es ja im Betriebssystem (Windows) richtig eingestellt.

    - Selbstverständlich kannst du mit dem Code machen was du willst. Ist ja sowieso nur ein auf Funktionalität und Anschaulichkeit getrimmter Code.

    - Ich würde es sehr empfehlen für neue Probleme neue Themen und wenn es geht auch viel konkreter aufzumachen/anzusprechen.

    Ich habe den Entwurf noch etwas praxistauglicher und WPF konformer gestaltet, doch dazu Morgen.



    • Bearbeitet perlfred Montag, 12. April 2021 14:38
    • Als Antwort markiert ch.f.1 Dienstag, 13. April 2021 19:13
    Montag, 12. April 2021 14:35
  • Hallo Chris!

    Die Slider dienen nicht zum Anzeigen des Abspielfortschrittes, sondern steuern die Lautstärke des Musik- und Wecker-Mediaplayers. Ich befürchte zwar, dass das (trotzdem noch kleine) Gesamtprojekt für dich mehr Fragen als Antworten bereithält, möchte es dir aber trotzdem erst einmal zur Verfügung stellen. Du kannst sicher für dich interessante Details herausnehmen und Fragen hier wieder posten. Aber bitte jeweils in einem neuen Thema!

    Die LED-Anzeige ist keine Schriftart sondern ein WPF-Control (LED_Uhr), dass ich auf Grundlage des SevenSegment-Controls von Mohammad Dayyan (hier veröffentlicht auf CODE PROJEKT) modifiziert und erstellt habe. Auch dieses stelle ich dir hier zum Download bereit.

    Die Symbole habe ich aus 2D-Objekten zusammengestellt, da du sie so direkt aus dem XAML übernehmen kannst, aber du kannst natürlich auch ganz normale Bilder mit einem Image-Objekt benutzen.

    Dein oben angesprochener Fehler resultiert aus der Tatsache, dass der Duration-Wert auf Automatic steht. Du kannst ihn umgehen, indem du vorher die HasTimSpan-Eigenschaft der Duration abfragst. Siehe hier und in der Gesamtanwendung.

     if (MP_Wecker.NaturalDuration.HasTimeSpan)   // Duration hat einen "Wert"?
          ...
    

    Da if-Anweisungen immer von links nach rechts ausgewertet werden, bricht der Compiler ab, sobald eine Bedingung nicht zutrifft. Du könntest also nach dieser Anweisung (durch && Verbunden) sogar auf den TimeSpan-Wert zugreifen, so wie ich es hier gemacht habe (wenn dann die Duration nicht den Wert Automatic hat!).

     if (!Dp_Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan && MP_Wecker.Position.TotalSeconds < 1)    // Weck-Sound angegeben?
    

    So, nun viel Spaß beim "Durchstöbern"!

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Threading;
    
    namespace Test_LEDUhr
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            #region Initalisierung und Beendigung
            readonly Microsoft.Win32.OpenFileDialog dlgMusik_Datei = new Microsoft.Win32.OpenFileDialog();
            readonly Microsoft.Win32.OpenFileDialog dlgWecker_Datei = new Microsoft.Win32.OpenFileDialog();
            readonly MediaPlayer MP_Musik = new MediaPlayer();
            readonly MediaPlayer MP_Wecker = new MediaPlayer();
            readonly DispatcherTimer Timer1 = new DispatcherTimer();                                            // Timer initalisieren
            KeyValuePair<string, int> KvpWekzeitZaehler = new KeyValuePair<string, int>("", 0);                 // Weckzeit-Zähler initalisieren
    
            #region DP
            public static readonly DependencyProperty AktZeitProperty =
                DependencyProperty.Register("AktZeit", typeof(DateTime), typeof(MainWindow), new PropertyMetadata(DateTime.Now));
    
            private DateTime AktZeit                                                                            // Aktuelle Zeit
            {
                get { return (DateTime)GetValue(AktZeitProperty); }
                set { SetValue(AktZeitProperty, value); }
            }
    
            public static readonly DependencyProperty Dp_Wecker_aktivProperty =
                DependencyProperty.Register("Dp_Wecker_aktiv", typeof(bool), typeof(MainWindow), new PropertyMetadata(false));
    
            private bool Dp_Wecker_aktiv                                                                        // Indikator Wecker aktiv
            {
                get { return (bool)GetValue(Dp_Wecker_aktivProperty); }
                set { SetValue(Dp_Wecker_aktivProperty, value); }
            }
    
            public static readonly DependencyProperty Dp_Musik_aktivProperty =
                DependencyProperty.Register("Dp_Musik_aktiv", typeof(bool), typeof(MainWindow), new PropertyMetadata(false));
    
            private bool Dp_Musik_aktiv                                                                        // Indikator Musik aktiv
            {
                get { return (bool)GetValue(Dp_Musik_aktivProperty); }
                set { SetValue(Dp_Musik_aktivProperty, value); }
            }
    
            // Musik-Volume
            public static readonly DependencyProperty Dp_Musik_VolumeProperty =
                DependencyProperty.Register("Dp_Musik_Volume", typeof(double), typeof(MainWindow), new PropertyMetadata(0.5, new PropertyChangedCallback(Musik_Volume_Aendern)));
    
            private static void Musik_Volume_Aendern(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if ((double)e.NewValue != (double)e.OldValue)
                {
                    ((MainWindow)d).MP_Musik.Volume = (double)e.NewValue;
                }
            }
    
            private double Dp_Musik_Volume                                                                     // Lautstärke der Musik
            {
                get { return (double)GetValue(Dp_Musik_VolumeProperty); }
                set { SetValue(Dp_Musik_VolumeProperty, value); }
            }
    
            // Wecker-Volume
            public static readonly DependencyProperty Dp_Wecker_VolumeProperty =
                DependencyProperty.Register("Dp_Wecker_Volume", typeof(double), typeof(MainWindow), new PropertyMetadata(0.5, new PropertyChangedCallback(Wecker_Volume_Aendern)));
    
            private static void Wecker_Volume_Aendern(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if ((double)e.NewValue != (double)e.OldValue)
                {
                    ((MainWindow)d).MP_Wecker.Volume = (double)e.NewValue;
                }
            }
    
            private double Dp_Wecker_Volume                                                                     // Lautstärke der Musik
            {
                get { return (double)GetValue(Dp_Wecker_VolumeProperty); }
                set { SetValue(Dp_Wecker_VolumeProperty, value); }
            }
    
            #endregion
    
            private void WndMediaPlayer_Loaded(object sender, RoutedEventArgs e)
            {
                // Anfangsverzeichnisse initalisieren
                dlgMusik_Datei.InitialDirectory = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Musik";     // Pfad zu den Musikdateien
                dlgWecker_Datei.InitialDirectory = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Wecker";   // Pfad zu den Weckerdateien
                // Weckzeit initalisieren
                Tbo_Weckzeit_Stunde.Text =  AktZeit.Hour.ToString("00");
                Tbo_Weckzeit_Minute.Text = AktZeit.AddMinutes(1).Minute.ToString("00");
                // Lautstärke
    
                // Timer initalisieren
                Timer1.Tick += new EventHandler(Timer1_Tick);                                       // Timer-Event zuordnen
                Timer1.Interval = new TimeSpan(0, 0, 1);                                            // Event auf 1s setzen
                Timer1.Start();                                                                     // Timer (jetzt) starten
            }
    
            private void WndMediaPlayer_Closed(object sender, EventArgs e)
            {
                Timer1.Stop();                          // Timer beenden
                MP_Musik.Stop(); MP_Musik.Close();      // Musikplayer beenden
                MP_Wecker.Stop(); MP_Wecker.Close();    // Wecker beenden
            }
    
            #endregion
    
            private void Timer1_Tick(object sender, EventArgs e)
            {
                #region Allgemein und Musik
                // Lbl_AktZeit.Content = DateTime.Now.ToString("HH:mm:ss");                        // Zeitanzeige aktualisieren
                AktZeit = DateTime.Now;                                                         // Die aktuelle Zeit + Anzeige aktualisieren (Binding -> LED_UhrControl)
                if (Dp_Musik_aktiv && MP_Musik.NaturalDuration.HasTimeSpan)                     // Musik-Sound aktiviert?
                {
                    if (MP_Musik.Position.TotalSeconds < 1)                                      // Beim ersten Durchlauf einer (neuen) Musik, Endwert aktualisieren
                        PB_Musik.Maximum = MP_Musik.NaturalDuration.TimeSpan.TotalSeconds;
                    PB_Musik.Value = MP_Musik.Position.TotalSeconds;                            // Musikposition aktualisieren
                    Lbl_Musik_Info.Content = Get_MP_Info(MP_Musik);                             // Spielstand des Musik-Sounds aktualisieren
                }
    
                if (MP_Musik.NaturalDuration.HasTimeSpan && MP_Musik.Position == MP_Musik.NaturalDuration.TimeSpan)  // Musik-Sound beendet?
                {
                    Set_Musik_Stop();                                                           // Musikwiedergabe beenden
                }
                #endregion
    
                #region Wecker
                int nWeckStunde = -1;                                                           // Weckzeit Stunden initalisieren
                int nWeckMinute = -1;                                                           // Weckzeit Minuten initalisieren
    
                try
                {
                    nWeckStunde = Convert.ToInt32(Tbo_Weckzeit_Stunde.Text);
                    nWeckMinute = Convert.ToInt32(Tbo_Weckzeit_Minute.Text);
                }
                catch (Exception) { }       // Wenn Eingabewert nicht umgeformt werden konnte, ungültige Werte verwenden -> Weckzeit übergehen
    
                if (AktZeit.Hour == nWeckStunde && AktZeit.Minute == nWeckMinute)   // Weck-Minute erreicht
                {
                    if (!Dp_Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan && MP_Wecker.Position.TotalSeconds < 1)    // Weck-Sound angegeben?
                    {
                        string StrWeckzeit = Tbo_Weckzeit_Stunde.Text + " | " + Tbo_Weckzeit_Minute.Text;                       // Weckzeit 
                        if (!KvpWekzeitZaehler.Key.Contains(StrWeckzeit))                       // Noch kein Weckzeit-Eintrag vorhanden?
                            KvpWekzeitZaehler = new KeyValuePair<string, int>(StrWeckzeit, 0);  // Weckzeit-Eintrag mit Zählerstand 0 setzen
                        if (KvpWekzeitZaehler.Value == 0)                                        // 1. Durchlauf? -> Wecker starten, ansonsten (Beim Folgeaufruf innerhalb der Weck-Minute) nichts machen
                        {
                            Tbo_Weckzeit_Stunde.Background = Brushes.Red; Tbo_Weckzeit_Minute.Background = Brushes.Red;
                            MP_Musik.Pause();                                                   // Musikwiedergabe stoppen
                            MP_Wecker.Play();                                                   // Wecksound wiedergeben
                            Dp_Wecker_aktiv = true;                                             // Indikator Wecker aktiv, setzen
                            KvpWekzeitZaehler = new KeyValuePair<string, int>(StrWeckzeit, 1);  // Weckzeit-Eintrag mit Zählerstand 1 setzen
                            PB_Zeit.Maximum = MP_Wecker.NaturalDuration.TimeSpan.TotalSeconds;  // Wecker, Endwert aktualisieren
                        }
                    }
                }
    
                if (Dp_Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan)                   // Wecker aktiv?
                {
                    PB_Zeit.Value = MP_Wecker.Position.TotalSeconds;                            // Weckerpositionsanzeige aktualisieren
                    Lbl_Wecker_Info.Content = Get_MP_Info(MP_Wecker);                           // Spielstand des Wecker-Sounds aktualisieren
                }
    
                if (Dp_Wecker_aktiv && MP_Wecker.Position == MP_Wecker.NaturalDuration.TimeSpan)// Weck-Sound beendet?
                {
                    Set_Wecker_Stop();
                }
                #endregion Wecker
            }
    
            #region Methoden der Applikation
    
            /// <summary>
            /// Mediaplayer Spielstand-Info
            /// </summary>
            /// <param name="MP">Instanz des Mediaplayers, dessen aktueller Spielstand ermittelt werden soll.</param>
            /// <param name="StrTZ">Trennzeichen zwischen der akt. Position und der Gesamtdauer.</param>
            /// <param name="StrFormat">Format der Medienanzeige. Bei Auto werden so viel Stellen angezeigt wie die Spiellänge es erfordert.</param>
            /// <returns>String, der die aktuelle Position und die Gesamtdauer der Mediadatei ermittelt.</returns>
            private string Get_MP_Info(MediaPlayer MP, string StrFormat = "Auto", string StrTZ = "/")
            {
                string StrInfo = string.Empty;
    
                if (MP.NaturalDuration.HasTimeSpan)      // Medium vorhanden?
                {
                    if (StrFormat == "Auto")
                    {
                        if (MP.NaturalDuration.TimeSpan.TotalMinutes < 60)
                        {
                            if (MP.NaturalDuration.TimeSpan.TotalSeconds < 60) StrFormat = "ss";
                            else StrFormat = "mm:ss";
                        }
                        else StrFormat = "HH:mm:ss";
                    }
                    StrInfo = (DateTime.MinValue + MP.Position).ToString(StrFormat) + StrTZ +
                              (DateTime.MinValue + MP.NaturalDuration.TimeSpan).ToString(StrFormat);
                }
                return StrInfo;
            }
    
            /// <summary>
            /// Musikwiedergabe beenden
            /// </summary>
            void Set_Musik_Stop()
            {
                MP_Musik.Stop();                            // Musiksound anhalten 
                MP_Musik.Position = new TimeSpan(0);        // Musik-Position (wieder) auf Anfang stellen
                MP_Musik.Close();                           // Mediendatei frei geben
                PB_Musik.Value = 0;                         // Musikpositionsanzeige zurücksetzen
                Lbl_Musik_Info.Content = null;              // Spielstand des Musik-Sounds zurück setzen
                Lbl_Musik_Datei.Content = null;             // Musiksound-Dateiname zurück setzen
                Dp_Musik_aktiv = false;                     // Indikator, Musik-Sound aktiv, zurück setzen
            }
    
            /// <summary>
            /// Wecker beenden
            /// </summary>
            void Set_Wecker_Stop(bool Bol_Datei_zuruecksetzen = false)
            {
                Tbo_Weckzeit_Stunde.Background = Brushes.White; Tbo_Weckzeit_Minute.Background = Brushes.White;
                Dp_Wecker_aktiv = false;                    // Indikator Wecker aktiv, zurücksetzen
                MP_Wecker.Stop();                           // Weckersound anhalten 
                MP_Wecker.Position = new TimeSpan(0);       // Wecksound-Position (wieder) auf Anfang stellen
                PB_Zeit.Value = 0;                          // Weckerpositionsanzeige zurücksetzen
                Lbl_Wecker_Info.Content = null;             // Spielstand des Wecker-Sounds zurück setzen
                if (Bol_Datei_zuruecksetzen)                // Soll die Weckdatei deaktiviert werden?
                {
                    Lbl_Wecker_Datei.Content = null;
                    MP_Wecker.Close();
                }
                MP_Musik.Play();                            // Musikwiedergabe fortsetzen
            }
    
            #endregion Methoden der Applikation
    
            #region Bedienelemente
    
            private void Btn_Musik_Datei_Click(object sender, RoutedEventArgs e)
            {
                if (dlgMusik_Datei.ShowDialog() == true)
                {
                    Lbl_Musik_Datei.Content = dlgMusik_Datei.SafeFileName;
                    MP_Musik.Open(new Uri(dlgMusik_Datei.FileName));
                    MP_Musik.Play();
                    Dp_Musik_aktiv = true;                                                     // Indikator, Musik-Sound aktiv, setzen
                }
            }
    
            private void Btn_Wecker_Datei_Click(object sender, RoutedEventArgs e)
            {
                if (dlgWecker_Datei.ShowDialog() == true)
                {
                    Lbl_Wecker_Datei.Content = dlgWecker_Datei.SafeFileName;
                    MP_Wecker.Stop();                                               // Wecker immer stoppen
                    MP_Wecker.Open(new Uri(dlgWecker_Datei.FileName));              // Weck-Sound-Datei laden
                    MP_Wecker.Position = new TimeSpan(0);                           // Weker-Player an Anfang setzen
                }
            }
    
            private void Tbo_Weckzeit_Stunde_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Tbo_Weckzeit_Minute_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Btn_Wecker_Play_Click(object sender, RoutedEventArgs e)
            {
                MP_Wecker.Play();
                Dp_Wecker_aktiv = true;
            }
    
            private void Btn_Wecker_Pause_Click(object sender, RoutedEventArgs e)
            {
                MP_Wecker.Pause();
            }
    
            private void Btn_Wecker_Stop_Click(object sender, RoutedEventArgs e)
            {
                Set_Wecker_Stop(true);      // Einschließlich Weckdatei zurücksetzen
            }
    
            private void Btn_Wecker_Aus_Click(object sender, RoutedEventArgs e)
            {
                Set_Wecker_Stop();
            }
    
            private void Btn_Musik_Play_Click(object sender, RoutedEventArgs e)
            {
                MP_Musik.Play();
                Dp_Musik_aktiv = true;
            }
    
            private void Btn_Musik_Pause_Click(object sender, RoutedEventArgs e)
            {
                MP_Musik.Pause();
            }
    
            private void Btn_Musik_Stop_Click(object sender, RoutedEventArgs e)
            {
                Set_Musik_Stop();    // Musikwiedergabe beenden
            }
            #endregion Bedienelemente
        }
    
        #region IValueConverter
    
        [ValueConversion(typeof(double), typeof(string))]
        public class Double_Prozent_Converter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value is Double && (double)value >= 0 && (double)value <= 1)      // Wert zwischen 0 und 1 ?
                {
                    if ((double)value == 0) return "Aus";
                    if ((double)value == 1) return "Voll";
                    return ((double)value * 100) + "%";
                }
                else return string.Empty; ;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotSupportedException(); // Umkehr-Funktion nicht implementiert 
            }
        }
        #endregion
    
    }
    

    <Window x:Class="Test_LEDUhr.MainWindow" x:Name="WndMediaPlayer"
            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:Test_LEDUhr"
            xmlns:Uhr="clr-namespace:LED_Uhr;assembly=LED_Uhr"
            DataContext="{Binding RelativeSource={RelativeSource Self}}"        
            mc:Ignorable="d" 
            Title="Player-App" Height="300" Width="800" Loaded="WndMediaPlayer_Loaded" Closed="WndMediaPlayer_Closed" 
            WindowStyle="ToolWindow" Background="LightGray">
        <Window.Resources>
            <local:Double_Prozent_Converter x:Key="Dbl_Prozent_Konverter" />
        </Window.Resources>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="10"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Grid.Column="0" Grid.Row="0" Content="Musik-Datei:" VerticalAlignment="Center" />
            <Label Grid.Column="1" Grid.Row="0" x:Name="Lbl_Musik_Datei" VerticalAlignment="Center" Foreground="Blue" FontWeight="Bold"/>
            <StackPanel Grid.Column="2" Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Center" IsEnabled="{Binding Dp_Musik_aktiv}">
                <Slider Name="Sl_Musik_Volume" MinWidth="100" Margin="0,0,5,0" Minimum="0" Maximum="1" Value="{Binding Dp_Musik_Volume}"
                        IsSnapToTickEnabled="True" TickFrequency="0.05" TickPlacement="BottomRight" VerticalAlignment="Center"/>
                <TextBlock Text="{Binding ElementName=Sl_Musik_Volume, Path=Value, Converter={StaticResource Dbl_Prozent_Konverter}}" Foreground="Gray" Margin="0,0,10,0" VerticalAlignment="Center" />
                <Button Name="Btn_Musik_Play" Click="Btn_Musik_Play_Click">
                    <Button.Content>
                        <Canvas Width="48" Height="48">
                            <Path Data="M20,33l12-9l-12-9V33z M24,4C12.95,4,4,12.95,4,24s8.95,20,20,20s20-8.95,20-20S35.05,4,24,4z M24,40c-8.82,0-16-7.18-16-16
                        	c0-8.82,7.18-16,16-16c8.82,0,16,7.18,16,16C40,32.82,32.82,40,24,40z" Fill="Black"/>
                        </Canvas>
                    </Button.Content>
                </Button>
                <Button Name="Btn_Musik_Pause" Click="Btn_Musik_Pause_Click" Margin="5,0,0,0">
                    <Button.Content>
                        <Canvas Width="40" Height="40" Margin="4">
                            <Ellipse Width="40" Height="40" Stroke="Black" StrokeThickness="4" StrokeLineJoin="Round" />
                            <Line Stroke="Black" StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" 
                                  StrokeLineJoin="Round" X1="17" Y1="25" X2="17" Y2="15"/>
                            <Line Stroke="Black" StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" 
                                  StrokeLineJoin="Round" X1="23" Y1="25" X2="23" Y2="15"/>
                        </Canvas>
                    </Button.Content>
                </Button>
                <Button Name="Btn_Musik_Stop" Click="Btn_Musik_Stop_Click" Margin="5,0" >
                    <Button.Content>
                        <Canvas Width="40" Height="40" Margin="4">
                            <Ellipse Width="40" Height="40" Stroke="Black" StrokeThickness="4" />
                            <Rectangle Canvas.Left="12" Canvas.Top="12" Stroke="Black" StrokeThickness="3" StrokeLineJoin="Round" 
                                       StrokeStartLineCap="Round" StrokeEndLineCap="Round" Width="16" Height="16"/>
                        </Canvas>
                    </Button.Content>
                </Button>
            </StackPanel>
            <StackPanel Grid.Column="3" Grid.Row="0" VerticalAlignment="Center" Margin="0,0,3,0">
                <ProgressBar  x:Name="PB_Musik" MinHeight="5"  />
                <Label x:Name="Lbl_Musik_Info" Padding="1"/>
            </StackPanel>
            <Button Grid.Column="4" Grid.Row="0" x:Name="Btn_Musik_Datei" Click="Btn_Musik_Datei_Click" Margin="0,0,3,0">
                <Button.Content>
                    <Canvas Width="48" Height="27" HorizontalAlignment="Center" VerticalAlignment="Top" >
                        <Canvas.RenderTransform>
                            <TransformGroup>
                                <ScaleTransform ScaleX="-0.1" ScaleY="0.1"/>
                                <TranslateTransform Y="-809"/>
                                <RotateTransform Angle="180" />
                            </TransformGroup>
                        </Canvas.RenderTransform>
                        <Path Data="M414.983,8089.403l-1.606-0.786v-24.951v-24.912l-1.196-0.19c-12.251-1.978-16.396-2.725-21.592-3.809
    		            c-13.706-2.915-26.143-6.348-41.089-11.357c-5.454-1.792-10.195-3.398-10.532-3.55c-0.635-0.259-0.669,0.898-0.742,19.648
    		            c-0.112,19.165-0.151,19.946-0.825,20.063c-0.371,0.068-1.348-0.151-2.129-0.527l-1.455-0.635v-20.244v-20.283l-2.319-0.825
    		            c-4.258-1.563-18.076-7.393-25.586-10.752c-15.205-6.875-31.152-14.907-47.363-23.906c-5.303-2.954-6.797-3.623-7.021-3.213
    		            c-0.151,0.298-0.488,3.174-0.708,6.421c-0.225,3.213-0.562,5.977-0.786,6.094c-0.186,0.146-0.898,0.034-1.533-0.225l-1.157-0.488
    		            l-0.112-7.471l-0.078-7.471l-15.796-8.965c-20.171-11.426-31.416-17.627-31.938-17.627c-0.259,0-0.444,0.293-0.444,0.669
    		            c0,0.337-0.522,6.611-1.162,13.896c-1.27,14.268-1.343,14.492-3.325,14.009c-2.837-0.674-37.202-10.762-37.466-10.986
    		            c-0.22-0.22,2.021-27.148,2.915-35.034l0.225-1.904l-7.583-2.988c-8.442-3.325-18.306-6.724-26.372-9.043l-5.342-1.528
    		            l-1.641,1.157c-4.15,2.837-10.01,4.819-14.604,4.858h-1.499l-1.006,7.881l-1.011,7.881l3.999,4.185
    		            c8.403,8.774,12.666,16.655,14.531,26.968c0.933,5.078,0.933,16.807,0.039,21.816c-1.05,5.674-2.021,8.887-3.999,12.881
    		            c-2.539,5.269-6.162,9.155-8.516,9.155c-3.174,0-10.015-9.448-12.554-17.368c-2.051-6.426-2.275-8.481-2.241-19.985
    		            c0.039-9.077,0.19-11.616,0.972-17.148l0.898-6.46l-4.111-3.77c-2.275-2.056-6.685-6.089-9.785-8.892
    		            c-13.037-11.953-17.93-19.238-19.57-29.36l-0.449-2.725h-7.397H45.52l0.19,1.602c0.186,1.46,0.073,1.719-1.011,2.617
    		            c-1.68,1.421-2.837,1.646-4.033,0.747c-0.859-0.64-1.011-1.045-1.011-2.69c0-1.68-0.073-1.904-0.781-1.904
    		            s-0.825,0.264-1.011,2.578c-0.371,4.634-2.612,7.92-6.836,9.971c-3.022,1.494-7.207,1.685-10.347,0.522
    		            c-4.146-1.567-6.982-4.478-7.808-8.14l-0.483-2.017l-2.056,0.259c-1.123,0.151-3.735,0.596-5.791,0.972
    		            c-4.668,0.898-4.668,0.898-4.668-0.151c0-0.781,0.337-0.894,5.718-1.865c3.096-0.562,5.977-1.011,6.313-1.011
    		            c0.63,0,1.265-0.635,0.967-0.972c-0.146-0.146-10.718,1.831-12.324,2.319c-0.522,0.151-0.674-0.039-0.674-0.708
    		            c0-1.045-0.522-0.898,9.302-2.915c4.668-0.933,6.724-1.606,6.274-2.056c-0.073-0.073-3.472,0.635-7.583,1.533
    		            c-4.072,0.933-7.544,1.68-7.695,1.68c-0.186,0-0.298-0.371-0.298-0.825c0-0.781,0.41-0.967,5.156-2.09
    		            c5.898-1.377,15.835-3.438,21.069-4.37c2.573-0.449,3.657-0.82,3.657-1.157c0-0.298-0.337-0.522-0.747-0.522
    		            c-1.235,0-14.531,2.876-22.148,4.819l-6.987,1.758v-0.825c0-0.713,0.337-0.972,1.982-1.455c3.174-0.972,18.037-4.556,22.598-5.493
    		            c3.247-0.669,4.18-0.972,4.111-1.421c-0.078-0.371-0.454-0.522-1.05-0.444c-2.803,0.371-24.204,5.938-26.968,6.987
    		            c-0.522,0.22-0.674,0.073-0.674-0.679c0-0.82,0.298-1.006,3.101-1.904c4.224-1.304,17.334-4.854,21.143-5.713
    		            c1.646-0.376,3.027-0.82,3.027-0.972c0-0.522-2.021-3.252-5.195-6.982c-3.062-3.628-3.584-4.932-1.978-5.156
    		            c0.596-0.078,2.241,1.309,6.499,5.527l5.713,5.64l8.594-1.719c4.741-0.933,11.465-2.09,14.941-2.612
    		            c3.511-0.522,6.87-1.045,7.471-1.157c0.894-0.151,1.455-0.674,2.803-2.842c3.735-5.898,10.156-11.318,16.318-13.672
    		            c4.819-1.865,8.745-2.427,15.244-2.202c3.101,0.112,6.011,0.337,6.538,0.449l0.933,0.225l1.304-10.273
    		            c1.162-9.414,1.235-10.493,0.825-13.296c-0.825-5.64-3.628-9.79-8.066-11.953c-5.083-2.466-11.582-2.168-14.16,0.669
    		            c-0.635,0.713-0.635,0.713,1.084,0.972c8.628,1.157,12.402,10.947,6.685,17.334c-3.662,4.067-8.662,5.078-13.486,2.69
    		            c-3.77-1.831-5.64-4.858-6.011-9.526c-0.41-5.005,1.27-9.414,4.932-13.076c7.769-7.764,20.732-7.729,28.535,0.078
    		            c2.915,2.949,4.336,5.601,5.117,9.712c0.786,4.18,0.635,8.667-0.708,18.789l-1.23,9.15l2.876,1.348
    		            c6.235,2.949,11.689,7.803,14.116,12.583l0.713,1.421l8.218,0.82c23.716,2.427,43.477,6.465,74.219,15.244
    		            c6.802,1.938,12.661,3.618,13.071,3.77c0.713,0.19,0.713,0.19,0.151-0.488c-2.319-2.651-3.511-7.881-2.612-11.201
    		            c0.854-3.14,4.556-6.128,8.325-6.685c4.858-0.752,11.509,1.787,16.064,6.084c4.741,4.482,5.488,6.465,5.566,14.683l0.039,5.527
    		            l1.191,0.371c2.764,0.898,12.998,3.438,13.149,3.286c0.112-0.073,0-0.596-0.225-1.157c-0.63-1.714-0.483-3.213,0.337-3.213
    		            c0.898,0,1.792,1.123,2.988,3.628l0.859,1.904l5.493,1.191c27.119,5.903,55.059,7.437,81.65,4.448
    		            c40.044-4.482,79.678-19.16,116.357-43.071c2.578-1.68,4.893-3.174,5.156-3.359c0.332-0.225,0.449,0.972,0.449,5.454v5.752
    		            l-6.611,3.96c-20.547,12.324-39.302,20.952-60.068,27.676c-24.502,7.954-48.779,11.841-74.443,11.992l-9.824,0.034l1.421,1.089
    		            c2.349,1.826,6.348,6.089,7.432,7.881c0.522,0.933,1.27,2.686,1.646,3.848l0.674,2.129l4.966,0.298
    		            c5.938,0.371,23.086,0.073,30.22-0.483c33.613-2.69,64.883-11.431,96.367-27.007c4.224-2.095,7.773-3.848,7.959-3.921
    		            c0.146-0.078,0.264,2.388,0.264,5.449v5.566l-4.932,2.354c-20.659,9.863-45.61,18.081-65.22,21.514
    		            c-2.09,0.337-3.809,0.747-3.809,0.859s0.781,0.635,1.792,1.162c0.972,0.522,3.359,2.534,5.342,4.478
    		            c3.921,3.926,5.562,6.577,6.313,10.234l0.444,2.168l2.28-0.225c12.212-1.382,37.168-7.915,52.891-13.892
    		            c2.393-0.898,4.448-1.646,4.634-1.646c0.146,0,0.225,2.466,0.186,5.454l-0.112,5.454l-2.988,1.118
    		            c-6.572,2.432-20.879,6.538-30.107,8.667l-1.006,0.225l1.528,2.876c2.949,5.679,4.521,10.386,6.089,18.301
    		            c0.112,0.674,0.337,0.825,1.196,0.674c5.42-0.972,15.503-3.062,19.795-4.106c2.954-0.713,5.42-1.309,5.532-1.309
    		            c0.073,0,0.112,2.466,0.073,5.493l-0.112,5.488l-2.988,0.635c-4.556,1.011-14.453,2.837-19.087,3.55l-4.106,0.596l-0.488,2.28
    		            c-0.259,1.27-0.708,2.764-1.011,3.359c-0.522,0.972-0.483,1.382,0.264,4.487c0.635,2.612,0.82,4.629,0.859,8.438l0.034,4.971
    		            l4.487-0.229c4.292-0.259,16.694-1.416,20.469-1.938l1.758-0.264v5.493c0,2.988-0.039,5.454-0.078,5.454
    		            c-0.073,0-2.617,0.264-5.713,0.557c-3.062,0.303-9.678,0.674-14.683,0.825l-9.077,0.22l-1.719,3.403
    		            c-3.213,6.387-5.713,9.521-15.61,19.648c-12.065,12.363-13.228,14.229-13.262,21.553
    		            C417.859,8090.224,417.522,8090.634,414.983,8089.403z M425.369,8055.673c4.37-2.69,7.241-4.854,10.347-7.808
    		            c2.539-2.354,5.938-6.426,5.64-6.685c-0.073-0.078-3.477-0.337-7.549-0.601c-7.021-0.41-7.432-0.41-7.954,0.264
    		            c-5.078,6.426-7.993,12.7-7.993,17.217v1.982l2.163-1.196C421.184,8058.178,423.611,8056.757,425.369,8055.673z M445.798,8030.756
    		            c0.522-0.596,1.157-7.319,0.933-9.487l-0.186-1.567l-1.792,2.129c-0.972,1.157-3.325,3.623-5.19,5.493
    		            c-2.803,2.725-3.291,3.394-2.764,3.623C438.069,8031.43,445.388,8031.278,445.798,8030.756z M425.588,8025.604
    		            c7.661-4.932,11.211-7.622,13.862-10.649c1.978-2.202,4.404-6.011,4.067-6.387c-0.146-0.107-2.798-0.034-5.938,0.19
    		            c-3.135,0.259-8.853,0.557-12.7,0.669l-7.021,0.264v10.195c0,6.426,0.151,10.239,0.376,10.239
    		            C418.42,8030.126,421.746,8028.104,425.588,8025.604z M413.376,8019.477v-9.824l-2.69-0.225c-1.494-0.112-5.903-0.376-9.824-0.596
    		            c-16.768-1.011-36.528-4.146-54.98-8.779c-3.701-0.933-6.914-1.68-7.173-1.68c-0.298,0-0.41,1.87-0.337,7.021l0.107,6.982
    		            l6.353,2.134c15.278,5.117,34.146,9.824,50.615,12.661c6.011,1.011,17.295,2.5,17.671,2.319
    		            C413.264,8029.413,413.376,8024.892,413.376,8019.477z M333.816,8003.827v-6.909l-4.37-1.348
    		            c-21.104-6.499-41.611-14.492-63.691-24.878l-7.168-3.359l-0.859,1.045c-2.319,2.69-4.224,5.488-3.96,5.752
    		            c0.41,0.376,8.628,4.746,17.666,9.414c12.773,6.572,29.434,14.268,42.397,19.609c6.348,2.578,19.238,7.51,19.722,7.549
    		            C333.704,8010.702,333.816,8007.602,333.816,8003.827z M413.376,7990.863c0-8.779-0.034-9.375-0.635-9.111
    		            c-4.37,1.753-4.746,1.831-10.01,1.831c-4.707,0-5.527-0.112-8.408-1.05c-2.686-0.894-4.146-1.079-9.336-1.382
    		            c-22.378-1.157-28.423-1.753-46.133-4.556c-0.225-0.039-0.41,2.578-0.483,7.095l-0.073,7.173l1.494,0.415
    		            c11.841,3.174,33.096,6.758,47.627,8.027c8.926,0.747,9.634,0.786,18.413,0.859l7.544,0.078V7990.863z M427.571,7999.867
    		            c5.679-0.415,15.352-1.348,17.52-1.753l1.27-0.229l-0.225-3.398c-0.298-4.067-1.23-8.179-3.286-14.229l-1.494-4.521l-6.499,1.196
    		            c-3.589,0.635-8.892,1.494-11.768,1.865l-5.229,0.674v10.386v10.386h2.163C421.184,8000.243,424.583,8000.053,427.571,7999.867z
    		                M111.116,7996.503c1.606-0.972,2.612-3.286,3.359-7.617c1.641-9.785-3.101-20.654-13.521-30.815
    		            c-1.982-1.943-2.056-1.982-2.241-1.123c-0.601,2.876-1.045,8.364-1.011,13.594c0,8.706,0.898,14.048,3.252,19.165
    		            c1.792,3.96,3.735,6.05,6.46,7.021C109.246,7997.401,109.695,7997.362,111.116,7996.503z M333.816,7982.719v-7.056l-2.881-0.635
    		            c-19.16-4.111-37.163-9.414-54.795-16.064c-7.432-2.803-7.432-2.803-7.993-1.978c-0.298,0.41-1.719,2.09-3.14,3.657l-2.539,2.915
    		            l7.212,3.174c15.537,6.875,28.501,11.919,42.358,16.514c6.533,2.163,20.693,6.46,21.514,6.499
    		            C333.704,7989.779,333.816,7986.605,333.816,7982.719z M378.264,7971.405c-3.174-4.785-3.96-9.751-2.393-15.43
    		            c0.19-0.747,0-0.747-13.56-0.747c-7.544,0-16.06-0.146-18.862-0.298l-5.151-0.303v7.251c0,7.246,0,7.28,0.854,7.471
    		            c1.685,0.449,12.554,1.719,19.126,2.314c8.442,0.713,9.712,0.786,15.801,0.859l5.005,0.073L378.264,7971.405z M247.083,7965.985
    		            l-0.117-4.404l-23.306-11.694c-12.813-6.426-23.345-11.655-23.423-11.543c-0.073,0.078-0.22,1.538-0.371,3.286l-0.225,3.145
    		            l7.207,3.809c3.999,2.09,14.57,7.842,23.496,12.773s16.401,8.965,16.548,8.999C247.044,7970.355,247.117,7968.378,247.083,7965.985
    		            z M194.67,7968.788c0.078-0.488,0.522-4.893,0.938-9.824c0.41-4.932,0.859-9.414,0.967-9.971c0.19-0.859,0-1.162-1.04-1.792
    		            c-1.909-1.196-23.086-11.655-28.203-13.936l-4.595-2.056l-0.151,1.196c-0.371,2.28-2.578,27.49-2.427,27.603
    		            c0.073,0.078,3.252,1.011,7.061,2.095c3.809,1.045,11.206,3.174,16.436,4.707c5.229,1.528,9.824,2.764,10.156,2.803
    		            C194.187,7969.613,194.563,7969.237,194.67,7968.788z M333.816,7963.822v-4.673l-1.494,0.747
    		            c-4.819,2.466-11.543,2.505-17.485,0.151c-5.19-2.095-11.504-6.758-13.521-10.01c-0.669-1.162-1.045-1.309-4.409-2.09
    		            c-4.629-1.05-10.83-2.651-17.329-4.521c-2.803-0.786-5.156-1.455-5.269-1.455c-0.073,0-0.259,0.82-0.41,1.865
    		            c-0.151,1.006-0.674,3.135-1.196,4.707c-0.747,2.168-0.859,2.91-0.522,3.135c0.898,0.562,20.806,7.1,26.709,8.779
    		            c10.459,2.988,31.304,7.842,34.292,7.993C333.738,7968.49,333.816,7968.041,333.816,7963.822z M256.531,7958.964
    		            c2.354-1.157,4.746-2.837,5.903-4.072c0.859-0.894,0.859-0.972,0.186-1.191c-0.376-0.151-3.213-1.348-6.24-2.617
    		            c-3.848-1.606-5.601-2.207-5.713-1.87c-0.112,0.264-0.112,2.28-0.073,4.561l0.112,4.072l1.865,1.006
    		            c1.045,0.562,1.943,1.045,2.017,1.045C254.627,7959.896,255.52,7959.486,256.531,7958.964z M247.083,7951.645l-0.117-4.521
    		            l-13.071-5.791c-7.173-3.174-17.48-7.656-22.856-10.01l-9.79-4.219l-0.186,1.943c-0.151,1.045-0.264,2.539-0.337,3.325
    		            l-0.078,1.382l7.661,3.657c4.219,1.978,14.565,7.021,22.974,11.172c8.442,4.106,15.464,7.544,15.61,7.544
    		            C247.044,7956.161,247.117,7954.11,247.083,7951.645z M267.888,7947.538c0.933-2.056,2.275-6.577,2.017-6.841
    		            c-0.225-0.259-18.604-6.572-19.014-6.572c-0.264,0-0.376,1.646-0.298,4.556l0.112,4.595l7.656,3.066
    		            c4.219,1.68,7.881,3.101,8.145,3.101C266.765,7949.442,267.4,7948.583,267.888,7947.538z M197.249,7941.146
    		            c0.527-4.595,1.387-3.774-8.813-8.403c-10.269-4.668-24.429-10.459-24.766-10.127c-0.151,0.117-0.259,1.274-0.298,2.544
    		            l-0.073,2.314l6.533,2.837c3.589,1.572,10.981,5.083,16.436,7.773c5.454,2.725,10.088,4.966,10.308,4.966
    		            C196.799,7943.09,197.102,7942.191,197.249,7941.146z M297.918,7939.54c0-3.022,1.006-5.376,3.14-7.544
    		            c0.82-0.894,1.377-1.606,1.191-1.606c-2.275,0-19.458-3.101-26.294-4.707c-2.129-0.488-3.96-0.859-4.033-0.786
    		            c-0.078,0.078,0.298,1.685,0.781,3.589c0.522,1.865,1.045,4.331,1.162,5.454l0.259,2.056l1.943,0.557
    		            c2.09,0.635,20.093,5.117,21.592,5.381C297.766,7941.933,297.878,7940.888,297.918,7939.54z M247.083,7937.079l-0.117-4.526
    		            l-19.604-7.358c-25.962-9.746-26.26-9.819-26.001-9.15c0.112,0.337,0.225,2.017,0.225,3.735c0,1.724,0.146,3.14,0.337,3.14
    		            c0.41,0,17.144,6.948,33.657,13.97c6.05,2.578,11.167,4.707,11.313,4.707C247.044,7941.596,247.117,7939.579,247.083,7937.079z
    		                M269.568,7930.575c-0.225-1.23-0.747-3.286-1.157-4.595c-0.64-1.904-0.938-2.354-1.758-2.539
    		            c-0.562-0.151-4.258-1.157-8.218-2.241c-3.994-1.118-7.397-2.017-7.583-2.017c-0.562,0-0.41,8.813,0.151,9.263
    		            c0.22,0.186,4.556,1.719,9.6,3.325l9.15,2.988l0.112-0.972C269.939,7933.266,269.827,7931.845,269.568,7930.575z M96.624,7934.237
    		            c0-0.112,0.332-2.988,0.781-6.353c0.41-3.398,0.708-6.196,0.635-6.235c-0.034-0.039-1.23-0.562-2.612-1.123
    		            c-4.746-1.978-8.594-5.19-10.908-9.15c-1.343-2.354-1.528-2.427-7.021-2.837c-2.466-0.186-3.286-0.151-3.286,0.186
    		            c0,0.933,3.247,6.65,5.303,9.336c2.988,3.96,6.089,7.173,11.694,12.144C95.686,7934.198,96.624,7934.872,96.624,7934.237z
    		                M198.372,7929.008c0.186-2.393,0.112-3.101-0.225-3.174c-0.259,0-1.641-0.078-3.101-0.117c-3.101-0.073-5.117-0.967-7.656-3.32
    		            c-1.831-1.719-5.083-3.101-17.144-7.134l-5.942-1.982l-0.264,2.432c-0.146,1.343-0.107,2.578,0.078,2.725
    		            c0.151,0.146,2.91,1.23,6.089,2.427c5.977,2.241,18.677,7.544,24.277,10.161c1.758,0.82,3.291,1.382,3.403,1.27
    		            C198.035,7932.187,198.22,7930.688,198.372,7929.008z M247.083,7922.47l-0.117-4.521l-9.336-2.876
    		            c-5.117-1.602-14.868-4.59-21.665-6.685c-22.822-7.061-35.933-10.61-49.98-13.447c-11.841-2.427-25.283-4.556-34.663-5.488
    		            l-2.5-0.225l0.522,1.943c0.298,1.084,0.596,2.051,0.674,2.163c0.107,0.073,2.764,0.562,5.898,1.05c3.14,0.483,7.471,1.23,9.6,1.641
    		            c3.14,0.596,4.146,0.635,5.415,0.298c2.207-0.596,4.634-0.112,7.173,1.421c1.646,1.011,3.848,1.719,9.453,3.14
    		            c4.033,1.006,10.42,2.725,14.229,3.843c3.813,1.123,7.993,2.129,9.302,2.241c1.758,0.151,2.842,0.488,4.258,1.387
    		            c1.084,0.669,7.061,2.988,13.521,5.269c6.353,2.236,17.373,6.157,24.468,8.701c7.1,2.573,13.11,4.668,13.374,4.668
    		            C247.083,7927.03,247.151,7925.98,247.083,7922.47z M160.681,7924.076c0.151-1.23,0.151-2.388,0.034-2.612
    		            c-0.557-0.859-31.86-10.498-34.209-10.498c-0.337,0-1.162,0.674-1.836,1.494l-1.152,1.455l2.124,0.601
    		            c9.565,2.686,21.665,6.724,29.624,9.863c2.578,1.006,4.78,1.831,4.927,1.865C160.305,7926.278,160.53,7925.272,160.681,7924.076z
    		                M26.023,7918.139c0.708-0.376,1.831-1.46,2.466-2.393c1.157-1.68,2.725-6.426,2.28-6.87c-0.112-0.151-1.572-0.112-3.252,0.039
    		            c-2.954,0.259-3.022,0.293-3.511,1.489c-1.157,2.729-4.443,3.96-6.914,2.544c-1.377-0.825-1.714-0.527-1.191,1.118
    		            C17.092,7917.655,22.698,7919.892,26.023,7918.139z M161.389,7916.156c0.41-2.129,0.376-2.163-1.157-1.606
    		            c-1.904,0.674-3.325,0.64-5.752-0.073c-1.68-0.483-2.505-1.084-4.78-3.398c-2.28-2.354-3.101-2.915-4.668-3.325
    		            c-2.988-0.786-15.054-3.511-15.615-3.511c-0.264,0-0.674,0.562-0.898,1.23c-0.22,0.64-0.518,1.46-0.669,1.758
    		            c-0.186,0.449,0.972,0.859,6.201,2.168c6.313,1.606,20.093,5.64,24.204,7.134C161.018,7917.504,161.13,7917.504,161.389,7916.156z
    		                M184.211,7910.517c0.19-0.522,0-0.747-0.781-1.084c-1.68-0.635-18.936-5.562-19.536-5.562c-0.298,0-0.41,0.22-0.225,0.669
    		            c0.151,0.337,0.449,1.572,0.635,2.729l0.41,2.09l9.38,3.14l9.37,3.135l0.229-2.241
    		            C183.84,7912.162,184.065,7910.854,184.211,7910.517z M109.133,7908.876c1.23-0.298,2.393-0.713,2.544-0.859
    		            c0.146-0.151-1.235-0.562-3.105-0.864c-1.826-0.298-3.359-0.405-3.359-0.298c0,0.151-0.112,0.825-0.225,1.46
    		            c-0.225,1.084-0.186,1.157,0.859,1.157C106.448,7909.472,107.937,7909.208,109.133,7908.876z M99.983,7907.641
    		            c0-0.41,0.112-0.972,0.225-1.27c0.146-0.41-0.298-0.596-1.982-0.781c-1.191-0.151-2.651-0.337-3.286-0.454l-1.118-0.186
    		            l1.084,0.864c1.382,1.118,3.994,2.539,4.59,2.539C99.758,7908.354,99.983,7908.017,99.983,7907.641z M29.495,7906.635
    		            c0.825-0.151,1.387-0.415,1.387-0.747c0-0.635-0.112-0.635-3.999-0.073c-2.28,0.298-3.101,0.557-3.101,0.967
    		            C23.782,7907.304,25.051,7907.304,29.495,7906.635z M82.166,7905.287c-0.112-0.674-0.259-1.304-0.337-1.343
    		            c-0.039-0.073-2.129-0.225-4.595-0.337l-4.482-0.225l0.298,1.084c0.264,1.084,0.303,1.084,4.561,1.494
    		            c2.354,0.225,4.365,0.449,4.517,0.488C82.278,7906.449,82.312,7905.922,82.166,7905.287z M53.215,7905.136l7.173-0.259v-0.933
    		            v-0.898l-4.932,0.225c-12.329,0.635-17.852,1.118-17.852,1.68c0,0.752,0.82,0.864,4.482,0.64
    		            C44.251,7905.473,49.255,7905.253,53.215,7905.136z M117.166,7903.871c0.669-0.859,1.157-1.572,1.084-1.646
    		            c-0.264-0.225-11.953-1.792-12.144-1.646c-0.073,0.112-0.186,0.825-0.259,1.646l-0.078,1.421l4.673,0.82
    		            c2.578,0.444,4.854,0.82,5.117,0.859C115.784,7905.326,116.531,7904.691,117.166,7903.871z M26.921,7903.793
    		            c2.09-0.259,3.359-0.635,3.472-0.933s0.112-0.601,0.039-0.674c-0.151-0.186-4.854,0.562-8.892,1.382
    		            c-1.646,0.337-1.904,0.449-1.309,0.708c0.415,0.19,1.348,0.229,2.056,0.151C22.996,7904.315,25.09,7904.052,26.921,7903.793z
    		                M146.414,7902.113c0.073-1.196,0.112-2.241,0.073-2.28c-0.151-0.186-13.481-2.612-15.127-2.764l-1.309-0.112l-0.112,1.943
    		            c-0.112,1.792-0.034,1.982,0.747,2.168c0.488,0.073,3.735,0.786,7.212,1.533c3.511,0.747,6.421,1.416,6.499,1.489
    		            c0.073,0.078,0.522,0.151,0.972,0.151C146.116,7904.242,146.228,7904.018,146.414,7902.113z M100.842,7901.552
    		            c0.112-0.669,0.073-1.343-0.073-1.494c-0.19-0.186-8.521-1.045-10.347-1.045c-0.449,0-0.415,0.264,0.186,1.455l0.747,1.46
    		            l3.101,0.371c1.719,0.186,3.809,0.376,4.634,0.41C100.579,7902.748,100.657,7902.675,100.842,7901.552z M43.582,7901.854
    		            c3.174-0.303,8.257-0.674,11.279-0.825c5.454-0.259,5.454-0.259,5.64-1.196l0.186-0.933l-4.746,0.259
    		            c-4.517,0.225-18.75,1.685-19.048,1.943c-0.225,0.186,0.298,1.27,0.601,1.27C37.639,7902.372,40.403,7902.113,43.582,7901.854z
    		                M81.677,7899.95v-1.313h-4.668c-4.18,0-4.668,0.078-4.668,0.674c0,1.309,0.562,1.533,4.106,1.685
    		            c1.943,0.034,3.926,0.146,4.409,0.186C81.57,7901.254,81.677,7901.068,81.677,7899.95z M120.525,7897.479
    		            c0.225-0.859,0.337-1.606,0.225-1.714c-0.186-0.19-5.752-0.898-11.279-1.382l-2.651-0.264l-0.225,1.606
    		            c-0.112,0.859-0.186,1.606-0.146,1.68c0.034,0.039,2.949,0.41,6.421,0.859c3.511,0.449,6.426,0.894,6.499,0.972
    		            C119.705,7899.574,120.154,7898.866,120.525,7897.479z M41.897,7898.266c4.634-0.596,17.407-1.87,18.789-1.87
    		            c0.186,0,0.449-0.444,0.562-0.967l0.186-1.011l-3.062,0.264c-5.566,0.444-20.918,2.5-22.524,3.022
    		            c-0.449,0.151-0.264,1.309,0.225,1.309C36.184,7899.013,38.836,7898.676,41.897,7898.266z M101.624,7895.243l0.229-1.348
    		            l-3.965-0.225c-2.202-0.151-4.966-0.264-6.196-0.264h-2.168v1.499v1.489l2.915,0.039c1.567,0.039,4.146,0.151,5.674,0.298
    		            c1.533,0.112,2.915,0.151,3.027,0.039C101.292,7896.659,101.477,7895.985,101.624,7895.243z M82.766,7894.867
    		            c0.225-0.674,0.41-1.27,0.41-1.309c0-0.073-2.207-0.151-4.858-0.151H73.46l-0.371,0.977c-0.225,0.522-0.376,1.118-0.376,1.304
    		            s2.095,0.337,4.824,0.337h4.814L82.766,7894.867z M40.779,7894.716c5.078-0.82,19.683-2.798,20.879-2.798
    		            c0.449,0,1.533-1.831,1.235-2.095c-0.449-0.449-28.691,4.219-29.287,4.858c-0.337,0.337,0.298,0.967,0.972,0.967
    		            C34.91,7895.648,37.712,7895.243,40.779,7894.716z M121.047,7890.722c-0.146-0.898-0.371-1.758-0.522-1.904
    		            c-0.259-0.303-8.027-0.938-11.616-1.011c-1.343,0-1.382,0.039-1.533,1.606c-0.107,0.859-0.146,1.606-0.068,1.68
    		            c0.068,0.151,10.161,1.084,12.397,1.162l1.572,0.034L121.047,7890.722z M80.222,7890.795h4.336l1.006-1.494l1.011-1.528
    		            l-3.477,0.22c-7.28,0.449-8.14,0.596-8.516,1.309c-0.674,1.235-0.483,1.978,0.488,1.719
    		            C75.515,7890.907,77.835,7890.795,80.222,7890.795z M102.224,7890.458c0-0.186,0.112-0.859,0.225-1.494l0.259-1.157h-5.415h-5.381
    		            l-0.635,1.309c-0.332,0.747-0.63,1.421-0.63,1.489c0,0.117,2.612,0.19,5.791,0.19
    		            C99.607,7890.795,102.224,7890.644,102.224,7890.458z M83.919,7885.38l5.049-0.259l3.433-1.685
    		            c3.398-1.719,6.387-2.314,6.724-1.382c0.073,0.225-0.82,0.894-2.017,1.494l-2.168,1.084l3.887,0.112
    		            c2.129,0.039,3.921,0.039,3.994-0.039c0.337-0.298,1.382-9.6,1.162-9.863c-0.64-0.596-8.408-0.557-11.323,0.078
    		            c-5.977,1.27-11.948,5.005-15.049,9.336l-1.27,1.792l1.27-0.22C78.318,7885.712,81.155,7885.492,83.919,7885.38z M119.031,7884.892
    		            c0-0.522-2.017-3.135-3.398-4.443c-1.382-1.27-5.488-3.848-6.162-3.848c-0.259,0-0.596,1.382-0.859,3.286
    		            c-0.635,5.156-0.747,4.858,1.753,5.044C114.851,7885.189,119.031,7885.189,119.031,7884.892z" Fill="Black"></Path>
                        <Path Data="M37.341,7921.947c-0.82-0.82-0.898-1.157-0.708-2.5c0.337-2.095,1.494-3.252,3.208-3.252c2.319,0,3.965,2.319,3.027,4.331
    		                c-0.483,1.084-2.505,2.393-3.696,2.393C38.689,7922.919,37.903,7922.47,37.341,7921.947z" Fill="Black"></Path>
                    </Canvas>
                </Button.Content>
            </Button>
            <Label Grid.Column="0" Grid.Row="2" Content="Wecker-Datei:" VerticalAlignment="Center" />
            <Label Grid.Column="1" Grid.Row="2" x:Name="Lbl_Wecker_Datei" VerticalAlignment="Center" Foreground="Blue" FontWeight="Bold" />
            <Button Grid.Column="4" Grid.Row="2" x:Name="Btn_Wecker_Datei" Click="Btn_Wecker_Datei_Click" >
                <Button.Content>
                    <StackPanel Orientation="Horizontal">
                        <Canvas Width="27" Height="28" HorizontalAlignment="Center" VerticalAlignment="Bottom">
                            <Path Data="M24.164,12.808c0-6.007-4.872-10.884-10.884-10.884c-6.012,0-10.878,4.872-10.878,10.884c0,3.759,1.899,7.08,4.81,9.047
            				l-4.023,4.787c-0.197,0.242-0.174,0.567,0.067,0.765c0.208,0.207,0.606,0.151,0.765-0.068l4.129-4.917 
    		        		c1.529,0.809,3.275,1.287,5.135,1.287c1.86,0,3.608-0.46,5.137-1.287l4.129,4.917c0.275,0.275,0.601,0.225,0.764,0.068
    				        c0.242-0.197,0.265-0.545,0.068-0.765l-4.023-4.787C22.264,19.887,24.164,16.589,24.164,12.808z M13.28,21.461
    				        c-4.787,0-8.653-3.866-8.653-8.653s3.866-8.653,8.653-8.653s8.654,3.866,8.654,8.653S18.067,21.461,13.28,21.461z" Fill="Black"/>
                            <Path Data="M25.237,1.311c-1.77-1.747-4.63-1.747-6.383,0l6.383,6.383C26.984,5.947,26.984,3.081,25.237,1.311z" Fill="Black"></Path>
                            <Path Data="M1.327,1.311c-1.77,1.77-1.77,4.614,0,6.383l6.384-6.383C5.964-0.437,3.098-0.437,1.327,1.311z" Fill="Black"/>
                            <Path Data="M17.213,14.184l-3.389-1.702V5.795c0-0.303-0.242-0.545-0.545-0.545c-0.304,0-0.545,0.242-0.545,0.545v7.013
            				c0,0.197,0.106,0.393,0.303,0.483l3.692,1.86c0.27,0.129,0.607,0.045,0.719-0.241C17.589,14.662,17.477,14.313,17.213,14.184z" Fill="Black"/>
                        </Canvas>
                    </StackPanel>
                </Button.Content>
            </Button>
            <StackPanel Grid.Column="2" Grid.Row="2" Orientation="Horizontal" VerticalAlignment="Center" IsEnabled="{Binding Dp_Wecker_aktiv}">
                <Slider Name="Sl_Wecker_Volume" MinWidth="100" Margin="0,0,5,0" Minimum="0" Maximum="1" Value="{Binding Dp_Wecker_Volume}" 
                        IsSnapToTickEnabled="True" TickFrequency="0.05" TickPlacement="BottomRight" VerticalAlignment="Center"/>
                <TextBlock Text="{Binding ElementName=Sl_Wecker_Volume, Path=Value, Converter={StaticResource Dbl_Prozent_Konverter}}" Foreground="Gray" Margin="0,0,10,0" VerticalAlignment="Center" />
                <Button Name="Btn_Wecker_Play" Click="Btn_Wecker_Play_Click">
                    <Button.Content>
                        <Canvas Width="48" Height="48">
                            <Path Data="M20,33l12-9l-12-9V33z M24,4C12.95,4,4,12.95,4,24s8.95,20,20,20s20-8.95,20-20S35.05,4,24,4z M24,40c-8.82,0-16-7.18-16-16
                        	c0-8.82,7.18-16,16-16c8.82,0,16,7.18,16,16C40,32.82,32.82,40,24,40z" Fill="Black"/>
                        </Canvas>
                    </Button.Content>
                </Button>
                <Button Name="Btn_Wecker_Pause" Click="Btn_Wecker_Pause_Click" Margin="5,0,0,0">
                    <Button.Content>
                        <Canvas Width="40" Height="40" Margin="4">
                            <Ellipse Width="40" Height="40" Stroke="Black" StrokeThickness="4" StrokeLineJoin="Round" />
                            <Line Stroke="Black" StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" 
                                  StrokeLineJoin="Round" X1="17" Y1="25" X2="17" Y2="15"/>
                            <Line Stroke="Black" StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" 
                                  StrokeLineJoin="Round" X1="23" Y1="25" X2="23" Y2="15"/>
                        </Canvas>
                    </Button.Content>
                </Button>
                <Button Name="Btn_Wecker_Stop" Click="Btn_Wecker_Stop_Click" Margin="5,0">
                    <Button.Content>
                        <Canvas Width="40" Height="40" Margin="4">
                            <Ellipse Width="40" Height="40" Stroke="Black" StrokeThickness="4" />
                            <Rectangle Canvas.Left="12" Canvas.Top="12" Stroke="Black" StrokeThickness="3" StrokeLineJoin="Round" 
                                       StrokeStartLineCap="Round" StrokeEndLineCap="Round" Width="16" Height="16"/>
                        </Canvas>
                    </Button.Content>
                </Button>
            </StackPanel>
            <StackPanel Grid.Column="3" Grid.Row="2" VerticalAlignment="Center" Margin="0,0,3,0">
                <ProgressBar  x:Name="PB_Zeit" MinHeight="5" Foreground="Red"/>
                <Label x:Name="Lbl_Wecker_Info" />
            </StackPanel>
            <StackPanel Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,10,0,0">
                <Uhr:LED_UhrControl x:Name="luc_LED_Uhr" Time="{Binding AktZeit}" />
                <!--<Label Name="Lbl_AktZeit" Content="00:00:00" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"/>-->
            </StackPanel>
            <Button Grid.Column="2" Grid.Row="3" x:Name="Btn_Wecker_Aus" Click="Btn_Wecker_Aus_Click" Margin="5,10,5,0" ToolTip="Wecker Aus!" 
                    MinWidth="50" Height="{Binding ElementName=luc_LED_Uhr, Path=ActualHeight}" MinHeight="80" VerticalAlignment="Top" HorizontalAlignment="Center" >
                <Button.Content>
                    <Viewbox Margin="5">
                        <Canvas Width="24" Height="24">
                            <Path Data="M8.56,2.9c3.367-1.9,7.637-0.71,9.536,2.657C18.689,6.607,19,7.793,19,9v4 M17,17H2c1.657,0,3-1.344,3-3V9C4.999,7.88,5.266,6.775,5.78,5.78
    	                    M13.73,21c-0.555,0.955-1.778,1.281-2.734,0.727c-0.301-0.175-0.552-0.426-0.727-0.727" Fill="Black"></Path>
                            <Line StrokeThickness="2" StrokeLineJoin="Round"  Stroke="Black" StrokeStartLineCap="Round" StrokeEndLineCap="Round"  X1="1" Y1="1" X2="23" Y2="23"/>
                            <Polygon Stroke="Black" StrokeThickness="0.8" Points="0,0 24,0 24,24 0,24 0,0"  />
                        </Canvas>
                    </Viewbox>
                </Button.Content>
            </Button>
            <StackPanel Grid.Column="3" Grid.Row="3" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center">
                <Label DockPanel.Dock="Top"  Content="Weckzeit:" VerticalAlignment="Center"/>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                    <TextBox x:Name="Tbo_Weckzeit_Stunde" Width="23" Text="00"  PreviewTextInput="Tbo_Weckzeit_Stunde_PreviewTextInput" MaxLength="2" FontSize="16" />
                    <Label Content=":" Padding="1" />
                    <TextBox x:Name="Tbo_Weckzeit_Minute" Width="23" Text="00" PreviewTextInput="Tbo_Weckzeit_Minute_PreviewTextInput" MaxLength="2" FontSize="16"/>
                </StackPanel>
            </StackPanel>
        </Grid>
    </Window>

    • Als Antwort markiert ch.f.1 vor 9 Stunden 36 Minuten
    vor 11 Stunden 48 Minuten

Alle Antworten

  • Hi,
    wenn Timer_Tick von einer Timer-Instanz aufgerufen wird, so läuft diese Methode üblicherweise in einem anderen Thread. Wenn dann TimeSlider, lbl... zum Main-Thread gehörende Steuerelemente sind, knallt es wegen thread-übergreifendem Zugriff. Das musst du "entflechten", indem diese Zugriffe mit geeigneten Methoden (async, Dispatcher, SynchronizationContext o.ä.) in den Haupt-Thread (UI-Thread) "umgelenkt" werden.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Montag, 5. April 2021 13:01
  • Vielen Dank für Deine Antwort.

    Die Lösung klingt einfach, ist es aber für mich nicht.

    Leider verstehe ich noch nichts von den empfohlenen Methoden (async). Ich weiß, es ist eine große Wissenslücke...damals in Windows.Forms brauchte ich es noch nicht.

    Bitte nochmals um Hilfe, denn ich möchte die Anwendung gerne erweitern, sobald dieses Problem keines mehr ist.

    Montag, 5. April 2021 15:58
  • Hallo ch.f.1!

    Ich bin mir nicht ganz sicher ob ich dein Problem jetzt richtig verstanden habe, aber ich glaube es liegt nicht am Zugriff des Dispatcher-Threads auf den GUI-Thread sondern am "umschalten" bzw. Verwalten der/des Mediaplayer.

    Ich habe auch als erstes zwei Mediaplayer eingesetzt und hatte dabei keine Probleme die GUI durch einen Dispatcher-Thread zu aktualisieren. Wohl aber bei der Umschaltung, bzw. Benutzung des zweiten Mediaplayers. Im Debugger hat es noch ganz gut funktioniert, zur Laufzeit war es aber nicht zu steuern und lief oft in eine Endlosschleife, in der nichts mehr passierte.

    Meine (kleine) Lösung basiert auf dem Wechsel der Source eines Mediaplayers bei der problemlos die GUI aktualisiert werden kann. Zur Probe lasse ich ein Lied immer 15 Sekunden laufen und schalte dann auf ein zweites Lied um, um nach 15 Sekunden wieder das erste Lied aufzurufen. Die Funktionalität kannst du ja nach deinen Anforderungen gestalten.

    <Window x:Class="MusikPlayer.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"
            mc:Ignorable="d" Title="Musikplayer" Height="100" Width="300">
        <DockPanel>
            <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom">
                <Label  Content="Lied:"/>
                <Label  x:Name="LblPlayer"/>
                <Label  x:Name="LblZeit" Content="Zeit:"/>
                <ProgressBar x:Name="PRBZeit" MinWidth="50" MinHeight="5" VerticalAlignment="Center" />
            </StackPanel>
            <Button x:Name="BtnPlay" Content="Play" Click="BtnPlay_Click"  />
            <Button x:Name="BtnStop" Content="Stop" Click="BtnStop_Click"  />
        </DockPanel>
    </Window>
    

    Code Behind:

    using System;
    using System.IO;
    using System.Windows;
    using System.Windows.Media;
    using System.Windows.Threading;
    
    namespace MusikPlayer
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            readonly MediaPlayer mplayer1 = new MediaPlayer();              // Mediaplayer1 initalisieren
            readonly DispatcherTimer Timer1 = new DispatcherTimer();        // Timer initalisieren
            readonly string StrMusikPfad = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Musik";    // Pfad zu den Musikdateien
            string StrAnzeige = string.Empty;                               // Anzeige initalisieren
            string StrPlayer = "1";                                         // Player initalisieren
            Duration Spielzeit = new Duration(new TimeSpan(0, 0, 1));       // Spielzeit initalisieren
    
    
            private void BtnPlay_Click(object sender, RoutedEventArgs e)
            {
                mplayer1.Open(new Uri(Path.Combine(StrMusikPfad, "myMusik.mp3"), UriKind.Relative));
                mplayer1.Play();
                Timer1.Tick += new EventHandler(Timer1_Tick);               // Timer-Event zuordnen
                Timer1.Interval = new TimeSpan(0, 0, 1);                    // Event auf 1s setzen
                Timer1.Start();                                             // Timer (jetzt) starten
            }
    
            private void Timer1_Tick(object sender, EventArgs e)
            {
                if (mplayer1.NaturalDuration.HasTimeSpan)                                                               // Player 1 aktiv?
                {
                    StrAnzeige = mplayer1.Position.ToString(@"mm\:ss");                                                 // Spiel- und Restdauer anzeigen
                    StrAnzeige += " / " + mplayer1.NaturalDuration.Subtract(mplayer1.Position).TimeSpan.ToString(@"mm\:ss");
                    Spielzeit = mplayer1.Position;                                                                      // Spielzeit Player 1
                    // PRBZeit.Maximum = mplayer1.NaturalDuration.TimeSpan.TotalSeconds;
                    PRBZeit.Maximum = 15;
                    PRBZeit.Value = mplayer1.Position.TotalSeconds;
                }
                LblZeit.Content = StrAnzeige;                                                                           // Restdauer anzeigen
                LblPlayer.Content = StrPlayer;                                                                          // Aktiven Player anzeigen
                
                if (Spielzeit.HasTimeSpan && Spielzeit.TimeSpan.Seconds > 15)                                           // Bei mehr als 15s Spielzeit Lied umschalten
                {
                    mplayer1.Stop(); mplayer1.Close();                                                                  // Medien freigeben, Player beenden
                    if (StrPlayer == "1")                                                                               // Wenn Player 1 aktiv war, dann Player 2 aktivieren
                    {
                        mplayer1.Open(new Uri(Path.Combine(StrMusikPfad, "myMusik2.mp3"), UriKind.Relative));           // Player 2 Lied laden
                        StrPlayer = "2";                                                                                // Player 2 aktiv
                    }
                    else
                    {
                        mplayer1.Open(new Uri(Path.Combine(StrMusikPfad, "myMusik.mp3"), UriKind.Relative));            // Player 1 Lied laden
                        StrPlayer = "1";                                                                                // Player 2 aktiv
                    }
                    mplayer1.Play();                                                                                    // Player 2 starten
                    // PRBZeit.Maximum = mplayer1.NaturalDuration.TimeSpan.TotalSeconds;  // Kann an der Stelle nicht definiert werden, da die Mediendatei oft noch nicht vollständig geladen wurde! 
                }
            }
    
            private void BtnStop_Click(object sender, RoutedEventArgs e)
            {
                Timer1.Stop();
                mplayer1.Stop(); 
                mplayer1.Close();
            }
        }
    }
    

    Im Beispiel sind die Mediadateien in einem Projektverzeichnis Musik.

    Noch ein Hinweis. Der Wechsel zwischen MP3 und MP4 Dateien funktioniert nicht zuverlässig. Zwischen MP3 Dateien ist alles ok.

      

    Dienstag, 6. April 2021 16:49
  • Hallo perlfred

    Auch an Dich vielen Dank und für Deine Mühe

    Ich weiß nun, dass ich viele Fehler gemacht habe.

    In diesem Projekt wollte ich zwei MediaPlayer (einen nur zum Anspielen von Musik-Dateien, einen als Wecker), die unabhängig voneinander verwendbar sind.

    Beide MediaPlayer öffnen jeweils einen eigenen OpenFileDialog (wird später noch geändert (auf im Code eingestellte Klingeltöne für MediaPlayer2).

    Wenn ich den OpenfileDialog für MediaPlayer1 öffne (ohne ihn zu starten), kann ich auch mit MediaPlayer2 weiterarbeiten, ohne, dass etwas passiert. Öffne ich aber zuerst OpenfileDialog2 für MediaPlayer2 und versuche MediaPlayer2 zu starten (nach dem Einstellen der Weckzeit), gibt es Probleme.

    Bei mir spielen beide Player mp3, mp4, wma, wmv, m4a, wav und weitere Dateien (außer flv) ohne Beanstandung ab.

    Einen Screenshot mit weiteren Erklärungen einfügen, funktioniert leider nicht.



    • Bearbeitet ch.f.1 Dienstag, 6. April 2021 20:11
    Dienstag, 6. April 2021 18:47
  • Ich habe jetzt zweimal versucht, den Code hier im Beitrag in eine lesbare Form (Zeilenumbruch) zu bringen, auch die Abstände zu verringern.

    Es geht nicht. Irgendwann haben einzelne Zeichen mehr als die doppelte Größe.

    Dienstag, 6. April 2021 19:41
  • Noch ein Versuch, ich hoffe es ist besser lesbar

    using Microsoft.Win32;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Threading;
    using System.Windows.Forms;
    
    
    namespace MusicApp2
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
           
    
            public MainWindow()
            {
                InitializeComponent();
                string ImgPath = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.ToString()}\\Images\\Note3a.png";
            }
            string filename;
            string filemusic;
            MediaPlayer mediaPlayer = new MediaPlayer();
            MediaPlayer mediaPlayer2 = new MediaPlayer();
            DispatcherTimer dispatcherTimer = new DispatcherTimer();
         //   DispatcherTimer timer1 = new DispatcherTimer();
         //   DispatcherTimer timer2 = new DispatcherTimer();
    
    
            void Timer_Tick(object sender, EventArgs e)
            { 
               try
                {
                    TimerSlider.Value = mediaPlayer.Position.TotalSeconds;
                    lblCurrenttime.Text = mediaPlayer.Position.ToString(@"mm\:ss");
                    lblMusiclength.Text = mediaPlayer.NaturalDuration.TimeSpan.ToString(@"mm\:ss");
                    lblCountdown.Text = mediaPlayer.NaturalDuration.Subtract(mediaPlayer.Position).TimeSpan.ToString(@"mm\:ss");
                    
                   
                    lblTime.Text = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00") + ":" + DateTime.Now.Second.ToString("00");
    
                    if (lblTime.Text == lblAlarm.Text)
                    {
                        mediaPlayer2.Play();
                    }
                }
                catch
                {
                    Exception exception = new Exception();
                    System.Windows.MessageBox.Show(exception.ToString()); 
                }
            }
           
            private void Card_MouseDown(object sender, MouseButtonEventArgs e)
            {
                try
                {
                    DragMove();
                }
                catch (Exception exception)
                {
                    System.Windows.MessageBox.Show(exception.ToString());
                }
            }
    
            private void BtnClose_Click(object sender, RoutedEventArgs e)
            {
                System.Windows.Application.Current.Shutdown();
            }
    
            private void BtnFile_Click(object sender, RoutedEventArgs e)
            {
                if(lblCountdown.Text == "00:00")
                {
                //    dispatcherTimer.Stop();
                }
    
                Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog();
                bool? dialog_ok = openFileDialog.ShowDialog();
                if (dialog_ok==true)
                {
                    filename = openFileDialog.FileName;
                    lblFile.Text = openFileDialog.SafeFileName;
                    mediaPlayer.Open(new Uri(filename));
                }
            }
    
            private void BtnPlay_Click(object sender, RoutedEventArgs e)
            {
               // System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
               // dispatcherTimer = new DispatcherTimer();
                dispatcherTimer.Tick += new EventHandler(Timer_Tick);
                dispatcherTimer.Interval = TimeSpan.FromSeconds(1);
                dispatcherTimer.Start();
                
                mediaPlayer.Play();
            }
    
            private void BtnPause_Click(object sender, RoutedEventArgs e)
            {
                mediaPlayer.Pause();
            }
    
            private void BtnStop_Click(object sender, RoutedEventArgs e)
            {
                mediaPlayer.Stop();
                dispatcherTimer.Stop();
                lblMusiclength.Text = "0:00";
                lblCountdown.Text = "0:00";
                lblCurrenttime.Text = "0:00";
                TimerSlider.Value = 0;
                
            }
    
            private void VolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
            {
                mediaPlayer.Volume = VolumeSlider.Value;
                VolumeTextbox.Text = VolumeSlider.Value.ToString("0.##");
                if (VolumeTextbox.Text == "0,02" || VolumeTextbox.Text == "0,03" || VolumeTextbox.Text == "0,05" || VolumeTextbox.Text == "0,1" || VolumeTextbox.Text == "0,2" || VolumeTextbox.Text == "0,3" || VolumeTextbox.Text == "0,4" || VolumeTextbox.Text == "0,45" || VolumeTextbox.Text == "0,48" || VolumeTextbox.Text == "0,49")
                {
                    btnVolumeMedium.Visibility = Visibility.Visible;
                    btnVolumeMute.Visibility = Visibility.Collapsed;
                    btnVolumeHigh.Visibility = Visibility.Collapsed;
                }
                if (VolumeTextbox.Text == "0")
                {
                    btnVolumeMute.Visibility = Visibility.Visible;
                    btnVolumeMedium.Visibility = Visibility.Collapsed;
                    btnVolumeHigh.Visibility = Visibility.Collapsed;
                }
                if (VolumeTextbox.Text == "0,5" || VolumeTextbox.Text == "0,51" || VolumeTextbox.Text == "0,52" || VolumeTextbox.Text == "0,53" || VolumeTextbox.Text == "0,55" || VolumeTextbox.Text == "0,6" || VolumeTextbox.Text == "0,65" || VolumeTextbox.Text == "0,7" || VolumeTextbox.Text == "0,8" || VolumeTextbox.Text == "0,9")
                {
                    btnVolumeHigh.Visibility = Visibility.Visible;
                    btnVolumeMute.Visibility = Visibility.Collapsed;
                    btnVolumeMedium.Visibility = Visibility.Collapsed;
                }
            }
    
            private void MediaPlayer_MediaOpened (object sender, RoutedEventArgs e)
            {
                TimeSpan timeSpan = TimeSpan.FromMilliseconds(mediaPlayer.NaturalDuration.TimeSpan.TotalMilliseconds);
                timeSpan = mediaPlayer.NaturalDuration.TimeSpan;
                TimerSlider.TickFrequency = timeSpan.TotalSeconds;
            }
    
            private void TimerSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
            {
                try
                {
                    TimeSpan timeSpan = TimeSpan.FromSeconds(e.NewValue);
                    mediaPlayer.Position = timeSpan;
                    timeSpan = mediaPlayer.NaturalDuration.TimeSpan;
                    TimerSlider.Maximum = timeSpan.TotalSeconds;
                }
                catch
                {
                    Exception exception = new Exception();
                    System.Windows.MessageBox.Show(exception.ToString());
                }
              
            }
    
            private void BtnMusicFile_Click(object sender, RoutedEventArgs e)
            {
                Microsoft.Win32.OpenFileDialog openFileDialog2 = new Microsoft.Win32.OpenFileDialog();
                bool? dialogOK = openFileDialog2.ShowDialog();
                if (dialogOK == true)
                {
                    filemusic = openFileDialog2.FileName;
                    textBoxFile.Text = openFileDialog2.SafeFileName;
                    mediaPlayer2.Open(new Uri(filemusic));
                }
            }
    
            private void BtnAlarm_Click(object sender, RoutedEventArgs e)
            {
                dispatcherTimer.Tick += new EventHandler(Timer_Tick);
                dispatcherTimer.Interval = TimeSpan.FromSeconds(1);
                dispatcherTimer.Start();
                       
                System.Windows.MessageBox.Show (" Plays the selected sound at " + lblAlarm.Text, filemusic.ToString(), MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
            }
    
            private void BtnAlarmStop_Click(object sender, RoutedEventArgs e)
            {
                mediaPlayer2.Stop();
            }
    
            private void BtnTextMove_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    lblAlarm.Text = textBoxTime.Text;
                    textBoxTime.Text = "";
                }
                catch
                {
                    Exception exception = new Exception();
                    System.Windows.MessageBox.Show(exception.ToString());
                }
            }
    
            private void BtnAlarm_MouseUp(object sender, MouseButtonEventArgs e)
            {
               
            }
        }
    }
    

    Dienstag, 6. April 2021 20:26
  • Hallo ch.f.1!

    Ich habe gerade keine Zeit mehr.

    Du müsstest deine Fragen konkreter stellen. Ich habe dir mal ein Grundgerüst nach deiner Fragestellung: 

    In diesem Projekt wollte ich zwei MediaPlayer (einen nur zum Anspielen von Musik-Dateien, einen als Wecker), die unabhängig voneinander verwendbar sind.

    gebaut. Funktioniert auch problemlos, solang die Weck-Melodie größer als 1 Minute ist. Kleiner bekommt man auch hin, wenn an der Logik noch etwas gearbeitet wird.

    Sieh es dir mal in Ruhe an. 

    using System;
    using System.IO;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Threading;
    
    namespace MusicApp2
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            readonly Microsoft.Win32.OpenFileDialog dlgMusik_Datei = new Microsoft.Win32.OpenFileDialog();
            readonly Microsoft.Win32.OpenFileDialog dlgWecker_Datei = new Microsoft.Win32.OpenFileDialog();
            readonly MediaPlayer MP_Musik = new MediaPlayer();
            readonly MediaPlayer MP_Wecker = new MediaPlayer();
            readonly DispatcherTimer Timer1 = new DispatcherTimer();                                            // Timer initalisieren
            bool Wecker_aktiv = false;                                                                          // Indikator Wecker aktiv initalisieren
    
    
            private void WndMediaPlayer_Loaded(object sender, RoutedEventArgs e)
            {
                // Anfangsverzeichnisse initalisieren
                dlgMusik_Datei.InitialDirectory = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Musik";     // Pfad zu den Musikdateien
                dlgWecker_Datei.InitialDirectory = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Wecker";   // Pfad zu den Weckerdateien
                // Weckzeit initalisieren
                Tbo_Weckzeit_Stunde.Text = DateTime.Now.Hour.ToString("00");
                Tbo_Weckzeit_Minute.Text = DateTime.Now.AddMinutes(2).Minute.ToString("00");
                // Timer initalisieren
                Timer1.Tick += new EventHandler(Timer1_Tick);                                       // Timer-Event zuordnen
                Timer1.Interval = new TimeSpan(0, 0, 1);                                            // Event auf 1s setzen
                Timer1.Start();                                                                     // Timer (jetzt) starten
            }
    
            private void Btn_Musik_Datei_Click(object sender, RoutedEventArgs e)
            {
                if (dlgMusik_Datei.ShowDialog() == true)
                {
                    Lbl_Musik_Datei.Content = dlgMusik_Datei.SafeFileName;
                    MP_Musik.Open(new Uri(dlgMusik_Datei.FileName));
                    MP_Musik.Play();
                }
            }
    
            private void Btn_Wecker_Datei_Click(object sender, RoutedEventArgs e)
            {
                if (dlgWecker_Datei.ShowDialog() == true)
                {
                    Lbl_Wecker_Datei.Content = dlgWecker_Datei.SafeFileName;
                    MP_Wecker.Open(new Uri(dlgWecker_Datei.FileName));
                }
            }
    
            private void Tbo_Weckzeit_Stunde_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Tbo_Weckzeit_Minute_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Tbo_Weckzeit_Sekunde_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Btn_Stop_Click(object sender, RoutedEventArgs e)
            {
                Timer1.Stop();
                MP_Musik.Stop(); MP_Musik.Close();
                MP_Wecker.Stop(); MP_Wecker.Close();
            }
    
            private void Timer1_Tick(object sender, EventArgs e)
            {
                Lbl_AktZeit.Content = DateTime.Now.ToString("HH:mm:ss");
    
                if (DateTime.Now.Hour == Convert.ToInt32(Tbo_Weckzeit_Stunde.Text) &&
                    DateTime.Now.Minute == Convert.ToInt32(Tbo_Weckzeit_Minute.Text))      // Weck-Minute erreicht
                {
                    if (!Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan && MP_Wecker.Position.TotalSeconds == 0)    // Weck-Sound angegeben?
                    {
                        Tbo_Weckzeit_Stunde.Background = Brushes.Red; Tbo_Weckzeit_Minute.Background = Brushes.Red;
                        MP_Musik.Pause();                       // Musikwiedergabe stoppen
                        MP_Wecker.Play();                       // Wecksound wiedergeben
                        Wecker_aktiv = true;                    // Indikator Wecker aktiv, setzen
                    }
                }
                if (Wecker_aktiv && MP_Wecker.Position == MP_Wecker.NaturalDuration.TimeSpan) // Weck-Sound beendet?
                {
                    Tbo_Weckzeit_Stunde.Background = Brushes.White; Tbo_Weckzeit_Minute.Background = Brushes.White;
                    Wecker_aktiv = false;                       // Indikator Wecker aktiv, zurücksetzen
                    MP_Wecker.Stop();                           // Weckersound anhalten 
                    MP_Wecker.Position = new TimeSpan(0);       // Wecksound-Position (wieder) auf Anfang stellen
                    MP_Musik.Play();                            // Musikwiedergabe fortsetzen
                }
            }
        }
    }
    

    <Window x:Name="WndMediaPlayer" x:Class="MusicApp2.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"
            mc:Ignorable="d" 
            Title="MainWindow" Height="150" Width="600" Loaded="WndMediaPlayer_Loaded">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Grid.Column="0" Grid.Row="0" Content="Musik-Datei (Player 1)" />
            <Label Grid.Column="1" Grid.Row="0" x:Name="Lbl_Musik_Datei"/>
            <Button Grid.Column="2" Grid.Row="0" x:Name="Btn_Musik_Datei" Content="Auswahl" Click="Btn_Musik_Datei_Click" />
            <Label Grid.Column="0" Grid.Row="1" Content="Wecker-Datei (Player 2)" />
            <Label Grid.Column="1" Grid.Row="1" x:Name="Lbl_Wecker_Datei" />
            <Button Grid.Column="2" Grid.Row="1" x:Name="Btn_Wecker_Datei" Content="Auswahl" Click="Btn_Wecker_Datei_Click" />
            <Label Grid.Column="0" Grid.Row="2" Name="lblTest" Content="Weckzeit"/>
            <StackPanel Orientation="Horizontal" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,3,0,0">
                <TextBox x:Name="Tbo_Weckzeit_Stunde" Width="25" Text="00"  PreviewTextInput="Tbo_Weckzeit_Stunde_PreviewTextInput" MaxLength="2" />
                <Label Content=":" Padding="0" />
                <TextBox x:Name="Tbo_Weckzeit_Minute" Width="25" Text="00" PreviewTextInput="Tbo_Weckzeit_Minute_PreviewTextInput" MaxLength="2"/>
            </StackPanel>
            <Label Grid.Column="2" Grid.Row="2" Name="Lbl_AktZeit" Content="00:00:00" Foreground="Gray"/>
            <Button x:Name="Btn_Stop" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="3" Content="Stop!" Margin="3,5,3,2" Click="Btn_Stop_Click" />
        </Grid>
    </Window>
    

    Wenn die Weckzeit erreicht wird, wird der MediaPlayer MP_Musik gestoppt und über den MediaPlayer MP_Wecker der Wecksound wiedergegeben.

    Viele Grüße Fred.

    • Als Antwort markiert ch.f.1 Donnerstag, 8. April 2021 00:15
    Mittwoch, 7. April 2021 14:00
  • Vielen Dank für den großartigen, ausführlichen Code. Damit ist mein Wochenende gerettet. Ich habe mir nach einem Hardwarefehler angewöhnt, jedes Projekt doppelt auf unterschiedlichen PCs zu erstellen. Im zweiten Musik-Player ist noch kein Wecker (zweiter Mediaplayer) vorhanden. Hier werde ich versuchen, Deine Vorschläge umzusetzen.

    Im ersten Projekt (mit den Problemen) habe ich den zweiten Player entfernt und drei Timer eingefügt. Es scheint zu funktionieren, aber nur, wenn der Timer (zum Musikabspielen) und der Timer (für den Wecker) jeweils vor dem Wechsel beendet wird. Der dritte Timer, nur für die Uhrzeit kann weiterlaufen. Hatte vorher schon die Timer, weiß aber nicht, was ich zuerst falsch gemacht habe.

    Die Farbänderung, während der Wecker aktiv ist, finde ich super, so sieht das alles viel lebendiger aus. Und ist schon drinnen.  

    void Timer1_Tick(object sender, EventArgs e)
            {         
                if (lblTime.Text == lblAlarm.Text)
                {
                    mediaPlayer.Play();
                    lblAlarm.Background = Brushes.DarkRed;
                }
    
                if (lblCurrenttime.Text == lblMusiclength.Text)
                {
                    lblAlarm.Background = Brushes.Transparent;
                }
    
                TimerSlider.Value = mediaPlayer.Position.TotalSeconds;
                lblCurrenttime.Text = mediaPlayer.Position.ToString(@"mm\:ss");
                lblMusiclength.Text = mediaPlayer.NaturalDuration.TimeSpan.ToString(@"mm\:ss");
                lblCountdown.Text = mediaPlayer.NaturalDuration.Subtract(mediaPlayer.Position).TimeSpan.ToString(@"mm\:ss");
            }
    
            void Timer2_Tick(object sender, EventArgs e)
            {
                lblTime.Text = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00") + ":" + DateTime.Now.Second.ToString("00");
            }
    
    

    Den Player pausieren zu können, während der Wecker spielt, ist eine hervorragende Idee. Auch dafür vielen Dank. 

    Bitte nicht schimpfen, über die Optik. Da wird noch einiges geändert.

    Liebe Grüße

    Chris

    Donnerstag, 8. April 2021 00:14
  • Hallo Chris!

    Um deine Optik mach ich mir überhaupt keine Sorgen! :-) Wenn ich mal einen Designer brauche, melde ich mich! ;-)

    Ich habe meinen Code mal um die Verrieglung, dass wenn der Weck-Sound kürzer als eine Minute ist, der (Weck) Sound nicht mehrfach abgespielt wird, erweitert.

    public MainWindow()
    {
        InitializeComponent();
    }
    
    ...
    
    KeyValuePair<string, int> KvpWekzeitZaehler = new KeyValuePair<string, int>("",0);                  // Weckzeit-Zähler initalisieren
    
    ...
    
    
    private void Timer1_Tick(object sender, EventArgs e)
    {
        Lbl_AktZeit.Content = DateTime.Now.ToString("HH:mm:ss");
    
        if (DateTime.Now.Hour == Convert.ToInt32(Tbo_Weckzeit_Stunde.Text) &&
            DateTime.Now.Minute == Convert.ToInt32(Tbo_Weckzeit_Minute.Text))           // Weck-Minute erreicht
        {
            if (!Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan && MP_Wecker.Position.TotalSeconds == 0)    // Weck-Sound angegeben?
            {
                string StrWeckzeit = Tbo_Weckzeit_Stunde.Text + " | " + Tbo_Weckzeit_Minute.Text;                       // Weckzeit 
                if (!KvpWekzeitZaehler.Key.Contains(StrWeckzeit))                       // Noch kein Weckzeit-Eintrag vorhanden?
                    KvpWekzeitZaehler = new KeyValuePair<string, int>(StrWeckzeit, 0);  // Weckzeit-Eintrag mit Zählerstand 0 setzen
                if(KvpWekzeitZaehler.Value == 0)                                        // 1. Durchlauf? -> Wecker starten, ansonsten (Beim Folgeaufruf innerhalb der Weck-Minute) nichts machen
                {
                    Tbo_Weckzeit_Stunde.Background = Brushes.Red; Tbo_Weckzeit_Minute.Background = Brushes.Red;
                    MP_Musik.Pause();                                                   // Musikwiedergabe stoppen
                    MP_Wecker.Play();                                                   // Wecksound wiedergeben
                    Wecker_aktiv = true;                                                // Indikator Wecker aktiv, setzen
                    KvpWekzeitZaehler = new KeyValuePair<string, int>(StrWeckzeit, 1);  // Weckzeit-Eintrag mit Zählerstand 1 setzen
                }
            }
        }
        if (Wecker_aktiv && MP_Wecker.Position == MP_Wecker.NaturalDuration.TimeSpan)   // Weck-Sound beendet?
        {
            Tbo_Weckzeit_Stunde.Background = Brushes.White; Tbo_Weckzeit_Minute.Background = Brushes.White;
            Wecker_aktiv = false;                                                       // Indikator Wecker aktiv, zurücksetzen
            MP_Wecker.Stop();                                                           // Weckersound anhalten 
            MP_Wecker.Position = new TimeSpan(0);                                       // Wecksound-Position (wieder) auf Anfang stellen
            MP_Musik.Play();                                                            // Musikwiedergabe fortsetzen
        }
    }

    Was ich an deinem Projekt nicht verstehe: Was willst du mit den ganzen Timern???

    Du brauchst doch nur einen Timer, um ein Intervall zu haben, damit du regelmäßig die aktuelle Uhrzeit abfragen kannst. Und das auch nur, um die Funktionalität Wecker bereit zu stellen.

    Der Musikplayer "arbeitet" vollständig autark und der Weck(er)player wird nur in Abhängigkeit der Uhrzeit aktiviert.  Es existieren keine weiteren zeitgesteuerten Prozesse.

    Viel Freude beim Umsetzen deiner Ideen.

    Fred.

    • Als Antwort markiert ch.f.1 Freitag, 9. April 2021 21:16
    Donnerstag, 8. April 2021 14:30
  • Hallo Fred

    Entschuldige bitte die späte Rückmeldung.

    Was ich an deinem Projekt nicht verstehe: Was willst du mit den ganzen Timern???

    Du brauchst doch nur einen Timer,

    Ja, Du hast recht, ich werde es noch umbauen.

    Im Moment habe ich nur einen Media Player, der auch als Wecker (extra, mit weiteren Schaltflächen) eingesetzt wird. Der erste Timer ist dem Slider und den drei TextBoxen (die Gesamtdauer der abgespielten Datei, zählt zurück, zählt vorwärts) zugeordnet. Der zweite Timer startet den Player (als Wecker) zur vorgegebenen Zeit. Der dritte Timer zeigt die aktuelle Uhrzeit. Aber es funktioniert nun, seit (auch Dein Vorschlag) auf readonly gestellt wurde. Erfreuliche Nebenwirkung: Die Anwendung startet schneller, wie zuvor und die Diagnose- Tools sind friedlich geworden, fast ohne Garbage-Collection.

     ----------------

    Deinen Entwurf habe ich unverändert (bis auf die Farbe für Tbo_Weckzeit) abgeschrieben (nicht kopiert), damit ich es besser verstehe, obwohl noch einiges neu ist (unter anderem KeyValuePair). Wieder etwas dazugelernt, danke.

    Leider hatte ich bei der ersten Verwendung nicht daran gedacht, dass der Timer schon beim Start der Anwendung aktiv ist. Beim Ändern der Weckzeit stürzte die Anwendung ab, weil ich die Ziffern (Tbo_Weckzeit_Minute) nicht markiert und überschrieben hatte, sondern neu eingeben wollte.

    Jetzt muss ich noch meinen Fehler beim Abschreiben suchen, denn bei Dir wird die Uhrzeit korrekt angezeigt, bei mir nur zwölf Stunden, nicht vierundzwanzig. Aber es funktioniert genauso (eigentlich besser (Media Player Pause / Wecker aktiv / Wecker fertig / Media Player Play)), wie ich es zuerst umsetzen wollte. 

    Ist es möglich (erlaubt), Deinen Entwurf zu erweitern (z.B.: Lautstärkeregler und ähnliches)? 

    Falls ich nicht zurechtkomme, beziehungsweise weitere Fragen habe (nicht nur im CodeBehind), soll ich hier noch weiterschreiben, oder ein neues Thema öffnen?

    Liebe Grüße

    Chris

    Freitag, 9. April 2021 21:15
  • Hallo Chris!

    Aus Zeitmangel mal im Schnelldurchlauf, ich antworte dir noch einmal Detaillierter.

    - Bei (während) der Weck-Zeiteingabe musst du die Umformung der Eingabe mit try/catch abfangen:

    #region Wecker
    int nWeckStunde = -1;                                                           // Weckzeit Stunden initalisieren
    int nWeckMinute = -1;                                                           // Weckzeit Minuten initalisieren
    
    try
    {
        nWeckStunde = Convert.ToInt32(Tbo_Weckzeit_Stunde.Text);
        nWeckMinute = Convert.ToInt32(Tbo_Weckzeit_Minute.Text);
    }
    catch (Exception) { }       // Wenn Eingabewert nicht umgeformt werden konnte, ungültige Werte verwenden -> Weckzeit übergehen
    
    if (DateTime.Now.Hour == nWeckStunde && DateTime.Now.Minute == nWeckMinute)   // Weck-Minute erreicht

    - 12/24 Stunden Anzeige: Sieh mal, ob du bei deinem Zielframework (für das aktuelle Projekt) auch das Languagepack (Deutsch) des Frameworks auf dem Entwicklungs-Rechner installiert hast! Sonst wird der Standard (englisch), mit der 12 Stunden Anzeige verwendet. Wie man sieht, ist es ja im Betriebssystem (Windows) richtig eingestellt.

    - Selbstverständlich kannst du mit dem Code machen was du willst. Ist ja sowieso nur ein auf Funktionalität und Anschaulichkeit getrimmter Code.

    - Ich würde es sehr empfehlen für neue Probleme neue Themen und wenn es geht auch viel konkreter aufzumachen/anzusprechen.

    Ich habe den Entwurf noch etwas praxistauglicher und WPF konformer gestaltet, doch dazu Morgen.



    • Bearbeitet perlfred Montag, 12. April 2021 14:38
    • Als Antwort markiert ch.f.1 Dienstag, 13. April 2021 19:13
    Montag, 12. April 2021 14:35
  • Hallo und schönen Abend

    Danke, das war das erste, dass ich danach try / catch eingetragen habe. Aber sehr hilfreich war Dein Tipp mit dem Framework

    Ich habe den Entwurf noch etwas praxistauglicher und WPF konformer gestaltet, doch dazu Morgen.

    Sieht sehr gut aus, vor allen die Schriftart der Uhr. Wie eine leuchtende LED-Anzeige. Die Symbole finde ich auch gut.

    Im Moment bin ich mit beiden Anwendungen beschäftigt. Die Erste funktioniert recht gut, nur mit drei Timer ist es natürlich nicht so schön.

    Deinen Vorschlag finde ich sehr viel besser, aber nach dem Einfügen von zwei Slidern ist derselbe Fehler wieder vorhanden. Wie hast Du das gelöst, bei Dir gibt es doch auch zweimal eine Progress Bar

    Im Entwurf (neu) habe ich zwei Slider und TextBoxen, welche den Zeitablauf anzeigen. Jedes Mal beim ersten Öffnen von Player / Wecker und nach jeder neuen Datei-Auswahl wird die Message Box aufgerufen.

    Ohne try / catch:

    Leider habe ich auch keine Ahnung, wie ich die von Peter Fleischer empfohlene Umleitung durchführen soll.

    -------------------------------------

    System.InvalidOperationException: "Es kann kein TimeSpan-Eigenschaftswert für den Duration-Wert "Automatic" zurückgegeben werden. Prüfen Sie vor dem Anfordern des TimeSpan-Eigenschaftswerts von "Duration" die HasTimeSpan-Eigenschaft."


    • Bearbeitet ch.f.1 Dienstag, 13. April 2021 19:13
    Dienstag, 13. April 2021 19:07
  • Hallo Chris!

    Die Slider dienen nicht zum Anzeigen des Abspielfortschrittes, sondern steuern die Lautstärke des Musik- und Wecker-Mediaplayers. Ich befürchte zwar, dass das (trotzdem noch kleine) Gesamtprojekt für dich mehr Fragen als Antworten bereithält, möchte es dir aber trotzdem erst einmal zur Verfügung stellen. Du kannst sicher für dich interessante Details herausnehmen und Fragen hier wieder posten. Aber bitte jeweils in einem neuen Thema!

    Die LED-Anzeige ist keine Schriftart sondern ein WPF-Control (LED_Uhr), dass ich auf Grundlage des SevenSegment-Controls von Mohammad Dayyan (hier veröffentlicht auf CODE PROJEKT) modifiziert und erstellt habe. Auch dieses stelle ich dir hier zum Download bereit.

    Die Symbole habe ich aus 2D-Objekten zusammengestellt, da du sie so direkt aus dem XAML übernehmen kannst, aber du kannst natürlich auch ganz normale Bilder mit einem Image-Objekt benutzen.

    Dein oben angesprochener Fehler resultiert aus der Tatsache, dass der Duration-Wert auf Automatic steht. Du kannst ihn umgehen, indem du vorher die HasTimSpan-Eigenschaft der Duration abfragst. Siehe hier und in der Gesamtanwendung.

     if (MP_Wecker.NaturalDuration.HasTimeSpan)   // Duration hat einen "Wert"?
          ...
    

    Da if-Anweisungen immer von links nach rechts ausgewertet werden, bricht der Compiler ab, sobald eine Bedingung nicht zutrifft. Du könntest also nach dieser Anweisung (durch && Verbunden) sogar auf den TimeSpan-Wert zugreifen, so wie ich es hier gemacht habe (wenn dann die Duration nicht den Wert Automatic hat!).

     if (!Dp_Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan && MP_Wecker.Position.TotalSeconds < 1)    // Weck-Sound angegeben?
    

    So, nun viel Spaß beim "Durchstöbern"!

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Threading;
    
    namespace Test_LEDUhr
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            #region Initalisierung und Beendigung
            readonly Microsoft.Win32.OpenFileDialog dlgMusik_Datei = new Microsoft.Win32.OpenFileDialog();
            readonly Microsoft.Win32.OpenFileDialog dlgWecker_Datei = new Microsoft.Win32.OpenFileDialog();
            readonly MediaPlayer MP_Musik = new MediaPlayer();
            readonly MediaPlayer MP_Wecker = new MediaPlayer();
            readonly DispatcherTimer Timer1 = new DispatcherTimer();                                            // Timer initalisieren
            KeyValuePair<string, int> KvpWekzeitZaehler = new KeyValuePair<string, int>("", 0);                 // Weckzeit-Zähler initalisieren
    
            #region DP
            public static readonly DependencyProperty AktZeitProperty =
                DependencyProperty.Register("AktZeit", typeof(DateTime), typeof(MainWindow), new PropertyMetadata(DateTime.Now));
    
            private DateTime AktZeit                                                                            // Aktuelle Zeit
            {
                get { return (DateTime)GetValue(AktZeitProperty); }
                set { SetValue(AktZeitProperty, value); }
            }
    
            public static readonly DependencyProperty Dp_Wecker_aktivProperty =
                DependencyProperty.Register("Dp_Wecker_aktiv", typeof(bool), typeof(MainWindow), new PropertyMetadata(false));
    
            private bool Dp_Wecker_aktiv                                                                        // Indikator Wecker aktiv
            {
                get { return (bool)GetValue(Dp_Wecker_aktivProperty); }
                set { SetValue(Dp_Wecker_aktivProperty, value); }
            }
    
            public static readonly DependencyProperty Dp_Musik_aktivProperty =
                DependencyProperty.Register("Dp_Musik_aktiv", typeof(bool), typeof(MainWindow), new PropertyMetadata(false));
    
            private bool Dp_Musik_aktiv                                                                        // Indikator Musik aktiv
            {
                get { return (bool)GetValue(Dp_Musik_aktivProperty); }
                set { SetValue(Dp_Musik_aktivProperty, value); }
            }
    
            // Musik-Volume
            public static readonly DependencyProperty Dp_Musik_VolumeProperty =
                DependencyProperty.Register("Dp_Musik_Volume", typeof(double), typeof(MainWindow), new PropertyMetadata(0.5, new PropertyChangedCallback(Musik_Volume_Aendern)));
    
            private static void Musik_Volume_Aendern(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if ((double)e.NewValue != (double)e.OldValue)
                {
                    ((MainWindow)d).MP_Musik.Volume = (double)e.NewValue;
                }
            }
    
            private double Dp_Musik_Volume                                                                     // Lautstärke der Musik
            {
                get { return (double)GetValue(Dp_Musik_VolumeProperty); }
                set { SetValue(Dp_Musik_VolumeProperty, value); }
            }
    
            // Wecker-Volume
            public static readonly DependencyProperty Dp_Wecker_VolumeProperty =
                DependencyProperty.Register("Dp_Wecker_Volume", typeof(double), typeof(MainWindow), new PropertyMetadata(0.5, new PropertyChangedCallback(Wecker_Volume_Aendern)));
    
            private static void Wecker_Volume_Aendern(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if ((double)e.NewValue != (double)e.OldValue)
                {
                    ((MainWindow)d).MP_Wecker.Volume = (double)e.NewValue;
                }
            }
    
            private double Dp_Wecker_Volume                                                                     // Lautstärke der Musik
            {
                get { return (double)GetValue(Dp_Wecker_VolumeProperty); }
                set { SetValue(Dp_Wecker_VolumeProperty, value); }
            }
    
            #endregion
    
            private void WndMediaPlayer_Loaded(object sender, RoutedEventArgs e)
            {
                // Anfangsverzeichnisse initalisieren
                dlgMusik_Datei.InitialDirectory = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Musik";     // Pfad zu den Musikdateien
                dlgWecker_Datei.InitialDirectory = $"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName}\\Wecker";   // Pfad zu den Weckerdateien
                // Weckzeit initalisieren
                Tbo_Weckzeit_Stunde.Text =  AktZeit.Hour.ToString("00");
                Tbo_Weckzeit_Minute.Text = AktZeit.AddMinutes(1).Minute.ToString("00");
                // Lautstärke
    
                // Timer initalisieren
                Timer1.Tick += new EventHandler(Timer1_Tick);                                       // Timer-Event zuordnen
                Timer1.Interval = new TimeSpan(0, 0, 1);                                            // Event auf 1s setzen
                Timer1.Start();                                                                     // Timer (jetzt) starten
            }
    
            private void WndMediaPlayer_Closed(object sender, EventArgs e)
            {
                Timer1.Stop();                          // Timer beenden
                MP_Musik.Stop(); MP_Musik.Close();      // Musikplayer beenden
                MP_Wecker.Stop(); MP_Wecker.Close();    // Wecker beenden
            }
    
            #endregion
    
            private void Timer1_Tick(object sender, EventArgs e)
            {
                #region Allgemein und Musik
                // Lbl_AktZeit.Content = DateTime.Now.ToString("HH:mm:ss");                        // Zeitanzeige aktualisieren
                AktZeit = DateTime.Now;                                                         // Die aktuelle Zeit + Anzeige aktualisieren (Binding -> LED_UhrControl)
                if (Dp_Musik_aktiv && MP_Musik.NaturalDuration.HasTimeSpan)                     // Musik-Sound aktiviert?
                {
                    if (MP_Musik.Position.TotalSeconds < 1)                                      // Beim ersten Durchlauf einer (neuen) Musik, Endwert aktualisieren
                        PB_Musik.Maximum = MP_Musik.NaturalDuration.TimeSpan.TotalSeconds;
                    PB_Musik.Value = MP_Musik.Position.TotalSeconds;                            // Musikposition aktualisieren
                    Lbl_Musik_Info.Content = Get_MP_Info(MP_Musik);                             // Spielstand des Musik-Sounds aktualisieren
                }
    
                if (MP_Musik.NaturalDuration.HasTimeSpan && MP_Musik.Position == MP_Musik.NaturalDuration.TimeSpan)  // Musik-Sound beendet?
                {
                    Set_Musik_Stop();                                                           // Musikwiedergabe beenden
                }
                #endregion
    
                #region Wecker
                int nWeckStunde = -1;                                                           // Weckzeit Stunden initalisieren
                int nWeckMinute = -1;                                                           // Weckzeit Minuten initalisieren
    
                try
                {
                    nWeckStunde = Convert.ToInt32(Tbo_Weckzeit_Stunde.Text);
                    nWeckMinute = Convert.ToInt32(Tbo_Weckzeit_Minute.Text);
                }
                catch (Exception) { }       // Wenn Eingabewert nicht umgeformt werden konnte, ungültige Werte verwenden -> Weckzeit übergehen
    
                if (AktZeit.Hour == nWeckStunde && AktZeit.Minute == nWeckMinute)   // Weck-Minute erreicht
                {
                    if (!Dp_Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan && MP_Wecker.Position.TotalSeconds < 1)    // Weck-Sound angegeben?
                    {
                        string StrWeckzeit = Tbo_Weckzeit_Stunde.Text + " | " + Tbo_Weckzeit_Minute.Text;                       // Weckzeit 
                        if (!KvpWekzeitZaehler.Key.Contains(StrWeckzeit))                       // Noch kein Weckzeit-Eintrag vorhanden?
                            KvpWekzeitZaehler = new KeyValuePair<string, int>(StrWeckzeit, 0);  // Weckzeit-Eintrag mit Zählerstand 0 setzen
                        if (KvpWekzeitZaehler.Value == 0)                                        // 1. Durchlauf? -> Wecker starten, ansonsten (Beim Folgeaufruf innerhalb der Weck-Minute) nichts machen
                        {
                            Tbo_Weckzeit_Stunde.Background = Brushes.Red; Tbo_Weckzeit_Minute.Background = Brushes.Red;
                            MP_Musik.Pause();                                                   // Musikwiedergabe stoppen
                            MP_Wecker.Play();                                                   // Wecksound wiedergeben
                            Dp_Wecker_aktiv = true;                                             // Indikator Wecker aktiv, setzen
                            KvpWekzeitZaehler = new KeyValuePair<string, int>(StrWeckzeit, 1);  // Weckzeit-Eintrag mit Zählerstand 1 setzen
                            PB_Zeit.Maximum = MP_Wecker.NaturalDuration.TimeSpan.TotalSeconds;  // Wecker, Endwert aktualisieren
                        }
                    }
                }
    
                if (Dp_Wecker_aktiv && MP_Wecker.NaturalDuration.HasTimeSpan)                   // Wecker aktiv?
                {
                    PB_Zeit.Value = MP_Wecker.Position.TotalSeconds;                            // Weckerpositionsanzeige aktualisieren
                    Lbl_Wecker_Info.Content = Get_MP_Info(MP_Wecker);                           // Spielstand des Wecker-Sounds aktualisieren
                }
    
                if (Dp_Wecker_aktiv && MP_Wecker.Position == MP_Wecker.NaturalDuration.TimeSpan)// Weck-Sound beendet?
                {
                    Set_Wecker_Stop();
                }
                #endregion Wecker
            }
    
            #region Methoden der Applikation
    
            /// <summary>
            /// Mediaplayer Spielstand-Info
            /// </summary>
            /// <param name="MP">Instanz des Mediaplayers, dessen aktueller Spielstand ermittelt werden soll.</param>
            /// <param name="StrTZ">Trennzeichen zwischen der akt. Position und der Gesamtdauer.</param>
            /// <param name="StrFormat">Format der Medienanzeige. Bei Auto werden so viel Stellen angezeigt wie die Spiellänge es erfordert.</param>
            /// <returns>String, der die aktuelle Position und die Gesamtdauer der Mediadatei ermittelt.</returns>
            private string Get_MP_Info(MediaPlayer MP, string StrFormat = "Auto", string StrTZ = "/")
            {
                string StrInfo = string.Empty;
    
                if (MP.NaturalDuration.HasTimeSpan)      // Medium vorhanden?
                {
                    if (StrFormat == "Auto")
                    {
                        if (MP.NaturalDuration.TimeSpan.TotalMinutes < 60)
                        {
                            if (MP.NaturalDuration.TimeSpan.TotalSeconds < 60) StrFormat = "ss";
                            else StrFormat = "mm:ss";
                        }
                        else StrFormat = "HH:mm:ss";
                    }
                    StrInfo = (DateTime.MinValue + MP.Position).ToString(StrFormat) + StrTZ +
                              (DateTime.MinValue + MP.NaturalDuration.TimeSpan).ToString(StrFormat);
                }
                return StrInfo;
            }
    
            /// <summary>
            /// Musikwiedergabe beenden
            /// </summary>
            void Set_Musik_Stop()
            {
                MP_Musik.Stop();                            // Musiksound anhalten 
                MP_Musik.Position = new TimeSpan(0);        // Musik-Position (wieder) auf Anfang stellen
                MP_Musik.Close();                           // Mediendatei frei geben
                PB_Musik.Value = 0;                         // Musikpositionsanzeige zurücksetzen
                Lbl_Musik_Info.Content = null;              // Spielstand des Musik-Sounds zurück setzen
                Lbl_Musik_Datei.Content = null;             // Musiksound-Dateiname zurück setzen
                Dp_Musik_aktiv = false;                     // Indikator, Musik-Sound aktiv, zurück setzen
            }
    
            /// <summary>
            /// Wecker beenden
            /// </summary>
            void Set_Wecker_Stop(bool Bol_Datei_zuruecksetzen = false)
            {
                Tbo_Weckzeit_Stunde.Background = Brushes.White; Tbo_Weckzeit_Minute.Background = Brushes.White;
                Dp_Wecker_aktiv = false;                    // Indikator Wecker aktiv, zurücksetzen
                MP_Wecker.Stop();                           // Weckersound anhalten 
                MP_Wecker.Position = new TimeSpan(0);       // Wecksound-Position (wieder) auf Anfang stellen
                PB_Zeit.Value = 0;                          // Weckerpositionsanzeige zurücksetzen
                Lbl_Wecker_Info.Content = null;             // Spielstand des Wecker-Sounds zurück setzen
                if (Bol_Datei_zuruecksetzen)                // Soll die Weckdatei deaktiviert werden?
                {
                    Lbl_Wecker_Datei.Content = null;
                    MP_Wecker.Close();
                }
                MP_Musik.Play();                            // Musikwiedergabe fortsetzen
            }
    
            #endregion Methoden der Applikation
    
            #region Bedienelemente
    
            private void Btn_Musik_Datei_Click(object sender, RoutedEventArgs e)
            {
                if (dlgMusik_Datei.ShowDialog() == true)
                {
                    Lbl_Musik_Datei.Content = dlgMusik_Datei.SafeFileName;
                    MP_Musik.Open(new Uri(dlgMusik_Datei.FileName));
                    MP_Musik.Play();
                    Dp_Musik_aktiv = true;                                                     // Indikator, Musik-Sound aktiv, setzen
                }
            }
    
            private void Btn_Wecker_Datei_Click(object sender, RoutedEventArgs e)
            {
                if (dlgWecker_Datei.ShowDialog() == true)
                {
                    Lbl_Wecker_Datei.Content = dlgWecker_Datei.SafeFileName;
                    MP_Wecker.Stop();                                               // Wecker immer stoppen
                    MP_Wecker.Open(new Uri(dlgWecker_Datei.FileName));              // Weck-Sound-Datei laden
                    MP_Wecker.Position = new TimeSpan(0);                           // Weker-Player an Anfang setzen
                }
            }
    
            private void Tbo_Weckzeit_Stunde_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Tbo_Weckzeit_Minute_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !Array.TrueForAll(e.Text.ToCharArray(), c => System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), @"[0-9]")); // Alle Zahlen erlauben.
            }
    
            private void Btn_Wecker_Play_Click(object sender, RoutedEventArgs e)
            {
                MP_Wecker.Play();
                Dp_Wecker_aktiv = true;
            }
    
            private void Btn_Wecker_Pause_Click(object sender, RoutedEventArgs e)
            {
                MP_Wecker.Pause();
            }
    
            private void Btn_Wecker_Stop_Click(object sender, RoutedEventArgs e)
            {
                Set_Wecker_Stop(true);      // Einschließlich Weckdatei zurücksetzen
            }
    
            private void Btn_Wecker_Aus_Click(object sender, RoutedEventArgs e)
            {
                Set_Wecker_Stop();
            }
    
            private void Btn_Musik_Play_Click(object sender, RoutedEventArgs e)
            {
                MP_Musik.Play();
                Dp_Musik_aktiv = true;
            }
    
            private void Btn_Musik_Pause_Click(object sender, RoutedEventArgs e)
            {
                MP_Musik.Pause();
            }
    
            private void Btn_Musik_Stop_Click(object sender, RoutedEventArgs e)
            {
                Set_Musik_Stop();    // Musikwiedergabe beenden
            }
            #endregion Bedienelemente
        }
    
        #region IValueConverter
    
        [ValueConversion(typeof(double), typeof(string))]
        public class Double_Prozent_Converter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value is Double && (double)value >= 0 && (double)value <= 1)      // Wert zwischen 0 und 1 ?
                {
                    if ((double)value == 0) return "Aus";
                    if ((double)value == 1) return "Voll";
                    return ((double)value * 100) + "%";
                }
                else return string.Empty; ;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotSupportedException(); // Umkehr-Funktion nicht implementiert 
            }
        }
        #endregion
    
    }
    

    <Window x:Class="Test_LEDUhr.MainWindow" x:Name="WndMediaPlayer"
            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:Test_LEDUhr"
            xmlns:Uhr="clr-namespace:LED_Uhr;assembly=LED_Uhr"
            DataContext="{Binding RelativeSource={RelativeSource Self}}"        
            mc:Ignorable="d" 
            Title="Player-App" Height="300" Width="800" Loaded="WndMediaPlayer_Loaded" Closed="WndMediaPlayer_Closed" 
            WindowStyle="ToolWindow" Background="LightGray">
        <Window.Resources>
            <local:Double_Prozent_Converter x:Key="Dbl_Prozent_Konverter" />
        </Window.Resources>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="10"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Grid.Column="0" Grid.Row="0" Content="Musik-Datei:" VerticalAlignment="Center" />
            <Label Grid.Column="1" Grid.Row="0" x:Name="Lbl_Musik_Datei" VerticalAlignment="Center" Foreground="Blue" FontWeight="Bold"/>
            <StackPanel Grid.Column="2" Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Center" IsEnabled="{Binding Dp_Musik_aktiv}">
                <Slider Name="Sl_Musik_Volume" MinWidth="100" Margin="0,0,5,0" Minimum="0" Maximum="1" Value="{Binding Dp_Musik_Volume}"
                        IsSnapToTickEnabled="True" TickFrequency="0.05" TickPlacement="BottomRight" VerticalAlignment="Center"/>
                <TextBlock Text="{Binding ElementName=Sl_Musik_Volume, Path=Value, Converter={StaticResource Dbl_Prozent_Konverter}}" Foreground="Gray" Margin="0,0,10,0" VerticalAlignment="Center" />
                <Button Name="Btn_Musik_Play" Click="Btn_Musik_Play_Click">
                    <Button.Content>
                        <Canvas Width="48" Height="48">
                            <Path Data="M20,33l12-9l-12-9V33z M24,4C12.95,4,4,12.95,4,24s8.95,20,20,20s20-8.95,20-20S35.05,4,24,4z M24,40c-8.82,0-16-7.18-16-16
                        	c0-8.82,7.18-16,16-16c8.82,0,16,7.18,16,16C40,32.82,32.82,40,24,40z" Fill="Black"/>
                        </Canvas>
                    </Button.Content>
                </Button>
                <Button Name="Btn_Musik_Pause" Click="Btn_Musik_Pause_Click" Margin="5,0,0,0">
                    <Button.Content>
                        <Canvas Width="40" Height="40" Margin="4">
                            <Ellipse Width="40" Height="40" Stroke="Black" StrokeThickness="4" StrokeLineJoin="Round" />
                            <Line Stroke="Black" StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" 
                                  StrokeLineJoin="Round" X1="17" Y1="25" X2="17" Y2="15"/>
                            <Line Stroke="Black" StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" 
                                  StrokeLineJoin="Round" X1="23" Y1="25" X2="23" Y2="15"/>
                        </Canvas>
                    </Button.Content>
                </Button>
                <Button Name="Btn_Musik_Stop" Click="Btn_Musik_Stop_Click" Margin="5,0" >
                    <Button.Content>
                        <Canvas Width="40" Height="40" Margin="4">
                            <Ellipse Width="40" Height="40" Stroke="Black" StrokeThickness="4" />
                            <Rectangle Canvas.Left="12" Canvas.Top="12" Stroke="Black" StrokeThickness="3" StrokeLineJoin="Round" 
                                       StrokeStartLineCap="Round" StrokeEndLineCap="Round" Width="16" Height="16"/>
                        </Canvas>
                    </Button.Content>
                </Button>
            </StackPanel>
            <StackPanel Grid.Column="3" Grid.Row="0" VerticalAlignment="Center" Margin="0,0,3,0">
                <ProgressBar  x:Name="PB_Musik" MinHeight="5"  />
                <Label x:Name="Lbl_Musik_Info" Padding="1"/>
            </StackPanel>
            <Button Grid.Column="4" Grid.Row="0" x:Name="Btn_Musik_Datei" Click="Btn_Musik_Datei_Click" Margin="0,0,3,0">
                <Button.Content>
                    <Canvas Width="48" Height="27" HorizontalAlignment="Center" VerticalAlignment="Top" >
                        <Canvas.RenderTransform>
                            <TransformGroup>
                                <ScaleTransform ScaleX="-0.1" ScaleY="0.1"/>
                                <TranslateTransform Y="-809"/>
                                <RotateTransform Angle="180" />
                            </TransformGroup>
                        </Canvas.RenderTransform>
                        <Path Data="M414.983,8089.403l-1.606-0.786v-24.951v-24.912l-1.196-0.19c-12.251-1.978-16.396-2.725-21.592-3.809
    		            c-13.706-2.915-26.143-6.348-41.089-11.357c-5.454-1.792-10.195-3.398-10.532-3.55c-0.635-0.259-0.669,0.898-0.742,19.648
    		            c-0.112,19.165-0.151,19.946-0.825,20.063c-0.371,0.068-1.348-0.151-2.129-0.527l-1.455-0.635v-20.244v-20.283l-2.319-0.825
    		            c-4.258-1.563-18.076-7.393-25.586-10.752c-15.205-6.875-31.152-14.907-47.363-23.906c-5.303-2.954-6.797-3.623-7.021-3.213
    		            c-0.151,0.298-0.488,3.174-0.708,6.421c-0.225,3.213-0.562,5.977-0.786,6.094c-0.186,0.146-0.898,0.034-1.533-0.225l-1.157-0.488
    		            l-0.112-7.471l-0.078-7.471l-15.796-8.965c-20.171-11.426-31.416-17.627-31.938-17.627c-0.259,0-0.444,0.293-0.444,0.669
    		            c0,0.337-0.522,6.611-1.162,13.896c-1.27,14.268-1.343,14.492-3.325,14.009c-2.837-0.674-37.202-10.762-37.466-10.986
    		            c-0.22-0.22,2.021-27.148,2.915-35.034l0.225-1.904l-7.583-2.988c-8.442-3.325-18.306-6.724-26.372-9.043l-5.342-1.528
    		            l-1.641,1.157c-4.15,2.837-10.01,4.819-14.604,4.858h-1.499l-1.006,7.881l-1.011,7.881l3.999,4.185
    		            c8.403,8.774,12.666,16.655,14.531,26.968c0.933,5.078,0.933,16.807,0.039,21.816c-1.05,5.674-2.021,8.887-3.999,12.881
    		            c-2.539,5.269-6.162,9.155-8.516,9.155c-3.174,0-10.015-9.448-12.554-17.368c-2.051-6.426-2.275-8.481-2.241-19.985
    		            c0.039-9.077,0.19-11.616,0.972-17.148l0.898-6.46l-4.111-3.77c-2.275-2.056-6.685-6.089-9.785-8.892
    		            c-13.037-11.953-17.93-19.238-19.57-29.36l-0.449-2.725h-7.397H45.52l0.19,1.602c0.186,1.46,0.073,1.719-1.011,2.617
    		            c-1.68,1.421-2.837,1.646-4.033,0.747c-0.859-0.64-1.011-1.045-1.011-2.69c0-1.68-0.073-1.904-0.781-1.904
    		            s-0.825,0.264-1.011,2.578c-0.371,4.634-2.612,7.92-6.836,9.971c-3.022,1.494-7.207,1.685-10.347,0.522
    		            c-4.146-1.567-6.982-4.478-7.808-8.14l-0.483-2.017l-2.056,0.259c-1.123,0.151-3.735,0.596-5.791,0.972
    		            c-4.668,0.898-4.668,0.898-4.668-0.151c0-0.781,0.337-0.894,5.718-1.865c3.096-0.562,5.977-1.011,6.313-1.011
    		            c0.63,0,1.265-0.635,0.967-0.972c-0.146-0.146-10.718,1.831-12.324,2.319c-0.522,0.151-0.674-0.039-0.674-0.708
    		            c0-1.045-0.522-0.898,9.302-2.915c4.668-0.933,6.724-1.606,6.274-2.056c-0.073-0.073-3.472,0.635-7.583,1.533
    		            c-4.072,0.933-7.544,1.68-7.695,1.68c-0.186,0-0.298-0.371-0.298-0.825c0-0.781,0.41-0.967,5.156-2.09
    		            c5.898-1.377,15.835-3.438,21.069-4.37c2.573-0.449,3.657-0.82,3.657-1.157c0-0.298-0.337-0.522-0.747-0.522
    		            c-1.235,0-14.531,2.876-22.148,4.819l-6.987,1.758v-0.825c0-0.713,0.337-0.972,1.982-1.455c3.174-0.972,18.037-4.556,22.598-5.493
    		            c3.247-0.669,4.18-0.972,4.111-1.421c-0.078-0.371-0.454-0.522-1.05-0.444c-2.803,0.371-24.204,5.938-26.968,6.987
    		            c-0.522,0.22-0.674,0.073-0.674-0.679c0-0.82,0.298-1.006,3.101-1.904c4.224-1.304,17.334-4.854,21.143-5.713
    		            c1.646-0.376,3.027-0.82,3.027-0.972c0-0.522-2.021-3.252-5.195-6.982c-3.062-3.628-3.584-4.932-1.978-5.156
    		            c0.596-0.078,2.241,1.309,6.499,5.527l5.713,5.64l8.594-1.719c4.741-0.933,11.465-2.09,14.941-2.612
    		            c3.511-0.522,6.87-1.045,7.471-1.157c0.894-0.151,1.455-0.674,2.803-2.842c3.735-5.898,10.156-11.318,16.318-13.672
    		            c4.819-1.865,8.745-2.427,15.244-2.202c3.101,0.112,6.011,0.337,6.538,0.449l0.933,0.225l1.304-10.273
    		            c1.162-9.414,1.235-10.493,0.825-13.296c-0.825-5.64-3.628-9.79-8.066-11.953c-5.083-2.466-11.582-2.168-14.16,0.669
    		            c-0.635,0.713-0.635,0.713,1.084,0.972c8.628,1.157,12.402,10.947,6.685,17.334c-3.662,4.067-8.662,5.078-13.486,2.69
    		            c-3.77-1.831-5.64-4.858-6.011-9.526c-0.41-5.005,1.27-9.414,4.932-13.076c7.769-7.764,20.732-7.729,28.535,0.078
    		            c2.915,2.949,4.336,5.601,5.117,9.712c0.786,4.18,0.635,8.667-0.708,18.789l-1.23,9.15l2.876,1.348
    		            c6.235,2.949,11.689,7.803,14.116,12.583l0.713,1.421l8.218,0.82c23.716,2.427,43.477,6.465,74.219,15.244
    		            c6.802,1.938,12.661,3.618,13.071,3.77c0.713,0.19,0.713,0.19,0.151-0.488c-2.319-2.651-3.511-7.881-2.612-11.201
    		            c0.854-3.14,4.556-6.128,8.325-6.685c4.858-0.752,11.509,1.787,16.064,6.084c4.741,4.482,5.488,6.465,5.566,14.683l0.039,5.527
    		            l1.191,0.371c2.764,0.898,12.998,3.438,13.149,3.286c0.112-0.073,0-0.596-0.225-1.157c-0.63-1.714-0.483-3.213,0.337-3.213
    		            c0.898,0,1.792,1.123,2.988,3.628l0.859,1.904l5.493,1.191c27.119,5.903,55.059,7.437,81.65,4.448
    		            c40.044-4.482,79.678-19.16,116.357-43.071c2.578-1.68,4.893-3.174,5.156-3.359c0.332-0.225,0.449,0.972,0.449,5.454v5.752
    		            l-6.611,3.96c-20.547,12.324-39.302,20.952-60.068,27.676c-24.502,7.954-48.779,11.841-74.443,11.992l-9.824,0.034l1.421,1.089
    		            c2.349,1.826,6.348,6.089,7.432,7.881c0.522,0.933,1.27,2.686,1.646,3.848l0.674,2.129l4.966,0.298
    		            c5.938,0.371,23.086,0.073,30.22-0.483c33.613-2.69,64.883-11.431,96.367-27.007c4.224-2.095,7.773-3.848,7.959-3.921
    		            c0.146-0.078,0.264,2.388,0.264,5.449v5.566l-4.932,2.354c-20.659,9.863-45.61,18.081-65.22,21.514
    		            c-2.09,0.337-3.809,0.747-3.809,0.859s0.781,0.635,1.792,1.162c0.972,0.522,3.359,2.534,5.342,4.478
    		            c3.921,3.926,5.562,6.577,6.313,10.234l0.444,2.168l2.28-0.225c12.212-1.382,37.168-7.915,52.891-13.892
    		            c2.393-0.898,4.448-1.646,4.634-1.646c0.146,0,0.225,2.466,0.186,5.454l-0.112,5.454l-2.988,1.118
    		            c-6.572,2.432-20.879,6.538-30.107,8.667l-1.006,0.225l1.528,2.876c2.949,5.679,4.521,10.386,6.089,18.301
    		            c0.112,0.674,0.337,0.825,1.196,0.674c5.42-0.972,15.503-3.062,19.795-4.106c2.954-0.713,5.42-1.309,5.532-1.309
    		            c0.073,0,0.112,2.466,0.073,5.493l-0.112,5.488l-2.988,0.635c-4.556,1.011-14.453,2.837-19.087,3.55l-4.106,0.596l-0.488,2.28
    		            c-0.259,1.27-0.708,2.764-1.011,3.359c-0.522,0.972-0.483,1.382,0.264,4.487c0.635,2.612,0.82,4.629,0.859,8.438l0.034,4.971
    		            l4.487-0.229c4.292-0.259,16.694-1.416,20.469-1.938l1.758-0.264v5.493c0,2.988-0.039,5.454-0.078,5.454
    		            c-0.073,0-2.617,0.264-5.713,0.557c-3.062,0.303-9.678,0.674-14.683,0.825l-9.077,0.22l-1.719,3.403
    		            c-3.213,6.387-5.713,9.521-15.61,19.648c-12.065,12.363-13.228,14.229-13.262,21.553
    		            C417.859,8090.224,417.522,8090.634,414.983,8089.403z M425.369,8055.673c4.37-2.69,7.241-4.854,10.347-7.808
    		            c2.539-2.354,5.938-6.426,5.64-6.685c-0.073-0.078-3.477-0.337-7.549-0.601c-7.021-0.41-7.432-0.41-7.954,0.264
    		            c-5.078,6.426-7.993,12.7-7.993,17.217v1.982l2.163-1.196C421.184,8058.178,423.611,8056.757,425.369,8055.673z M445.798,8030.756
    		            c0.522-0.596,1.157-7.319,0.933-9.487l-0.186-1.567l-1.792,2.129c-0.972,1.157-3.325,3.623-5.19,5.493
    		            c-2.803,2.725-3.291,3.394-2.764,3.623C438.069,8031.43,445.388,8031.278,445.798,8030.756z M425.588,8025.604
    		            c7.661-4.932,11.211-7.622,13.862-10.649c1.978-2.202,4.404-6.011,4.067-6.387c-0.146-0.107-2.798-0.034-5.938,0.19
    		            c-3.135,0.259-8.853,0.557-12.7,0.669l-7.021,0.264v10.195c0,6.426,0.151,10.239,0.376,10.239
    		            C418.42,8030.126,421.746,8028.104,425.588,8025.604z M413.376,8019.477v-9.824l-2.69-0.225c-1.494-0.112-5.903-0.376-9.824-0.596
    		            c-16.768-1.011-36.528-4.146-54.98-8.779c-3.701-0.933-6.914-1.68-7.173-1.68c-0.298,0-0.41,1.87-0.337,7.021l0.107,6.982
    		            l6.353,2.134c15.278,5.117,34.146,9.824,50.615,12.661c6.011,1.011,17.295,2.5,17.671,2.319
    		            C413.264,8029.413,413.376,8024.892,413.376,8019.477z M333.816,8003.827v-6.909l-4.37-1.348
    		            c-21.104-6.499-41.611-14.492-63.691-24.878l-7.168-3.359l-0.859,1.045c-2.319,2.69-4.224,5.488-3.96,5.752
    		            c0.41,0.376,8.628,4.746,17.666,9.414c12.773,6.572,29.434,14.268,42.397,19.609c6.348,2.578,19.238,7.51,19.722,7.549
    		            C333.704,8010.702,333.816,8007.602,333.816,8003.827z M413.376,7990.863c0-8.779-0.034-9.375-0.635-9.111
    		            c-4.37,1.753-4.746,1.831-10.01,1.831c-4.707,0-5.527-0.112-8.408-1.05c-2.686-0.894-4.146-1.079-9.336-1.382
    		            c-22.378-1.157-28.423-1.753-46.133-4.556c-0.225-0.039-0.41,2.578-0.483,7.095l-0.073,7.173l1.494,0.415
    		            c11.841,3.174,33.096,6.758,47.627,8.027c8.926,0.747,9.634,0.786,18.413,0.859l7.544,0.078V7990.863z M427.571,7999.867
    		            c5.679-0.415,15.352-1.348,17.52-1.753l1.27-0.229l-0.225-3.398c-0.298-4.067-1.23-8.179-3.286-14.229l-1.494-4.521l-6.499,1.196
    		            c-3.589,0.635-8.892,1.494-11.768,1.865l-5.229,0.674v10.386v10.386h2.163C421.184,8000.243,424.583,8000.053,427.571,7999.867z
    		                M111.116,7996.503c1.606-0.972,2.612-3.286,3.359-7.617c1.641-9.785-3.101-20.654-13.521-30.815
    		            c-1.982-1.943-2.056-1.982-2.241-1.123c-0.601,2.876-1.045,8.364-1.011,13.594c0,8.706,0.898,14.048,3.252,19.165
    		            c1.792,3.96,3.735,6.05,6.46,7.021C109.246,7997.401,109.695,7997.362,111.116,7996.503z M333.816,7982.719v-7.056l-2.881-0.635
    		            c-19.16-4.111-37.163-9.414-54.795-16.064c-7.432-2.803-7.432-2.803-7.993-1.978c-0.298,0.41-1.719,2.09-3.14,3.657l-2.539,2.915
    		            l7.212,3.174c15.537,6.875,28.501,11.919,42.358,16.514c6.533,2.163,20.693,6.46,21.514,6.499
    		            C333.704,7989.779,333.816,7986.605,333.816,7982.719z M378.264,7971.405c-3.174-4.785-3.96-9.751-2.393-15.43
    		            c0.19-0.747,0-0.747-13.56-0.747c-7.544,0-16.06-0.146-18.862-0.298l-5.151-0.303v7.251c0,7.246,0,7.28,0.854,7.471
    		            c1.685,0.449,12.554,1.719,19.126,2.314c8.442,0.713,9.712,0.786,15.801,0.859l5.005,0.073L378.264,7971.405z M247.083,7965.985
    		            l-0.117-4.404l-23.306-11.694c-12.813-6.426-23.345-11.655-23.423-11.543c-0.073,0.078-0.22,1.538-0.371,3.286l-0.225,3.145
    		            l7.207,3.809c3.999,2.09,14.57,7.842,23.496,12.773s16.401,8.965,16.548,8.999C247.044,7970.355,247.117,7968.378,247.083,7965.985
    		            z M194.67,7968.788c0.078-0.488,0.522-4.893,0.938-9.824c0.41-4.932,0.859-9.414,0.967-9.971c0.19-0.859,0-1.162-1.04-1.792
    		            c-1.909-1.196-23.086-11.655-28.203-13.936l-4.595-2.056l-0.151,1.196c-0.371,2.28-2.578,27.49-2.427,27.603
    		            c0.073,0.078,3.252,1.011,7.061,2.095c3.809,1.045,11.206,3.174,16.436,4.707c5.229,1.528,9.824,2.764,10.156,2.803
    		            C194.187,7969.613,194.563,7969.237,194.67,7968.788z M333.816,7963.822v-4.673l-1.494,0.747
    		            c-4.819,2.466-11.543,2.505-17.485,0.151c-5.19-2.095-11.504-6.758-13.521-10.01c-0.669-1.162-1.045-1.309-4.409-2.09
    		            c-4.629-1.05-10.83-2.651-17.329-4.521c-2.803-0.786-5.156-1.455-5.269-1.455c-0.073,0-0.259,0.82-0.41,1.865
    		            c-0.151,1.006-0.674,3.135-1.196,4.707c-0.747,2.168-0.859,2.91-0.522,3.135c0.898,0.562,20.806,7.1,26.709,8.779
    		            c10.459,2.988,31.304,7.842,34.292,7.993C333.738,7968.49,333.816,7968.041,333.816,7963.822z M256.531,7958.964
    		            c2.354-1.157,4.746-2.837,5.903-4.072c0.859-0.894,0.859-0.972,0.186-1.191c-0.376-0.151-3.213-1.348-6.24-2.617
    		            c-3.848-1.606-5.601-2.207-5.713-1.87c-0.112,0.264-0.112,2.28-0.073,4.561l0.112,4.072l1.865,1.006
    		            c1.045,0.562,1.943,1.045,2.017,1.045C254.627,7959.896,255.52,7959.486,256.531,7958.964z M247.083,7951.645l-0.117-4.521
    		            l-13.071-5.791c-7.173-3.174-17.48-7.656-22.856-10.01l-9.79-4.219l-0.186,1.943c-0.151,1.045-0.264,2.539-0.337,3.325
    		            l-0.078,1.382l7.661,3.657c4.219,1.978,14.565,7.021,22.974,11.172c8.442,4.106,15.464,7.544,15.61,7.544
    		            C247.044,7956.161,247.117,7954.11,247.083,7951.645z M267.888,7947.538c0.933-2.056,2.275-6.577,2.017-6.841
    		            c-0.225-0.259-18.604-6.572-19.014-6.572c-0.264,0-0.376,1.646-0.298,4.556l0.112,4.595l7.656,3.066
    		            c4.219,1.68,7.881,3.101,8.145,3.101C266.765,7949.442,267.4,7948.583,267.888,7947.538z M197.249,7941.146
    		            c0.527-4.595,1.387-3.774-8.813-8.403c-10.269-4.668-24.429-10.459-24.766-10.127c-0.151,0.117-0.259,1.274-0.298,2.544
    		            l-0.073,2.314l6.533,2.837c3.589,1.572,10.981,5.083,16.436,7.773c5.454,2.725,10.088,4.966,10.308,4.966
    		            C196.799,7943.09,197.102,7942.191,197.249,7941.146z M297.918,7939.54c0-3.022,1.006-5.376,3.14-7.544
    		            c0.82-0.894,1.377-1.606,1.191-1.606c-2.275,0-19.458-3.101-26.294-4.707c-2.129-0.488-3.96-0.859-4.033-0.786
    		            c-0.078,0.078,0.298,1.685,0.781,3.589c0.522,1.865,1.045,4.331,1.162,5.454l0.259,2.056l1.943,0.557
    		            c2.09,0.635,20.093,5.117,21.592,5.381C297.766,7941.933,297.878,7940.888,297.918,7939.54z M247.083,7937.079l-0.117-4.526
    		            l-19.604-7.358c-25.962-9.746-26.26-9.819-26.001-9.15c0.112,0.337,0.225,2.017,0.225,3.735c0,1.724,0.146,3.14,0.337,3.14
    		            c0.41,0,17.144,6.948,33.657,13.97c6.05,2.578,11.167,4.707,11.313,4.707C247.044,7941.596,247.117,7939.579,247.083,7937.079z
    		                M269.568,7930.575c-0.225-1.23-0.747-3.286-1.157-4.595c-0.64-1.904-0.938-2.354-1.758-2.539
    		            c-0.562-0.151-4.258-1.157-8.218-2.241c-3.994-1.118-7.397-2.017-7.583-2.017c-0.562,0-0.41,8.813,0.151,9.263
    		            c0.22,0.186,4.556,1.719,9.6,3.325l9.15,2.988l0.112-0.972C269.939,7933.266,269.827,7931.845,269.568,7930.575z M96.624,7934.237
    		            c0-0.112,0.332-2.988,0.781-6.353c0.41-3.398,0.708-6.196,0.635-6.235c-0.034-0.039-1.23-0.562-2.612-1.123
    		            c-4.746-1.978-8.594-5.19-10.908-9.15c-1.343-2.354-1.528-2.427-7.021-2.837c-2.466-0.186-3.286-0.151-3.286,0.186
    		            c0,0.933,3.247,6.65,5.303,9.336c2.988,3.96,6.089,7.173,11.694,12.144C95.686,7934.198,96.624,7934.872,96.624,7934.237z
    		                M198.372,7929.008c0.186-2.393,0.112-3.101-0.225-3.174c-0.259,0-1.641-0.078-3.101-0.117c-3.101-0.073-5.117-0.967-7.656-3.32
    		            c-1.831-1.719-5.083-3.101-17.144-7.134l-5.942-1.982l-0.264,2.432c-0.146,1.343-0.107,2.578,0.078,2.725
    		            c0.151,0.146,2.91,1.23,6.089,2.427c5.977,2.241,18.677,7.544,24.277,10.161c1.758,0.82,3.291,1.382,3.403,1.27
    		            C198.035,7932.187,198.22,7930.688,198.372,7929.008z M247.083,7922.47l-0.117-4.521l-9.336-2.876
    		            c-5.117-1.602-14.868-4.59-21.665-6.685c-22.822-7.061-35.933-10.61-49.98-13.447c-11.841-2.427-25.283-4.556-34.663-5.488
    		            l-2.5-0.225l0.522,1.943c0.298,1.084,0.596,2.051,0.674,2.163c0.107,0.073,2.764,0.562,5.898,1.05c3.14,0.483,7.471,1.23,9.6,1.641
    		            c3.14,0.596,4.146,0.635,5.415,0.298c2.207-0.596,4.634-0.112,7.173,1.421c1.646,1.011,3.848,1.719,9.453,3.14
    		            c4.033,1.006,10.42,2.725,14.229,3.843c3.813,1.123,7.993,2.129,9.302,2.241c1.758,0.151,2.842,0.488,4.258,1.387
    		            c1.084,0.669,7.061,2.988,13.521,5.269c6.353,2.236,17.373,6.157,24.468,8.701c7.1,2.573,13.11,4.668,13.374,4.668
    		            C247.083,7927.03,247.151,7925.98,247.083,7922.47z M160.681,7924.076c0.151-1.23,0.151-2.388,0.034-2.612
    		            c-0.557-0.859-31.86-10.498-34.209-10.498c-0.337,0-1.162,0.674-1.836,1.494l-1.152,1.455l2.124,0.601
    		            c9.565,2.686,21.665,6.724,29.624,9.863c2.578,1.006,4.78,1.831,4.927,1.865C160.305,7926.278,160.53,7925.272,160.681,7924.076z
    		                M26.023,7918.139c0.708-0.376,1.831-1.46,2.466-2.393c1.157-1.68,2.725-6.426,2.28-6.87c-0.112-0.151-1.572-0.112-3.252,0.039
    		            c-2.954,0.259-3.022,0.293-3.511,1.489c-1.157,2.729-4.443,3.96-6.914,2.544c-1.377-0.825-1.714-0.527-1.191,1.118
    		            C17.092,7917.655,22.698,7919.892,26.023,7918.139z M161.389,7916.156c0.41-2.129,0.376-2.163-1.157-1.606
    		            c-1.904,0.674-3.325,0.64-5.752-0.073c-1.68-0.483-2.505-1.084-4.78-3.398c-2.28-2.354-3.101-2.915-4.668-3.325
    		            c-2.988-0.786-15.054-3.511-15.615-3.511c-0.264,0-0.674,0.562-0.898,1.23c-0.22,0.64-0.518,1.46-0.669,1.758
    		            c-0.186,0.449,0.972,0.859,6.201,2.168c6.313,1.606,20.093,5.64,24.204,7.134C161.018,7917.504,161.13,7917.504,161.389,7916.156z
    		                M184.211,7910.517c0.19-0.522,0-0.747-0.781-1.084c-1.68-0.635-18.936-5.562-19.536-5.562c-0.298,0-0.41,0.22-0.225,0.669
    		            c0.151,0.337,0.449,1.572,0.635,2.729l0.41,2.09l9.38,3.14l9.37,3.135l0.229-2.241
    		            C183.84,7912.162,184.065,7910.854,184.211,7910.517z M109.133,7908.876c1.23-0.298,2.393-0.713,2.544-0.859
    		            c0.146-0.151-1.235-0.562-3.105-0.864c-1.826-0.298-3.359-0.405-3.359-0.298c0,0.151-0.112,0.825-0.225,1.46
    		            c-0.225,1.084-0.186,1.157,0.859,1.157C106.448,7909.472,107.937,7909.208,109.133,7908.876z M99.983,7907.641
    		            c0-0.41,0.112-0.972,0.225-1.27c0.146-0.41-0.298-0.596-1.982-0.781c-1.191-0.151-2.651-0.337-3.286-0.454l-1.118-0.186
    		            l1.084,0.864c1.382,1.118,3.994,2.539,4.59,2.539C99.758,7908.354,99.983,7908.017,99.983,7907.641z M29.495,7906.635
    		            c0.825-0.151,1.387-0.415,1.387-0.747c0-0.635-0.112-0.635-3.999-0.073c-2.28,0.298-3.101,0.557-3.101,0.967
    		            C23.782,7907.304,25.051,7907.304,29.495,7906.635z M82.166,7905.287c-0.112-0.674-0.259-1.304-0.337-1.343
    		            c-0.039-0.073-2.129-0.225-4.595-0.337l-4.482-0.225l0.298,1.084c0.264,1.084,0.303,1.084,4.561,1.494
    		            c2.354,0.225,4.365,0.449,4.517,0.488C82.278,7906.449,82.312,7905.922,82.166,7905.287z M53.215,7905.136l7.173-0.259v-0.933
    		            v-0.898l-4.932,0.225c-12.329,0.635-17.852,1.118-17.852,1.68c0,0.752,0.82,0.864,4.482,0.64
    		            C44.251,7905.473,49.255,7905.253,53.215,7905.136z M117.166,7903.871c0.669-0.859,1.157-1.572,1.084-1.646
    		            c-0.264-0.225-11.953-1.792-12.144-1.646c-0.073,0.112-0.186,0.825-0.259,1.646l-0.078,1.421l4.673,0.82
    		            c2.578,0.444,4.854,0.82,5.117,0.859C115.784,7905.326,116.531,7904.691,117.166,7903.871z M26.921,7903.793
    		            c2.09-0.259,3.359-0.635,3.472-0.933s0.112-0.601,0.039-0.674c-0.151-0.186-4.854,0.562-8.892,1.382
    		            c-1.646,0.337-1.904,0.449-1.309,0.708c0.415,0.19,1.348,0.229,2.056,0.151C22.996,7904.315,25.09,7904.052,26.921,7903.793z
    		                M146.414,7902.113c0.073-1.196,0.112-2.241,0.073-2.28c-0.151-0.186-13.481-2.612-15.127-2.764l-1.309-0.112l-0.112,1.943
    		            c-0.112,1.792-0.034,1.982,0.747,2.168c0.488,0.073,3.735,0.786,7.212,1.533c3.511,0.747,6.421,1.416,6.499,1.489
    		            c0.073,0.078,0.522,0.151,0.972,0.151C146.116,7904.242,146.228,7904.018,146.414,7902.113z M100.842,7901.552
    		            c0.112-0.669,0.073-1.343-0.073-1.494c-0.19-0.186-8.521-1.045-10.347-1.045c-0.449,0-0.415,0.264,0.186,1.455l0.747,1.46
    		            l3.101,0.371c1.719,0.186,3.809,0.376,4.634,0.41C100.579,7902.748,100.657,7902.675,100.842,7901.552z M43.582,7901.854
    		            c3.174-0.303,8.257-0.674,11.279-0.825c5.454-0.259,5.454-0.259,5.64-1.196l0.186-0.933l-4.746,0.259
    		            c-4.517,0.225-18.75,1.685-19.048,1.943c-0.225,0.186,0.298,1.27,0.601,1.27C37.639,7902.372,40.403,7902.113,43.582,7901.854z
    		                M81.677,7899.95v-1.313h-4.668c-4.18,0-4.668,0.078-4.668,0.674c0,1.309,0.562,1.533,4.106,1.685
    		            c1.943,0.034,3.926,0.146,4.409,0.186C81.57,7901.254,81.677,7901.068,81.677,7899.95z M120.525,7897.479
    		            c0.225-0.859,0.337-1.606,0.225-1.714c-0.186-0.19-5.752-0.898-11.279-1.382l-2.651-0.264l-0.225,1.606
    		            c-0.112,0.859-0.186,1.606-0.146,1.68c0.034,0.039,2.949,0.41,6.421,0.859c3.511,0.449,6.426,0.894,6.499,0.972
    		            C119.705,7899.574,120.154,7898.866,120.525,7897.479z M41.897,7898.266c4.634-0.596,17.407-1.87,18.789-1.87
    		            c0.186,0,0.449-0.444,0.562-0.967l0.186-1.011l-3.062,0.264c-5.566,0.444-20.918,2.5-22.524,3.022
    		            c-0.449,0.151-0.264,1.309,0.225,1.309C36.184,7899.013,38.836,7898.676,41.897,7898.266z M101.624,7895.243l0.229-1.348
    		            l-3.965-0.225c-2.202-0.151-4.966-0.264-6.196-0.264h-2.168v1.499v1.489l2.915,0.039c1.567,0.039,4.146,0.151,5.674,0.298
    		            c1.533,0.112,2.915,0.151,3.027,0.039C101.292,7896.659,101.477,7895.985,101.624,7895.243z M82.766,7894.867
    		            c0.225-0.674,0.41-1.27,0.41-1.309c0-0.073-2.207-0.151-4.858-0.151H73.46l-0.371,0.977c-0.225,0.522-0.376,1.118-0.376,1.304
    		            s2.095,0.337,4.824,0.337h4.814L82.766,7894.867z M40.779,7894.716c5.078-0.82,19.683-2.798,20.879-2.798
    		            c0.449,0,1.533-1.831,1.235-2.095c-0.449-0.449-28.691,4.219-29.287,4.858c-0.337,0.337,0.298,0.967,0.972,0.967
    		            C34.91,7895.648,37.712,7895.243,40.779,7894.716z M121.047,7890.722c-0.146-0.898-0.371-1.758-0.522-1.904
    		            c-0.259-0.303-8.027-0.938-11.616-1.011c-1.343,0-1.382,0.039-1.533,1.606c-0.107,0.859-0.146,1.606-0.068,1.68
    		            c0.068,0.151,10.161,1.084,12.397,1.162l1.572,0.034L121.047,7890.722z M80.222,7890.795h4.336l1.006-1.494l1.011-1.528
    		            l-3.477,0.22c-7.28,0.449-8.14,0.596-8.516,1.309c-0.674,1.235-0.483,1.978,0.488,1.719
    		            C75.515,7890.907,77.835,7890.795,80.222,7890.795z M102.224,7890.458c0-0.186,0.112-0.859,0.225-1.494l0.259-1.157h-5.415h-5.381
    		            l-0.635,1.309c-0.332,0.747-0.63,1.421-0.63,1.489c0,0.117,2.612,0.19,5.791,0.19
    		            C99.607,7890.795,102.224,7890.644,102.224,7890.458z M83.919,7885.38l5.049-0.259l3.433-1.685
    		            c3.398-1.719,6.387-2.314,6.724-1.382c0.073,0.225-0.82,0.894-2.017,1.494l-2.168,1.084l3.887,0.112
    		            c2.129,0.039,3.921,0.039,3.994-0.039c0.337-0.298,1.382-9.6,1.162-9.863c-0.64-0.596-8.408-0.557-11.323,0.078
    		            c-5.977,1.27-11.948,5.005-15.049,9.336l-1.27,1.792l1.27-0.22C78.318,7885.712,81.155,7885.492,83.919,7885.38z M119.031,7884.892
    		            c0-0.522-2.017-3.135-3.398-4.443c-1.382-1.27-5.488-3.848-6.162-3.848c-0.259,0-0.596,1.382-0.859,3.286
    		            c-0.635,5.156-0.747,4.858,1.753,5.044C114.851,7885.189,119.031,7885.189,119.031,7884.892z" Fill="Black"></Path>
                        <Path Data="M37.341,7921.947c-0.82-0.82-0.898-1.157-0.708-2.5c0.337-2.095,1.494-3.252,3.208-3.252c2.319,0,3.965,2.319,3.027,4.331
    		                c-0.483,1.084-2.505,2.393-3.696,2.393C38.689,7922.919,37.903,7922.47,37.341,7921.947z" Fill="Black"></Path>
                    </Canvas>
                </Button.Content>
            </Button>
            <Label Grid.Column="0" Grid.Row="2" Content="Wecker-Datei:" VerticalAlignment="Center" />
            <Label Grid.Column="1" Grid.Row="2" x:Name="Lbl_Wecker_Datei" VerticalAlignment="Center" Foreground="Blue" FontWeight="Bold" />
            <Button Grid.Column="4" Grid.Row="2" x:Name="Btn_Wecker_Datei" Click="Btn_Wecker_Datei_Click" >
                <Button.Content>
                    <StackPanel Orientation="Horizontal">
                        <Canvas Width="27" Height="28" HorizontalAlignment="Center" VerticalAlignment="Bottom">
                            <Path Data="M24.164,12.808c0-6.007-4.872-10.884-10.884-10.884c-6.012,0-10.878,4.872-10.878,10.884c0,3.759,1.899,7.08,4.81,9.047
            				l-4.023,4.787c-0.197,0.242-0.174,0.567,0.067,0.765c0.208,0.207,0.606,0.151,0.765-0.068l4.129-4.917 
    		        		c1.529,0.809,3.275,1.287,5.135,1.287c1.86,0,3.608-0.46,5.137-1.287l4.129,4.917c0.275,0.275,0.601,0.225,0.764,0.068
    				        c0.242-0.197,0.265-0.545,0.068-0.765l-4.023-4.787C22.264,19.887,24.164,16.589,24.164,12.808z M13.28,21.461
    				        c-4.787,0-8.653-3.866-8.653-8.653s3.866-8.653,8.653-8.653s8.654,3.866,8.654,8.653S18.067,21.461,13.28,21.461z" Fill="Black"/>
                            <Path Data="M25.237,1.311c-1.77-1.747-4.63-1.747-6.383,0l6.383,6.383C26.984,5.947,26.984,3.081,25.237,1.311z" Fill="Black"></Path>
                            <Path Data="M1.327,1.311c-1.77,1.77-1.77,4.614,0,6.383l6.384-6.383C5.964-0.437,3.098-0.437,1.327,1.311z" Fill="Black"/>
                            <Path Data="M17.213,14.184l-3.389-1.702V5.795c0-0.303-0.242-0.545-0.545-0.545c-0.304,0-0.545,0.242-0.545,0.545v7.013
            				c0,0.197,0.106,0.393,0.303,0.483l3.692,1.86c0.27,0.129,0.607,0.045,0.719-0.241C17.589,14.662,17.477,14.313,17.213,14.184z" Fill="Black"/>
                        </Canvas>
                    </StackPanel>
                </Button.Content>
            </Button>
            <StackPanel Grid.Column="2" Grid.Row="2" Orientation="Horizontal" VerticalAlignment="Center" IsEnabled="{Binding Dp_Wecker_aktiv}">
                <Slider Name="Sl_Wecker_Volume" MinWidth="100" Margin="0,0,5,0" Minimum="0" Maximum="1" Value="{Binding Dp_Wecker_Volume}" 
                        IsSnapToTickEnabled="True" TickFrequency="0.05" TickPlacement="BottomRight" VerticalAlignment="Center"/>
                <TextBlock Text="{Binding ElementName=Sl_Wecker_Volume, Path=Value, Converter={StaticResource Dbl_Prozent_Konverter}}" Foreground="Gray" Margin="0,0,10,0" VerticalAlignment="Center" />
                <Button Name="Btn_Wecker_Play" Click="Btn_Wecker_Play_Click">
                    <Button.Content>
                        <Canvas Width="48" Height="48">
                            <Path Data="M20,33l12-9l-12-9V33z M24,4C12.95,4,4,12.95,4,24s8.95,20,20,20s20-8.95,20-20S35.05,4,24,4z M24,40c-8.82,0-16-7.18-16-16
                        	c0-8.82,7.18-16,16-16c8.82,0,16,7.18,16,16C40,32.82,32.82,40,24,40z" Fill="Black"/>
                        </Canvas>
                    </Button.Content>
                </Button>
                <Button Name="Btn_Wecker_Pause" Click="Btn_Wecker_Pause_Click" Margin="5,0,0,0">
                    <Button.Content>
                        <Canvas Width="40" Height="40" Margin="4">
                            <Ellipse Width="40" Height="40" Stroke="Black" StrokeThickness="4" StrokeLineJoin="Round" />
                            <Line Stroke="Black" StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" 
                                  StrokeLineJoin="Round" X1="17" Y1="25" X2="17" Y2="15"/>
                            <Line Stroke="Black" StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" 
                                  StrokeLineJoin="Round" X1="23" Y1="25" X2="23" Y2="15"/>
                        </Canvas>
                    </Button.Content>
                </Button>
                <Button Name="Btn_Wecker_Stop" Click="Btn_Wecker_Stop_Click" Margin="5,0">
                    <Button.Content>
                        <Canvas Width="40" Height="40" Margin="4">
                            <Ellipse Width="40" Height="40" Stroke="Black" StrokeThickness="4" />
                            <Rectangle Canvas.Left="12" Canvas.Top="12" Stroke="Black" StrokeThickness="3" StrokeLineJoin="Round" 
                                       StrokeStartLineCap="Round" StrokeEndLineCap="Round" Width="16" Height="16"/>
                        </Canvas>
                    </Button.Content>
                </Button>
            </StackPanel>
            <StackPanel Grid.Column="3" Grid.Row="2" VerticalAlignment="Center" Margin="0,0,3,0">
                <ProgressBar  x:Name="PB_Zeit" MinHeight="5" Foreground="Red"/>
                <Label x:Name="Lbl_Wecker_Info" />
            </StackPanel>
            <StackPanel Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,10,0,0">
                <Uhr:LED_UhrControl x:Name="luc_LED_Uhr" Time="{Binding AktZeit}" />
                <!--<Label Name="Lbl_AktZeit" Content="00:00:00" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"/>-->
            </StackPanel>
            <Button Grid.Column="2" Grid.Row="3" x:Name="Btn_Wecker_Aus" Click="Btn_Wecker_Aus_Click" Margin="5,10,5,0" ToolTip="Wecker Aus!" 
                    MinWidth="50" Height="{Binding ElementName=luc_LED_Uhr, Path=ActualHeight}" MinHeight="80" VerticalAlignment="Top" HorizontalAlignment="Center" >
                <Button.Content>
                    <Viewbox Margin="5">
                        <Canvas Width="24" Height="24">
                            <Path Data="M8.56,2.9c3.367-1.9,7.637-0.71,9.536,2.657C18.689,6.607,19,7.793,19,9v4 M17,17H2c1.657,0,3-1.344,3-3V9C4.999,7.88,5.266,6.775,5.78,5.78
    	                    M13.73,21c-0.555,0.955-1.778,1.281-2.734,0.727c-0.301-0.175-0.552-0.426-0.727-0.727" Fill="Black"></Path>
                            <Line StrokeThickness="2" StrokeLineJoin="Round"  Stroke="Black" StrokeStartLineCap="Round" StrokeEndLineCap="Round"  X1="1" Y1="1" X2="23" Y2="23"/>
                            <Polygon Stroke="Black" StrokeThickness="0.8" Points="0,0 24,0 24,24 0,24 0,0"  />
                        </Canvas>
                    </Viewbox>
                </Button.Content>
            </Button>
            <StackPanel Grid.Column="3" Grid.Row="3" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center">
                <Label DockPanel.Dock="Top"  Content="Weckzeit:" VerticalAlignment="Center"/>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                    <TextBox x:Name="Tbo_Weckzeit_Stunde" Width="23" Text="00"  PreviewTextInput="Tbo_Weckzeit_Stunde_PreviewTextInput" MaxLength="2" FontSize="16" />
                    <Label Content=":" Padding="1" />
                    <TextBox x:Name="Tbo_Weckzeit_Minute" Width="23" Text="00" PreviewTextInput="Tbo_Weckzeit_Minute_PreviewTextInput" MaxLength="2" FontSize="16"/>
                </StackPanel>
            </StackPanel>
        </Grid>
    </Window>

    • Als Antwort markiert ch.f.1 vor 9 Stunden 36 Minuten
    vor 11 Stunden 48 Minuten
  • Hallo Fred

     

    So klein ist Dein Gesamtprojekt doch nicht, für mich zumindest. Da werde ich einige Wochenenden dransitzen und in mehreren Bereichen sicher viele Fragen haben.

    Canvas habe ich noch nicht verwendet, aber ich sehe (durch Deinen eingefügten Code) unerschöpfliche Möglichkeiten.

    Auf jeden Fall hast Du erreicht, dass ich Visual Studio nun in jeder freien Minute verwende und nicht mehr so schnell aufgebe.

     

    Vielen Dank 👍👍👍

     

    Die Slider dienen nicht zum Anzeigen des Abspielfortschrittes

     

    Ja, ich weiß, bei Dir ist für den Abspielfortschritt jeweils eine Progress Bar für den Player und den Wecker vorhanden. Bei mir sind es Slider und TextBoxen. Könnte ich aber ändern, wenn es besser ist.

    Doch auch dafür hast Du mir heute die Lösung gegeben.

     

     (if (MP_Wecker.NaturalDuration.HasTimeSpan)   // Duration hat einen "Wert"?

     

     

    Wahrscheinlich melde ich mich erst nach dem Wochenende mit weiteren Fragen (die ich schon jetzt habe), bis dahin nochmal Danke und gesund bleiben.

     

    vor 9 Stunden 36 Minuten