Существуют разные способы взаимодействия приложения с пользователем. Windows Phone имеет уникальный способ предоставления самой последней информации, даже когда приложение не запущено, с помощью плиток и значков. Это экономит заряд батареи и удобен для пользователя. Будь то новое электронное письмо, пропущенный звонок, специальное мероприятие в календаре, фотографии в вашем списке контактов или ваши личные фотографии, дизайн Windows Phone позволяет легко сообщить, что появилось что-то новое. В этой статье я покажу, как внедрить эти уведомления в ваше приложение.
Вы можете скачать полный проект с GitHub .
Для начала создайте новый проект в Visual Studio, выберите Windows Phone из списка и назовите проект.
Откройте MainPage.xaml и добавьте следующий код в теги сетки.
<ScrollViewer Margin="0,0,0,-1"> <StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Image and Text"/> <ToggleSwitch x:Name="ImageAndText" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Image Collection"/> <ToggleSwitch x:Name="ImageCollection" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Cyclic"/> <ToggleSwitch x:Name="Cyclic" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Badge"/> <ToggleSwitch x:Name="Badge" HorizontalAlignment="Left" Margin="0,0,0,10" FontFamily="Global User Interface"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Iconic Tile"/> <ToggleSwitch x:Name="IconicTile" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Block and Text"/> <ToggleSwitch x:Name="BlockAndText" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> </StackPanel> </ScrollViewer> 
Вид дизайна теперь должен выглядеть так:
Вы увидите список тумблеров, которые активируют наши уведомления. Теперь добавьте код, который заставляет что-то происходить.
Прежде чем мы начнем
Чтобы упростить следующие шаги, мы импортируем некоторые пространства имен в MainPage.xaml.cs .
 using Windows.UI.StartScreen; using Windows.Data.Xml.Dom; using Windows.UI.StartScreen; using Windows.UI.Xaml; 
  Внутри класса MainPage объявляют эти глобальные переменные, не все будут использоваться сразу. 
 private XmlDocument tileXml; private XmlElement tileImage; private XmlNodeList tileList; private TileNotification notif; SecondaryTile imageTile, blockTile, badgeTile, iconicTile, cyclicTile; 
Нам нужно включить очередь уведомлений для основной плитки приложения. Сделайте это внутри конструктора, чтобы код выполнялся при создании страницы.
 TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueueForSquare150x150(true); TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueueForWide310x150(true); 
Я прикрепил приложение к меню «Пуск» и изменил его размеры до широкого (310 × 150). Затем я программно добавил дополнительную квадратную плитку для каждого шаблона. Я рекомендую вам сделать то же самое, так как мы будем тестировать уведомления как на широких, так и на квадратных плитках, и это экономит время, изменяя их размеры, чтобы увидеть различия во время тестирования.
Вторичные плитки
Сначала я представлю Вторичные плитки, потому что мы будем использовать их на следующих шагах. Они идентичны плиткам, закрепленным в меню «Пуск», за исключением того, что они создаются программно. Мы можем создать несколько плиток, назначить им разные идентификаторы, а затем обновить их отдельно. В Windows Phone 8.1 мы можем добавлять только квадратные плитки размером 150 × 150 пикселей.
  Для создания вторичной плитки используется класс с тем же именем из пространства имен StartScreen .  Объекты создаются с помощью следующего конструктора. 
 SecondaryTile.SecondaryTile(string tileId, string displayName, string arguments, Uri logoReference, TileSize tileSize); 
  Чтобы прикрепить плитку к меню «Пуск», мы вызываем асинхронный метод SecondaryTile.RequestCreateAsync();  который возвращает логическое значение, чтобы сказать, был ли тайл закреплен успешно или нет.  Удалить прикрепленную плитку так же просто, как вызвать SecondaryTile.RequestDeleteAsync(); 
