Иногда, при разработке приложений Blazor, необходимо показать пользователю прогресс какой-либо длительной операции. Например, прогресс загрузки большого файла на сервер. Обычно, для этих целей используются небольшие анимации или компоненты типа ProgressBar. И сегодня мы рассмотрим как использовать компонент Progress из Bootstrap в наших приложениях Blazor.
Компонент Bootstrap Progress
Компонент Bootstrap Progress представляет собой настраиваемый индикатор выполнения с поддержкой составных полос, анимированных фонов и текстовых меток. Компонент Progress состоит из двух HTML-элементов div, CSS для установки ширины и нескольких атрибутов. Например:
<div class="progress"> <div class="progress-bar" role="progressbar" style="width: 25%;" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">25%</div> </div>
получим следующую полосу прогресса:
за ширину заливки отвечает атрибут style. Также, как и прочие компоненты Bootstrap, Progress позволяет менять стиль заливки, а также анимировать заливку, используя специальные классы. В принципе, этой информации нам достаточно, чтобы собрать свой компонент Blazor ProgressBar с необходимыми настройками.
Компонент Blazor ProgressBar
Создадим новое приложение Blazor и добавим новый компонент в проект. Назовем его ProgressBar:
Теперь объявим у нашего компонента следующие параметры и методы:
@code {
[Parameter]
public string Title { get; set; }
[Parameter]
public bool ShowProgress { get; set; }
[Parameter]
public int CurrentValue { get; set; }
[Parameter]
public bool Animated { get; set; }
[Parameter]
public string CustomCssClass { get; set; }
private string text = "";
private string css = "";
protected override void OnParametersSet()
{
if (ShowProgress)
{
text = $"{CurrentValue}%";
}
if (Animated)
{
css = $"{CustomCssClass} progress-bar-striped progress-bar-animated";
}
else
{
css = "";
}
}
}
Title — добавит заголовок для компонента; ShowProgress — указывает на то, будет ли отображаться текст в компоненте, например, «10%», «20%» и т.д. CurrentValue — текущее значение прогресса; Animated — анимировать прогресс. При анимации полоска плавно заполняет компонент; CustomCssClass — дополнительные значения атрибута class компонента, например, «bg-success» сделает заливку полоски прогресса зеленой.
В компоненте мы переопределили один из методов жизненного цикла компонентов Blazor — OnParametersSet для того, чтобы при получении новых значений параметров компонент мог корректно перерисовываться.
Теперь добавим необходимую HTML-разметку компонента:
@page "/progress"
<h3>@Title</h3>
<div class="progress">
<div class="progress-bar @css" aria-valuetext="@text" role="progressbar" style="width: @CurrentValue%" aria-valuenow="@CurrentValue" aria-valuemin="0" aria-valuemax="100">
@text
</div>
</div>
Проверим работу компонента добавив на главную страницу приложения (index.razor) следующий код:
@page "/"
<button class="btn btn-success" @onclick="Click">Запуск</button>
<button class="btn btn-danger" @onclick="Reset">Сброс</button>
<ProgressBar
CurrentValue="@i"
ShowProgress="true"
Animated="true"
CustomCssClass="@css"
Title="Взлом Пентагона"/>
@code
{
int i = 0;
string css = "bg-success";
public async Task Click()
{
while (i < 100)
{
i++;
if ((i > 30) && (i < 80))
css = "bg-warning";
else
if (i > 80)
css = "bg-danger";
await Task.Delay(100);
}
}
public void Reset()
{
i = 0;
css = "bg-success";
}
}
При достижении определенного прогресса ProgressBar должен будет сменить свой цвет. Запустим приложение и посмотрим на результат:
Как видно из представленных скриншотов, компонент работает, меняя свою окраску по заданному в коде главной страницы алгоритму.
Итого
Сегодня мы научились добавлять в свои приложения Blazor компоненты Bootstrap, превращая их в полноценные компоненты Razor. При этом, нам не потребовалось использовать ничего того, чего бы мы не узнали, разрабатывая свои первые компоненты Blazor. Компонент Bootstrap Progress имеет также и другие дополнительные свойства, например, позволяя делать составные полосы загрузки, менять ширину полосы и т.д. Так что, можете самостоятельно потренироваться и создать свой собственный ProgressBar.




