Разработка под Windows Phone: Live Tiles

Для начала определимся с тем, что такое тайл (Tile). Тайл – это ссылка на приложение, которая отображается на панели старт. Бывает два вида тайлов. Первый - это тайл приложения (Application Tile), который появляется, когда пользователь закрепляет (pin) приложение в панели старт. Он один и есть у приложения всегда, даже когда ссылка на приложение не отображается в стартовой панели. Второй вид – это вторичные тайлы (Secondary Tiles), которые создаются програмно приложением по запросу пользователя. Например, если это новостное приложение, оно может предлагать возможность создать вторичный тайл, который будет относиться к какому-нибудь отдельному новостному разделу, например, мобильная разработка, веб-разработка и т.д. При этом, обычно, нажатие на такой тайл приводит пользователя не на основную страницу приложения, а на некую выделенную. При этом такой тайл может обновляться отличным от тайла приложения образом: например, показывать количество новых новостей не всего, а по определённой тематике.

Удобно представить информацию о различии в типах тайлов в виде таблицы:

Application Tile

Secondary Tiles

Как создаётся

Только пользователем, который прикрепляет приложение (pin to start) из списка в стартовую панель.

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

Пользователем в приложении, когда он выбирает создать дополнительный тайл (Create(Uri, ShellTileData) API)

Как удаляется

Не удаляется. Вне зависимости от присутствия на стартовой панели. Может обновляться также вне зависимости от присутствия на стартовой панели.

Пользователем, если он открепляет тайл от стартовой панели.

При де-инсталляции приложения.

Используя Delete() API

Как обновляется

ShellTile API

ShellTileSchedule API

Push Notifications

ShellTile API

ShellTileSchedule API

Push Notifications

Обратите внимание, что Application Tile всегда первый в коллекции ActiveTiles, вне зависимости от того, закреплён ли он в стартовой панели.

Тайлы в Windows Phone – двухсторонние. Если у тайла определены обе стороны, и фронтальная и обратная, при отображении, между ними происходит переключение. Если обратная сторона не определена (не установлено не одно из свойств обратной стороны), переключения между ними не происходит.

Ниже, показан пример фронтальной стороны тайла.

img_6_11_1

В правом верхнем углу тайла, в круге, отображается свойство Count, числовое значение от 1 до 99. Если свойство Count не определёно или установлено в 0, не отображается.

В нижней части тайла находится заголовок – Title. Это строка, она должна помещаться в размер тайла, то есть максимальная длина около 15 символов.

Сам тайл заполнен фоновым рисунком – BackgroundImage.

Обратная сторона тайла выглядит похожим образом:

img_6_11_3

В нижней части тайла находится заголовок обратной стороны тайла – BackTitle. Это строка, она должна помещаться в размер тайла, то есть максимальная длина около 15 символов.

В верхней части стороны находится содержание обратной стороны тайла – BackContent. Это строка, помещается около 40 символов.

Сам тайл заполнен фоновым рисунком – BackBackgroundImage.

Обратите внимание, что при создании вторичного тайла (Secondary Tile) фоновые рисунки для фронтальной и обратной стороны тайла должны быть в локальных ресурсах. При обновлении могут использоваться и локальные и удалённые ресурсы.

Перейдём к практическому знакомству с тайлами. Создадим новое приложение на базе стандартного шаблона Windows Phone Application и назовём приложение LiveTilesExample.

В этом приложении мы научимся изменять тайл приложения, создавать вторичный тайл и обновлять фоновый рисунок фронтальной стороны тайла по расписанию с использованием ShellTileSchedule API.

Добавьте в приложение 2 картинки формата PNG и размера 173 X 173. Одну назовите front.png, а вторую back.png. После добавления картинок, установите для них тип сборки (Build Action) в Content (по умолчанию Resource).

После этого, добавьте ещё одну страницу в приложение и назовите её SecondaryPage.xaml. После того, как её добавите измените XAML код в ней следующим образом:

 <!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
      <TextBlock x:Name="ApplicationTitle" Text="LIVE TILES"  
                 Style='{StaticResource PhoneTextNormalStyle}'/>            
     <TextBlock x:Name="PageTitle" Text="другая" Margin="9,-7,0,0"                       
                Style='{StaticResource PhoneTextTitle1Style}'/>