Флип плитки
Этот тип плиток распространен в играх. Если вы прикрепите приложение к меню «Пуск», на плитке появится информация о таблице лидеров, достижениях или другая информация, относящаяся к игре.
  В режиме конструктора MainPage.xaml двойной щелчок по переключателю ImageAndText добавит прослушиватель переключаемых событий и приведет вас к файлу .cs, создав новый метод, в который мы добавим наш код.  Во-первых, нам нужно проверить, является ли переключатель, который вызвал событие, включенным или выключенным, чтобы выполнить правильное действие, достаточно простого оператора if else .  Обратите внимание на ключевое слово async добавленное для поддержки асинхронных вызовов. 
 private async void ImageAndText_Toggled(object sender, RoutedEventArgs e) { if (ImageAndText.IsOn) { } else { } } 
Если переключатель включен, я создаю дополнительную плитку, как описано выше, и прикрепляю ее к меню «Пуск». Я добавил в проект пять цветных прямоугольников по два размера каждый. В этом случае плитка будет использовать синий прямоугольник в качестве изображения.
 imageTile = new SecondaryTile( "ImageAndText", "Image and Text", "Arguments", new Uri("ms-appx:///Assets/blue.150x150.png", UriKind.Absolute), TileSize.Square150x150); await imageTile.RequestCreateAsync(); 
  Если выключатель выключен, мы должны удалить закрепленный тайл, добавив следующую строку внутри блока else . 
 await imageTile.RequestDeleteAsync(); 
Если вы запустите приложение сейчас и включите переключатель изображения и текста, вы увидите две плитки рядом. Первый — широкий и называется « Локальные уведомления», а второй — квадратный и называется « Изображение и текст» . Мы еще не добавили никаких уведомлений.
  Шаблоны уведомлений представлены в xml , но могут быть созданы с помощью кода.  Это шаблон, который мы будем использовать. 
 <tile> <visual version="2"> <binding template="TileSquare150x150PeekImageAndText01" fallback="TileSquarePeekImageAndText01"> <image id="1" src="" /> <text id="1"></text> <text id="2"></text> <text id="3"></text> <text id="4"></text> </binding> </visual> </tile> 
  Далее мы получаем этот шаблон из TileUpdateManager .  Вы можете заметить, что существует множество других доступных TileTemplateType , используемых как для Windows, так и для Windows Phone. 
 tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileSquare150x150PeekImageAndText01 ); 
  В коде xml есть один тег изображения, в котором отсутствует источник, а в четырех текстовых тегах отсутствует текст.  Мы можем получить любой элемент xml из его имени тега, а затем установить нужные нам атрибуты.  Функция GetElementsByTagName(string) возвращает XmlNodeList содержащий все элементы, найденные в документе.  Давайте добавим атрибуты для изображения и текста. 
 tileImage = tileXml.GetElementsByTagName("image")[0] as XmlElement; tileImage.SetAttribute("src", "ms-appx:///Assets/blue.150x150.png"); tileList = tileXml.GetElementsByTagName("text"); (tileList[0] as XmlElement).InnerText = "Header text"; (tileList[1] as XmlElement).InnerText = "First line of text"; (tileList[2] as XmlElement).InnerText = "Second line of text"; (tileList[3] as XmlElement).InnerText = "Third line of text"; 
  На основе этого XML-шаблона мы создаем TileNotification и добавляем его в TileUpdateManager , который отвечает за изменение или обновление плиток. 
 notif = new TileNotification(tileXml); TileUpdateManager.CreateTileUpdaterForSecondaryTile(imageTile.TileId).Update(notif); 
Вторичное обновление плитки теперь завершено. Мы также обновим широкую плитку с небольшими изменениями. Сначала мы получаем шаблон для широкой плитки.
 tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileWide310x150PeekImage02 ); 
Источник изображения установлен в широкий синий прямоугольник.
 tileImage.SetAttribute("src", "ms-appx:///Assets/blue.310x150.png"); 
Шаблон для широкой плитки имеет дополнительную строку текста, мы также можем добавить атрибуты для этого.
 (tileList[4] as XmlElement).InnerText = "Fourth line of text"; 
Наконец, мы обновляем основную плитку.
 TileUpdateManager.CreateTileUpdaterForApplication().Update(notif); 
Когда тумблер выключен, обновления плитки очищаются:
 TileUpdateManager.CreateTileUpdaterForApplication().Clear(); 
