Индикатор выполнения всплывающего уведомления и привязка данных

Индикатор хода выполнения внутри всплывающего уведомления позволяет указать пользователю состояние продолжительных операций, таких как скачивание, обработка видео, цели упражнения и многое другое.

Важно!

Требуется обновление Creators Update и библиотека уведомлений версии 1.4.0. Необходимо использовать пакет SDK 15063 и использовать сборку 15063 или более поздней версии, чтобы использовать индикаторы выполнения для всплывающих уведомлений. Для создания индикатора выполнения в содержимом всплывающего уведомления необходимо использовать библиотеку NuGet для средств сообщества UWP версии 1.4.0 или более поздней.

Индикатор выполнения внутри всплывающего уведомления может быть "неопределенным" (нет определенного значения, анимированные точки указывают на то, что операция выполняется) или "determinate" (определенный процент отрезка заполнен, например 60%).

Важные API-интерфейсы: класс NotificationData, метод ToastNotifier.Update, класс ToastNotification

Примечание

Только настольные компьютеры поддерживают индикаторы выполнения во всплывающих уведомлениях. На других устройствах индикатор выполнения удаляется из уведомления.

На рисунке ниже показано определенный индикатор хода выполнения со всеми свойствами.

Всплывающее уведомление со свойствами индикатора выполнения с метками
Свойство Тип Обязательно Описание
Заголовок string или BindableString false Получает или задает необязательную строку заголовка. Поддерживает привязку данных.
Значение double, AdaptiveProgressBarValue или BindableProgressBarValue false Получает или задает значение индикатора хода выполнения. Поддерживает привязку данных. Значение по умолчанию — 0. Значение double в диапазоне от 0,0 до 1,0, AdaptiveProgressBarValue.Indeterminate или new BindableProgressBarValue("myProgressValue").
ValueStringOverride string или BindableString false Получает или задает необязательную строку для отображения вместо строки процентов по умолчанию. Если строка не указана, отображается текст, например "70 %".
Состояние string или BindableString Да Получает или задает строку состояния (обязательную), которая отображается под индикатором хода выполнения слева. Эта строка должна отражать состояние операции, например, "Загрузка..." или "Установка...".

Вот,как создается уведомление, представленное выше...

new ToastContentBuilder()
    .AddText("Downloading your weekly playlist...")
    .AddVisualChild(new AdaptiveProgressBar()
    {
        Title = "Weekly playlist",
        Value = 0.6,
        ValueStringOverride = "15/26 songs",
        Status = "Downloading..."
    });

Однако вам потребуется динамически обновлять значения индикатора хода выполнения, чтобы он был "динамическим". Для этого можно использовать привязку данных для обновления всплывающего уведомления.

Использование привязки данных для обновления всплывающего уведомления

Использование привязки данных состоит из следующих действий...

  1. Создайте содержимое всплывающего уведомления, которое использует поля с привязкой к данным
  2. Назначьте Tag (и при необходимости Group) объекту ToastNotification
  3. Определите начальные значения Data в ToastNotification
  4. Отправьте всплывающее уведомление
  5. Используйте Tag b Group для обновления значений Data

В следующем фрагменте кода показаны шаги 1–4. В следующем фрагменте показано, как обновить значения Data всплывающего уведомления.

using Windows.UI.Notifications;
using Microsoft.Toolkit.Uwp.Notifications;
 
public void SendUpdatableToastWithProgress()
{
    // Define a tag (and optionally a group) to uniquely identify the notification, in order update the notification data later;
    string tag = "weekly-playlist";
    string group = "downloads";
 
    // Construct the toast content with data bound fields
    var content = new ToastContentBuilder()
        .AddText("Downloading your weekly playlist...")
        .AddVisualChild(new AdaptiveProgressBar()
        {
            Title = "Weekly playlist",
            Value = new BindableProgressBarValue("progressValue"),
            ValueStringOverride = new BindableString("progressValueString"),
            Status = new BindableString("progressStatus")
        })
        .GetToastContent();
 
    // Generate the toast notification
    var toast = new ToastNotification(content.GetXml());
 
    // Assign the tag and group
    toast.Tag = tag;
    toast.Group = group;
 
    // Assign initial NotificationData values
    // Values must be of type string
    toast.Data = new NotificationData();
    toast.Data.Values["progressValue"] = "0.6";
    toast.Data.Values["progressValueString"] = "15/26 songs";
    toast.Data.Values["progressStatus"] = "Downloading...";
 
    // Provide sequence number to prevent out-of-order updates, or assign 0 to indicate "always update"
    toast.Data.SequenceNumber = 1;
 
    // Show the toast notification to the user
    ToastNotificationManager.CreateToastNotifier().Show(toast);
}