</StackPanel>

В окне дизайнера щелкнем двойным щелчком по кнопке «изменить тайл приложения», будет автоматически создан обработчик события Click и мы перейдём в редактор кода.

Для работы с тайлами, в блок using необходимо добавить следующую запись:

 using Microsoft.Phone.Shell;

Перейдём в код метода обработки события Click кнопки AppTile и добавим код, который изменяет вид тайла приложения:

 private void AppTile_Click(object sender, RoutedEventArgs e)        
{            
     ShellTile apptile = ShellTile.ActiveTiles.First();             
     StandardTileData appTileData = new StandardTileData();            
     appTileData.Title = "Тайл приложения";            
     appTileData.Count = 5;            
     appTileData.BackgroundImage = new Uri("/front.png", UriKind.RelativeOrAbsolute);             
     appTileData.BackTitle = "Обратная сторона";            
     appTileData.BackContent = "Очень важное сообщение";            
     appTileData.BackBackgroundImage = new Uri("/back.png", UriKind.RelativeOrAbsolute);             
     apptile.Update(appTileData);         
}

Обратите внимание, что тайл приложения всегда первый в активном списке тайлов, даже если он не закреплён в стартовой панели.

Соберите приложение и разверните его (Deploy Solution).

В эмуляторе, перейдите в список устройств и закрепите приложение на стартовой панели (долгое нажатие на приложение в списке и далее pin to start).

img_6_12

Обратите внимание, как выглядит тайл приложения на стартовой панели:

img_6_13

Запустите приложение из стартовой панели и нажмите на кнопку кнопке «изменить тайл приложения». Далее нажмите на кнопку Back на телефоне. Обратите внимание, что тайл приложение изменился и имеет 2 стороны, которые меняются со временем.

img_6_14

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

В окне дизайнера щелкнем двойным щелчком по кнопке «установить вторичный тайл», будет автоматически создан обработчик события Click и мы перейдём в редактор кода.

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

 private void SecTile_Click(object sender, RoutedEventArgs e)        
{            
       StandardTileData secTileData = new StandardTileData();            
       secTileData.Title = "Вторичный тайл";            
       secTileData.Count = 5;            
       secTileData.BackgroundImage = new Uri("/back.png", UriKind.RelativeOrAbsolute);             
       secTileData.BackTitle = "Обратная сторона";            
       secTileData.BackContent = "Просто сообщение";            
       secTileData.BackBackgroundImage = new Uri("/front.png", UriKind.RelativeOrAbsolute);             
       ShellTile.Create(new Uri("/SecondaryPage.xaml", UriKind.RelativeOrAbsolute),
                                secTileData);        
}

Запустите приложение (F5).

В приложении, нажмите кнопку «установить вторичный тайл». Обратите внимание, что приложение автоматически перешло в стартовую панель, куда уже добавлен вторичный тайл. Нажмите на него и убедитесь, что отображается вторая страница приложения.

Перейдем обратно в Visual Studio и в дизайнере основной страницы щелкнем двойным щелчком по кнопке «обновление тайла приложения», будет автоматически создан обработчик события Click и мы перейдём в редактор кода.

Добавим код в обработчик. Мы обновляем один раз, через две минуты после нажатия кнопки стартуем.

 private void UpdateAppTile_Click(object sender, RoutedEventArgs e)        
{            
      ShellTileSchedule appTileSchedule = new ShellTileSchedule();             
      appTileSchedule.Recurrence = UpdateRecurrence.Onetime;              
      appTileSchedule.StartTime = DateTime.Now.AddMinutes(2);             
      appTileSchedule.RemoteImageUri = new Uri("https://замените на путь к вашей картинке на удалённом сервере");            
      appTileSchedule.Start();         
}

Замените в коде путь к картинке на уделённом сервере. Обратите внимание, что поддерживается только HTTP, размер картинки должен быть не более 80K и скачиваться она должна не более 30 секунд. Поскольку задача скачивания ставится в пакет, то картинка может обновиться в течение часа.

Эта картинка заменит фоновый рисунок фронтальной стороны тайла приложения.

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

Также попробуйте создать к приложению фоновый агент (Background Agent), который будет обновлять тайлы, используя ShellTile API.