private void RescanButton_Click(object sender, RoutedEventArgs e)
 {
     if (lockTracks)
     {
         return;
     }
     Task.Run(() =>
     {
         Track[] data = tracks.ToArray();
         this.Dispatcher.Invoke(() =>
         {
             lockTracks                  = true;
             ProgBar.Visibility          = Visibility.Visible;
             ProgBarText.Visibility      = Visibility.Visible;
             trackList.AllowDrop         = false;
             dragTracksMessage.AllowDrop = false;
             tracks.Clear();
         });
         for (int i = 0; i < data.Length; i++)
         {
             TrackUtilities.AddFileToTracks(data[i].Path, ref tracks);
             this.Dispatcher.Invoke(() =>
             {
                 ProgBar.Value    = ((double)i / (double)data.Length) * 100;
                 ProgBarText.Text = "" + i + " / " + data.Length;
             });
         }
         this.Dispatcher.Invoke(() =>
         {
             ((ListCollectionView)trackList.ItemsSource).Refresh();
             trackList.Items.Refresh();
             lockTracks                  = false;
             ProgBar.Visibility          = Visibility.Hidden;
             ProgBarText.Visibility      = Visibility.Hidden;
             ProgBar.Value               = 0;
             ProgBarText.Text            = "";
             trackList.AllowDrop         = true;
             dragTracksMessage.AllowDrop = true;
             if (data.Length != tracks.Count)
             {
                 MessageBox.Show("" + (data.Length - tracks.Count) + " files could not be found and were removed.");
             }
         });
     });
 }
        private void TrackList_Drop(object sender, DragEventArgs e)
        {
            if (lockTracks)
            {
                return;
            }
            Task.Run(() =>
            {
                this.Dispatcher.Invoke(() =>
                {
                    lockTracks                  = true;
                    ProgBar.Visibility          = Visibility.Visible;
                    ProgBarText.Visibility      = Visibility.Visible;
                    trackList.AllowDrop         = false;
                    dragTracksMessage.AllowDrop = false;
                });
                if (e.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

                    int numFiles = files.Length;

                    bool showFailMessage      = false;
                    bool showInvalidExtension = false;
                    bool showMissingMessage   = false;
                    int i = 0;
                    foreach (string f in files)
                    {
                        string fileName = f;
                        if (fileName.EndsWith(".lnk"))
                        {
                            try
                            {
                                IWshRuntimeLibrary.WshShell wsh          = new IWshRuntimeLibrary.WshShell();
                                IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(fileName);
                                fileName = shortcut.TargetPath;
                            }
                            catch (Exception)
                            {
                                showFailMessage = true;
                                continue;
                            }
                        }
                        if (!File.Exists(fileName) && !Directory.Exists(fileName))
                        {
                            showMissingMessage = true;
                            continue;
                        }
                        if (Directory.Exists(fileName)) //is Folder
                        {
                            string[][] sub = { Directory.GetFiles(fileName, "*.mp3"), Directory.GetFiles(fileName, "*.m4a"), Directory.GetFiles(fileName, "*.aac"), Directory.GetFiles(fileName, "*.wma") };
                            numFiles      += sub[0].Length + sub[1].Length + sub[2].Length + sub[3].Length;
                            foreach (string[] type in sub)
                            {
                                foreach (string trk in type)
                                {
                                    this.Dispatcher.Invoke(() =>
                                    {
                                        ProgBar.Value    = ((double)++i / (double)numFiles) * 100;
                                        ProgBarText.Text = "" + i + " / " + numFiles;
                                    });
                                    if (!TrackUtilities.AddFileToTracks(trk, ref tracks))
                                    {
                                        showFailMessage = true;
                                    }
                                }
                            }
                        }
                        else if (TrackUtilities.IsValidAudioExt(fileName))
                        {
                            if (!TrackUtilities.AddFileToTracks(fileName, ref tracks))
                            {
                                showFailMessage = true;
                            }
                        }
                        else
                        {
                            showInvalidExtension = true;
                            continue;
                        }
                        this.Dispatcher.Invoke(() =>
                        {
                            ProgBar.Value    = ((double)++i / (double)numFiles) * 100;
                            ProgBarText.Text = "" + i + " / " + numFiles;
                        });
                    }
                    if (showFailMessage)
                    {
                        MessageBox.Show("Failed to parse tags in one or more files");
                    }
                    if (showInvalidExtension)
                    {
                        MessageBox.Show("One or more files were skipped due to an invalid extension.");
                    }
                    if (showMissingMessage)
                    {
                        MessageBox.Show("One or more files were missing, so they were skipped.");
                    }

                    this.Dispatcher.Invoke(() =>
                    {
                        ((ListCollectionView)trackList.ItemsSource).Refresh();
                        trackList.Items.Refresh();
                    });
                }
                this.Dispatcher.Invoke(() =>
                {
                    lockTracks                  = false;
                    ProgBar.Visibility          = Visibility.Hidden;
                    ProgBarText.Visibility      = Visibility.Hidden;
                    ProgBar.Value               = 0;
                    ProgBarText.Text            = "";
                    trackList.AllowDrop         = true;
                    dragTracksMessage.AllowDrop = true;
                });
            });
        }