В примере проекта на github код повторяется в каждом случае, что неэффективно, но показывает каждое уведомление более четко.
Запустите приложение и включите первый переключатель. Вы должны увидеть это в меню «Пуск».
Цикл, как плитки
Если вы посмотрите на плитку «Фотографии», ваши личные фотографии будут медленно циклически переключаться с эффектом Кена Бернса . Это называется «Цикл плитки». В Windows Phone 8.1 эта плитка больше не доступна, но мы можем сделать нечто подобное. Один из подходов — добавление картинок в очередь, которая будет переключаться с эффектом переворота, но движение будет отсутствовать.
Создайте новую Вторичную плитку так же, как мы делали раньше.
 cyclicTile = new SecondaryTile( "Cyclic", "Cyclic", "Arguments", new Uri("ms-appx:///Assets/blue.150x150.png", UriKind.Absolute), TileSize.Square150x150); await cyclicTile.RequestCreateAsync(); 
Нам нужно включить очередь уведомлений для этой плитки, как мы сделали для основной плитки.
 TileUpdateManager.CreateTileUpdaterForSecondaryTile(cyclicTile.TileId).EnableNotificationQueueForSquare150x150(true); 
  Обновите плитку с TileSquare150x150Image шаблона TileSquare150x150Image изменив только источник изображения. 
 tileImage = tileXml.GetElementsByTagName("image")[0] as XmlElement; tileImage.SetAttribute("src", "ms-appx:///Assets/blue.150x150.png"); notif = new TileNotification(tileXml); TileUpdateManager.CreateTileUpdaterForSecondaryTile(cyclicTile.TileId).Update(notif); tileImage.SetAttribute("src", "ms-appx:///Assets/red.150x150.png"); notif = new TileNotification(tileXml); TileUpdateManager.CreateTileUpdaterForSecondaryTile(cyclicTile.TileId).Update(notif); // Repeat for orange, green, and yellow 
  Таким же образом обновите широкую плитку, используя TileWide310x150Image в качестве типа шаблона.  Следующий рисунок показывает, как будут выглядеть плитки. 
Значки
Счетчик или «значок» часто используется для отображения количества уведомлений. Это может быть глиф, но в Windows Phone он ограничен символом предупреждения и внимания . Мы будем использовать глифы на дополнительном тайле и значок с цифрами на основном тайле.
  После создания и закрепления новой плитки мы генерируем xml из класса BadgeUpdateManager . 
 tileXml = BadgeUpdateManager.GetTemplateContent(BadgeTemplateType.BadgeGlyph); 
  XML состоит только из одного тега: <badge value=""/> .  Далее установите значение глифа. 
 tileImage = tileXml.SelectSingleNode("/badge") as XmlElement; tileImage.SetAttribute("value", "alert"); 
  Создайте новое BadgeNotification из этого шаблона и обновите плитку. 
 BadgeNotification badgeNotification = new BadgeNotification(tileXml); BadgeUpdateManager.CreateBadgeUpdaterForSecondaryTile(badgeTile.TileId).Update(badgeNotification); 
Широкая плитка обновляется аналогичным образом.
 tileXml = BadgeUpdateManager.GetTemplateContent( BadgeTemplateType.BadgeNumber ); tileImage = tileXml.SelectSingleNode("/badge") as XmlElement; tileImage.SetAttribute("value", "31"); badgeNotification = new BadgeNotification(tileXml); BadgeUpdateManager.CreateBadgeUpdaterForApplication().Update(badgeNotification); 
Когда пользователь открывает приложение, мы можем захотеть удалить это уведомление, добавив эту функцию в обработчик событий переключения.
 BadgeUpdateManager.CreateBadgeUpdaterForApplication().Clear(); 
