Поделиться через


Индикатор выполнения и привязка данных

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

Это важно

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

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

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

Замечание

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

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

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

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

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

Однако необходимо динамически обновить значения индикатора выполнения, чтобы он фактически был "активным". Это можно сделать с использованием привязки данных для обновления уведомления toast.

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

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

  1. Создание всплывающего содержимого, использующее поля с привязкой к данным
  2. Назначьте тег (и, опционально, группу ) для вашего уведомления ToastNotification
  3. Определите начальные значения данных на ToastNotification
  4. Отправить уведомление-тост
  5. Используйте Тег и Группу для обновления значений Данных новыми значениями.

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

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
  • Свойство Text на верхнего уровня элементов AdaptiveText

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

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

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

Как правило, обновление полезно для ...

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

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

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