private void ReturnToFirstScreenAnimation_Completed(object sender, EventArgs e)
        {
            // MessageBox.Show("Анимация завершена");

            imgLoading.Visibility   = Visibility.Collapsed;
            txtScreenTop.Visibility = Visibility.Visible;

            // Переходим на указанный экран
            //
            curScreen         = nextScreen;
            CurrentScreenInfo = listScreenInfo.FirstOrDefault(s => s.CurrentEnScreen == curScreen);
        }
        private void InputAnimation_Completed(object sender, EventArgs e)
        {
            // MessageBox.Show("Анимация завершена");

            // Выставляем флаг отработки транзакции - чтобы она отработала только 1 раз
            //
            if (IsAnimationCompleted)
            {
                return;
            }
            IsAnimationCompleted = true;

            imgLoading.Visibility   = Visibility.Collapsed;
            txtScreenTop.Visibility = Visibility.Visible;

            // imgLoading2.Visibility = Visibility.Collapsed;


            // пробуем внести указанное кол-во указанных купюр
            //
            string status = InputTransaction();

            if (status.Length > 0)
            {
                txtErrorInfo.Text = status; // "Банкомат не имеет возможности принять все указанные купюры.";
            }
            else
            {
                txtErrorInfo.Text = "";
            }

            // Переходим на указанный экран
            //
            curScreen         = nextScreen;
            CurrentScreenInfo = listScreenInfo.FirstOrDefault(s => s.CurrentEnScreen == curScreen);
        }
        //
        //-----------    Вспомогательные функции  ---------------
        //

        #region NextScreenInfo()

        /// <summary>
        /// Переходим на указанный экран
        /// </summary>
        /// <param name="nextScreen">Требуемый экран, к которому хотим перейти</param>
        /// <returns></returns>
        bool NextScreenInfo(EnScreens screen)
        {
            if (screen == EnScreens.OutputResult)
            {
                //
                //----------   Экран выдачи денег     ------
                //

                // Запоминаем индекс требуемого к переходу экрана и запускаем анимацию
                //
                nextScreen = screen;


                // Показываем анимацию
                //
                // imgLoading
                DoubleAnimation imgAnimation = new DoubleAnimation();
                imgAnimation.From        = 0; //  imgLoading.Opacity;
                imgAnimation.To          = 1;
                imgAnimation.Duration    = TimeSpan.FromSeconds(1);
                imgAnimation.AutoReverse = true;
                imgAnimation.Completed  += OutputAnimation_Completed;

                txtScreenTop.Visibility = Visibility.Collapsed;

                // Выставляем флаг отработки транзакции - чтобы она отработала только 1 раз
                //
                IsAnimationCompleted = false;

                imgLoading.Visibility = Visibility.Visible;
                imgLoading.BeginAnimation(Image.OpacityProperty, imgAnimation);

                //// Дополнительно показываем анимацию в блоке состояния банкомата
                ////
                //imgLoading2.Visibility = Visibility.Visible;
                //imgLoading2.BeginAnimation(Image.OpacityProperty, imgAnimation);
            }
            else if (screen == EnScreens.InputResult)
            {
                //
                //----------   Экран внесения денег     ------
                //

                // Запоминаем индекс требуемого к переходу экрана и запускаем анимацию
                //
                nextScreen = screen;


                // Показываем анимацию
                //
                // imgLoading
                DoubleAnimation imgAnimation = new DoubleAnimation();
                imgAnimation.From        = 0; //  imgLoading.Opacity;
                imgAnimation.To          = 1;
                imgAnimation.Duration    = TimeSpan.FromSeconds(1);
                imgAnimation.AutoReverse = true;
                imgAnimation.Completed  += InputAnimation_Completed;

                txtScreenTop.Visibility = Visibility.Collapsed;

                // Выставляем флаг отработки транзакции - чтобы она отработала только 1 раз
                //
                IsAnimationCompleted = false;

                imgLoading.Visibility = Visibility.Visible;
                imgLoading.BeginAnimation(Image.OpacityProperty, imgAnimation);

                //// Дополнительно показываем анимацию в блоке состояния банкомата
                ////
                //imgLoading2.Visibility = Visibility.Visible;
                //imgLoading2.BeginAnimation(Image.OpacityProperty, imgAnimation);
            }
            else
            {
                // Переходим на указанный экран
                //
                curScreen         = screen;
                CurrentScreenInfo = listScreenInfo.FirstOrDefault(s => s.CurrentEnScreen == curScreen);
            }
            return(true);
        }
        /// <summary>
        /// Инициализатор списка держателей карт и списка полей экранов
        /// </summary>
        /// <returns></returns>
        bool InitializeScreenInfo()
        {
            // Инициализатор списка кол-ва и типов купюр в банкомате
            //
            listATM = new List <Banknote>();

            Banknote note0 = new Banknote()
            {
                Title = "10", MaxAmount = 2000, CurAmount = 1950
            };
            Banknote note1 = new Banknote()
            {
                Title = "50", MaxAmount = 2000, CurAmount = 10
            };
            Banknote note2 = new Banknote()
            {
                Title = "100", MaxAmount = 1000, CurAmount = 980
            };
            Banknote note3 = new Banknote()
            {
                Title = "500", MaxAmount = 1000, CurAmount = 12
            };
            Banknote note4 = new Banknote()
            {
                Title = "1000", MaxAmount = 500, CurAmount = 492
            };
            Banknote note5 = new Banknote()
            {
                Title = "5000", MaxAmount = 100, CurAmount = 1
            };

            listATM.AddRange(new Banknote[] { note0, note1, note2, note3, note4, note5 });

            // Устанавливаем у lvATM источник данных
            //
            lvATM.ItemsSource = listATM;



            // Инициализируем список с информацией о последних проведенных транзакциях
            //
            listLastTransInfo = new ObservableCollection <LastTransInfo>();

            // Устанавливаем у lvLastTransaction источник данных
            //
            lvLastTransaction.ItemsSource = listLastTransInfo;



            // Инициализатор списка держателей карт
            //
            listCardholders = new List <Cardholder>();

            Cardholder holder0 = new Cardholder()
            {
                Name = "Иванов И.И.", Balans = 3000
            };
            Cardholder holder1 = new Cardholder()
            {
                Name = "Петров П.П.", Balans = 9000
            };
            Cardholder holder2 = new Cardholder()
            {
                Name = "Сидоров С.С.", Balans = 14000
            };
            Cardholder holder3 = new Cardholder()
            {
                Name = "Кузнецов К.К.", Balans = 17000
            };

            listCardholders.AddRange(new Cardholder[] { holder0, holder1, holder2, holder3 });


            // Инициализатор списка полей экранов
            //
            listScreenInfo = new List <ScreenInfo>();

            ScreenInfo screen0 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.Initial, Screen1 = "", Screen2 = "", Screen3 = "", Screen4 = "", Screen5 = holder0.Name, Screen6 = holder1.Name, Screen7 = holder2.Name, Screen8 = holder3.Name, ScreenTop = "Добро пожаловать!\r\nВставьте Вашу карту в банкомат", HelpInfo = "Чтобы имитировать вставку карты - нажмите кнопку рядом с владельцем карты"
            };

            ScreenInfo screen1 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.Password, Screen1 = "", Screen2 = "", Screen3 = "", Screen4 = "", Screen5 = "", Screen6 = "", Screen7 = "", Screen8 = "Вернуть карту", ScreenTop = "Используя кнопки от 0 до 9 ведите пин-код: ", HelpInfo = "Чтобы имитировать ввод реального ПИН-кода - введите любой четырехзначный код с цифровой клавиатуры"
            };

            ScreenInfo screen2 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.Actions, Screen1 = "", Screen2 = "", Screen3 = "", Screen4 = "", Screen5 = "Внесение наличных", Screen6 = "Выдача наличных", Screen7 = "", Screen8 = "Вернуть карту", ScreenTop = "Добро пожаловать, выберите требуемую операцию:", HelpInfo = "Чтобы выбрать требуемую операцию - просто нажмите на кнопку справа от нее"
            };

            ScreenInfo screen3 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.OutputSum, Screen1 = "500", Screen2 = "1000", Screen3 = "3000", Screen4 = "5000", Screen5 = "10000", Screen6 = "15000", Screen7 = "20000", Screen8 = "Вернуть карту", ScreenTop = "Выберите сумму для снятия", HelpInfo = "Чтобы выбрать необходимую сумму для снятия - нажмите кнопку рядом с требуемой суммой"
            };

            ScreenInfo screen4 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.OutputBanknote, Screen1 = "10", Screen2 = "50", Screen3 = "100", Screen4 = "500", Screen5 = "1000", Screen6 = "5000", Screen7 = "Назад", Screen8 = "Вернуть карту", ScreenTop = "Выберите купюрами какого достоинства произвести выдачу", HelpInfo = "Чтобы выбрать необходимый тип купюр - нажмите кнопку рядом с требуемым типом купюр"
            };

            ScreenInfo screen5 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.OutputResult, Screen1 = "", Screen2 = "", Screen3 = "", Screen4 = "", Screen5 = "", Screen6 = "", Screen7 = "Другие операции", Screen8 = "Вернуть карту", ScreenTop = "Заберите Ваши деньги из окна выдачи", HelpInfo = "Производится операция выдачи наличных из банкомата"
            };

            ScreenInfo screen6 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.InputBanknote, Screen1 = "10", Screen2 = "50", Screen3 = "100", Screen4 = "500", Screen5 = "1000", Screen6 = "5000", Screen7 = "", Screen8 = "Вернуть карту", ScreenTop = "Выберите купюры какого достоинства будут внесены на Ваш счет", HelpInfo = "Чтобы выбрать необходимый тип купюр - нажмите кнопку рядом с требуемым типом купюр"
            };

            ScreenInfo screen7 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.InputQuantity, Screen1 = "5", Screen2 = "10", Screen3 = "15", Screen4 = "20", Screen5 = "25", Screen6 = "30", Screen7 = "Назад", Screen8 = "Вернуть карту", ScreenTop = "Выберите количество вносимых купюр", HelpInfo = "Чтобы выбрать вносимое количество купюр - нажмите кнопку рядом с вносимым количеством купюр"
            };

            ScreenInfo screen8 = new ScreenInfo()
            {
                CurrentEnScreen = EnScreens.InputResult, Screen1 = "", Screen2 = "", Screen3 = "", Screen4 = "", Screen5 = "", Screen6 = "", Screen7 = "Другие операции", Screen8 = "Вернуть карту", ScreenTop = "Купюры приняты банкоматом", HelpInfo = "Производится операция внесения наличных в банкомат"
            };

            listScreenInfo.AddRange(new ScreenInfo[] { screen0, screen1, screen2, screen3, screen4, screen5, screen6, screen7, screen8 });
            return(true);
        }