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);
}
}