using System; using System.ComponentModel; using System.Windows; namespace ProgressWindow; /// /// Interaction logic for ProgressBar.xaml /// public partial class ProgressBarWindow : Window { /// /// Событие, вызываемое при отмене задачи. /// public event EventHandler? Cancelled; /// /// Объект для синхронизации доступа к переменным. /// private readonly object _lock = new(); /// /// Флаг, указывающий, нужно ли автоматически закрывать окно по завершении задачи. /// private readonly bool _autoClose; /// /// Максимальное значение прогресса. /// private readonly int _maxProgress; /// /// Текущее значение прогресса. /// private int _progress = 0; /// /// Флаг, указывающий, была ли задача отменена. /// private bool _isCancelled = false; /// /// Флаг, указывающий, завершена ли задача. /// private bool _isCompleted = false; /// /// Конструктор для инициализации окна прогресса. /// /// Заголовок окна. /// Начальное сообщение для отображения. /// Максимальное значение прогресса. /// Флаг, указывающий, должно ли окно закрываться автоматически по завершении. public ProgressBarWindow(string parTitle, string parInitialMessage, int parMaxProgress, bool parAutoClose = true) { InitializeComponent(); Title = parTitle; _messageTextBlock.Text = parInitialMessage; _maxProgress = parMaxProgress; _autoClose = parAutoClose; } /// /// Увеличивает текущий прогресс на указанную величину и обновляет сообщение, если предоставлено. /// /// Количество единиц, на которое нужно увеличить прогресс. /// Сообщение для отображения в окне (опционально). /// Возвращает true, если задача была отменена. public bool AdvanceProgress(int parIncrement = 1, string? parMessage = null) { lock (_lock) { _progress += parIncrement; if (_progress >= _maxProgress) { _progress = _maxProgress; _isCompleted = true; _cancelButton.Content = "Close"; } if (parMessage != null) _messageTextBlock.Text = parMessage; _progressBar.Value = (double)_progress / (double)_maxProgress * 100; _progressBar.ToolTip = $"{_progress}/{_maxProgress} {parMessage}"; if (_isCompleted && _autoClose) Close(); } return _isCancelled; } /// /// Обработчик события закрытия окна. /// /// Источник события. /// Аргументы события закрытия окна. private void Window_Closing(object parSender, CancelEventArgs parE) { if (_isCompleted) return; if (!_isCancelled) Cancel(); } /// /// Обработчик события нажатия на кнопку "Cancel/Close". /// /// Источник события. /// Аргументы события. private void CancelButton_Click(object parSender, RoutedEventArgs parE) { if (!_isCompleted) Cancel(); Close(); } /// /// Выполняет отмену задачи и отключает кнопку отмены. /// private void Cancel() { if (_isCancelled) return; _cancelButton.IsEnabled = false; _isCancelled = true; Cancelled?.Invoke(this, EventArgs.Empty); } }