Затем, если вы хотите изменить значения Data, используйте метод Update, чтобы предоставить новые данные без повторного создания всех полезных данных всплывающего уведомления.

using Windows.UI.Notifications;
 
public void UpdateProgress()
{
    // Construct a NotificationData object;
    string tag = "weekly-playlist";
    string group = "downloads";
 
    // Create NotificationData and make sure the sequence number is incremented
    // since last update, or assign 0 for updating regardless of order
    var data = new NotificationData
    {
        SequenceNumber = 2
    };

    // Assign new values
    // Note that you only need to assign values that changed. In this example
    // we don't assign progressStatus since we don't need to change it
    data.Values["progressValue"] = "0.7";
    data.Values["progressValueString"] = "18/26 songs";

    // Update the existing notification's data by using tag/group
    ToastNotificationManager.CreateToastNotifier().Update(data, tag, group);
}

Если вы используете метод Update, а не заменяете всплывающее уведомление целиком, уведомление остается в той же позиции в центре уведомлений и не перемещается вверх или вниз. Пользователи были бы очень удивлены, если бы всплывающее уведомление каждый раз оказывалось в верхней части центра уведомлений, с заполненным индикатором хода выполнения.

Метод Update возвращает перечисление NotificationUpdateResult, которое позволяет узнать, выполнено ли обновление успешно или уведомление не удалось найти (это означает, что пользователь, вероятно, удалил уведомление и вам следует остановить отправку обновлений). Не рекомендуется показывать другое всплывающее уведомление до завершения текущий операции (например, завершения загрузки).

Элементы, которые поддерживают привязку данных

Следующие элементы во всплывающих уведомлениях поддерживают привязку данных

  • Все свойства AdaptiveProgress
  • Свойство Текст элементов AdaptiveText верхнего уровня

Обновление или замена уведомления

Начиная с Windows 10 вы всегда можете заменить уведомление, отправив новое всплывающее уведомление с теми же значениями Tag и Group. Так в чем же разница между заменой всплывающего уведомления и обновлением данных уведомления?

Замена Обновление
Позиция в центре уведомлений Перемещение уведомления в верхнюю часть центра уведомлений. Уведомления остается на прежнем месте в центре уведомлений.
Изменение содержимого Можно полностью изменить все содержимое и макет всплывающего уведомления Можно изменить только свойства, которые поддерживают привязку данных (индикатор хода выполнения и текст верхнего уровня)
Повторное отображение в качестве всплывающего меню Может снова отображаться как всплывающее окно, если оставить свойству SuppressPopup задано значение false (или значение true, чтобы автоматически отправить его в центр уведомлений) Не отображается как всплывающее окно; данные всплывающего уведомления автоматически обновляются в центре уведомлений
Закрыто пользователем Независимо от того, закрыл ли пользователь предыдущее уведомление, замена всплывающего уведомления отправляется всегда Если пользователь закрыл всплывающее уведомление, оно не будет обновлено

Как правило, обновление полезно в следующих ситуациях...

  • Сведения, которые часто изменения за короткий период времени и не должны отображаться на переднем плане
  • Незначительные изменения содержимого всплывающего уведомления, например изменение 50 % на 65 %

Во многих случаях после завершения последовательности обновлений (например, после скачивания файла) мы рекомендуем использовать конечный шаг, так как...

  • Последнее уведомление, скорее всего, содержит значительные изменения макета, такие как удаление индикатора хода выполнения, добавление новых кнопок и т. д
  • Пользователи могли закрыть ожидающие уведомление о ходе выполнения, так как им не интересны сведения о загрузке, но они по-прежнему хотят получить всплывающее уведомление после завершения операции