private void btnProceed_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            // hide the controls once the training of the sign begins.
            lblTitle.Visibility = Visibility.Hidden;
            btnBack.Visibility = Visibility.Hidden;
            btnProceed.Visibility = Visibility.Hidden;
            lblProcessing.Visibility = Visibility.Visible;

            this.timer = new DispatcherTimer { IsEnabled = true, Interval = TimeSpan.FromSeconds(1) };
            timer.Tick += OnTimerEvent;
            timer.Start();

            trainingCommand = new AsyncDelegateCommand(action: CreateSignModel);
            trainingCommand.Execute(null);
        }
        private void btnSave_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            if(txtBoxSignName.Text == "")
            {
                MessageBox.Show("The sign name cannot be empty.", "Invalid sign name", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            else
            {
                MessageBoxResult result = MessageBox.Show("Are you sure that you wish to save changes?", "Are you sure?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
                if (result == MessageBoxResult.Yes)
                {
                    File.Delete(filePath);

                    // check if we need to re-train the model
                    if(examples == null)
                    {
                        // if we don't no need to show processing label

                         UpdateSignTextDetails();
                         Sign.ToFile(sign);
                         Switcher.Switch(new SignManager());

                    }
                    else
                    {
                        // Re-train the model, so show processing label

                        // Hide all the other controls
                        lblTitle.Visibility = Visibility.Hidden;
                        btnSave.Visibility = Visibility.Hidden;
                        btnBack.Visibility = Visibility.Hidden;
                        lblSignName.Visibility = Visibility.Hidden;
                        txtPictureURL.Visibility = Visibility.Hidden;
                        btnPicUpload.Visibility = Visibility.Hidden;
                        txtVideoURL.Visibility = Visibility.Hidden;
                        btnVidUpload.Visibility = Visibility.Hidden;
                        lblPicturePath.Visibility = Visibility.Hidden;
                        lblVideoPath.Visibility = Visibility.Hidden;
                        lblSignClassOutput.Visibility = Visibility.Hidden;
                        lblSignClass.Visibility = Visibility.Hidden;
                        txtBoxSignName.Visibility = Visibility.Hidden;
                        btnAddExamples.Visibility = Visibility.Hidden;
                        btnChangeClass.Visibility = Visibility.Hidden;
                        lblNewExampleCount.Visibility = Visibility.Hidden;

                        // Display processing label as it takes some time to append the training examples
                        lblProcessing.Visibility = Visibility.Visible;

                        this.timer = new DispatcherTimer { IsEnabled = true, Interval = TimeSpan.FromSeconds(1) };
                        timer.Tick += OnTimerEvent;
                        timer.Start();

                        trainingCommand = new AsyncDelegateCommand(action: CreateSignModel);
                        trainingCommand.Execute(null);
                    }

                }
                else if (result == MessageBoxResult.No)
                {
                    Switcher.Switch(new SignManager());
                }
            }
        }