/
ManokhinNikita
/
ManokhinSoftwareEngineering
Обзор
Документация
Войти
/
ManokhinNikita
/
ManokhinSoftwareEngineering
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
ProgressWindow/ViewModels/ProgressWindowViewModel.cs
196 строк
5 KB
ManokhinNikita
Сделал правки во второй лабораторной работе
24 дек 2025, 15:09
24 дек 2025, 15:09
1a47c55
Код
Авторство
О чём код?
using System; using ReactiveUI; namespace ProgressWindow.ViewModels; /// <summary> /// ViewModel окна прогресса с поддержкой отмены и завершения. /// </summary> public class ProgressWindowViewModel : ReactiveObject { private string _title = "Ход операции"; private string _caption = "Подготовка данных…"; private string? _subtitle = "Ожидайте запуска"; private double _progressValue; private double _progressMax = 1; private string _progressSummary = "0 / 1"; private string _actionText = "Прервать"; private bool _isActionEnabled = true; private bool _isCompleted; /// <summary> /// Команда для кнопки действия (отмена/закрытие). /// </summary> public TriggerCommand ActionCommand { get; } /// <summary> /// Событие запроса отмены операции. /// </summary> public event EventHandler? CancelRequested; /// <summary> /// Событие запроса закрытия окна. /// </summary> public event EventHandler? CloseRequested; /// <summary> /// Заголовок окна. /// </summary> public string Title { get => _title; set => this.RaiseAndSetIfChanged(ref _title, value); } /// <summary> /// Основная подпись. /// </summary> public string Caption { get => _caption; set => this.RaiseAndSetIfChanged(ref _caption, value); } /// <summary> /// Подзаголовок шага. /// </summary> public string? Subtitle { get => _subtitle; set => this.RaiseAndSetIfChanged(ref _subtitle, value); } /// <summary> /// Текущее значение прогресса. /// </summary> public double ProgressValue { get => _progressValue; set => this.RaiseAndSetIfChanged(ref _progressValue, value); } /// <summary> /// Максимальное значение прогресса. /// </summary> public double ProgressMax { get => _progressMax; set => this.RaiseAndSetIfChanged(ref _progressMax, value); } /// <summary> /// Текстовое представление прогресса. /// </summary> public string ProgressSummary { get => _progressSummary; set => this.RaiseAndSetIfChanged(ref _progressSummary, value); } /// <summary> /// Текст кнопки действия. /// </summary> public string ActionText { get => _actionText; set => this.RaiseAndSetIfChanged(ref _actionText, value); } /// <summary> /// Доступность кнопки. /// </summary> public bool IsActionEnabled { get => _isActionEnabled; set { this.RaiseAndSetIfChanged(ref _isActionEnabled, value); ActionCommand.RaiseCanExecuteChanged(); } } /// <summary> /// Флаг завершения операции. /// </summary> public bool IsCompleted { get => _isCompleted; set { this.RaiseAndSetIfChanged(ref _isCompleted, value); ActionCommand.RaiseCanExecuteChanged(); } } /// <summary> /// Подсказка по отмене. /// </summary> public string CancelHint { get; } = "Alt+F4 прервёт выполнение"; /// <summary> /// Создаёт ViewModel окна прогресса. /// </summary> public ProgressWindowViewModel() { ActionCommand = new TriggerCommand(HandleAction, () => IsActionEnabled || IsCompleted); } /// <summary> /// Переводит окно в состояние завершения. /// </summary> /// <param name="parSubtitle">Итоговый подзаголовок.</param> public void SwitchToCompletionState(string? parSubtitle) { IsCompleted = true; IsActionEnabled = true; ActionText = "Закрыть"; if (parSubtitle != null) { Subtitle = parSubtitle; } } /// <summary> /// Переводит кнопку в состояние ожидания отмены. /// </summary> public void ShowCancellationRequest() { ActionText = "Прерываем…"; IsActionEnabled = false; } /// <summary> /// Обновляет прогресс и подписи. /// </summary> /// <param name="parValue">Текущее значение.</param> /// <param name="parMax">Максимум.</param> /// <param name="parSubtitle">Новый подзаголовок.</param> public void UpdateProgress(double parValue, double parMax, string? parSubtitle) { ProgressValue = Math.Min(parValue, parMax); ProgressMax = parMax; ProgressSummary = $"{ProgressValue:N0} / {ProgressMax:N0}"; if (parSubtitle != null) { Subtitle = parSubtitle; } } private void HandleAction() { if (IsCompleted) { CloseRequested?.Invoke(this, EventArgs.Empty); return; } if (!IsActionEnabled) { return; } IsActionEnabled = false; CancelRequested?.Invoke(this, EventArgs.Empty); } }