Запустите приложение, чтобы увидеть результаты.
Поначалу чёрный круг может показаться разочаровывающим, но пока не сдавайтесь, значки значат больше.
Уведомления о блокировке экрана
Когда телефон заблокирован и пользователь нажимает кнопку питания, он может сразу же увидеть уведомления для приложений по своему выбору. Мы можем включить эту функцию и для нашего приложения, если у пользователя нет плитки, прикрепленной к меню «Пуск».
Откройте package.appxmanifest проекта и в уведомлениях на экране блокировки выберите значок и текст плитки .
Красная пометка появится на вкладке Visual Assets, потому что нам нужно добавить логотип значка. Нажмите на вкладку и на левой панели выберите Badge Logo . Вы можете загрузить до трех разных размеров: 58 × 58, 33 × 33 и 24 × 24. Логотип лучше всего белого цвета с прозрачным фоном. Выберите логотип и сохраните изменения.
Возможно, мы добавили функцию уведомлений в наше приложение, но пользователи сами выбирают, включать их или добавлять плитки на стартовый экран. Чтобы включить уведомления приложений, откройте « Настройки» -> «Экран блокировки» . По умолчанию должен быть выбран хотя бы Телефон и Сообщения. Добавьте другое приложение, нажав кнопку + .
Это покажет список приложений, которые предлагают уведомления экрана блокировки, выберите наше приложение и двигаться дальше.
Если вы заблокировали экран, а уведомление о значке по-прежнему включено, вы должны увидеть 31 новое уведомление для нашего приложения.
Знаковые плитки
Последняя форма, которую могут принимать значки, — «Иконические плитки». В качестве примера можно привести плитку «Почта», содержащую информацию о вновь поступившем электронном письме, об отправителе, времени и в правом нижнем углу, маленький значок, показывающий, сколько непрочитанных писем у вас есть.
Сначала нам нужно добавить иконку к активам проекта. Для широкой плитки это должно быть 70 × 110 пикселей, а для квадратной плитки 130 × 202 пикселей.
  Код за плиткой имеет ту же логику.  Создайте новую Вторичную плитку и добавьте к ней значок.  Нам нужен номер, чтобы показать рядом со значком, который будет номером, который мы установили на значке.  Затем получите код XML для генерации TileNotification . 
 tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquare150x150IconWithBadge); tileImage = tileXml.GetElementsByTagName("image")[0] as XmlElement; tileImage.SetAttribute("src", "ms-appx:///Assets/icon.130x202.png"); notif = new TileNotification(tileXml); TileUpdateManager.CreateTileUpdaterForSecondaryTile(iconicTile.TileId).Update(notif); 
Сделайте то же самое для широкой плитки, но в шаблоне xml есть три текстовых тега, которые требуют добавления атрибутов.
 tileList = tileXml.GetElementsByTagName("text"); (tileList[0] as XmlElement).InnerText = "Header text"; (tileList[1] as XmlElement).InnerText = "First line of text"; (tileList[2] as XmlElement).InnerText = "Second line of text"; 
Который должен выглядеть следующим образом.
Блок и текстовый шаблон
Последний пример, который я хотел бы показать, — это обновление плитки календаря. На специальных событиях он обновляется с названием события и его продолжительностью.
Существует специальный шаблон для квадратной плитки и два шаблона для широкой плитки. После создания дополнительной плитки получите шаблон XML. Он имеет два текстовых тега для добавления атрибутов, в данном случае это месяц и дата.
 tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileSquare150x150Block ); tileList = tileXml.GetElementsByTagName("text"); (tileList[0] as XmlElement).InnerText = "28"; (tileList[1] as XmlElement).InnerText = "Nov"; 
Для широкой плитки есть один или два дополнительных текстовых тега, в зависимости от шаблона, куда вы можете добавить информацию о событии.
 tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileWide310x150BlockAndText01 ); tileList = tileXml.GetElementsByTagName("text"); (tileList[0] as XmlElement).InnerText = "28"; (tileList[1] as XmlElement).InnerText = "Nov"; (tileList[2] as XmlElement).InnerText = "Indipendence Day of Albania"; 
  Когда вы добавляете TileNotifications для каждой плитки, вы должны получить похожий результат. 
Вывод
Плитки — это хороший способ уведомлять пользователей о новых действиях в вашем приложении. В этой статье я показал некоторые из наиболее распространенных обновлений плитки, основанные на существующих типах, которые Windows использует для своих приложений. Windows Phone 8.1 и выше изменил способ реализации этих плиток, поэтому я надеюсь, что мои объяснения были достаточно ясными.
Спасибо за уделенное время. Пусть код будет с вами!











