Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 464 / 16 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 20:

Плитки

На рис. 55.2. вы можете видеть окно проекта приложения.

Окно проекта приложения P20_1

увеличить изображение
Рис. 55.2. Окно проекта приложения P20_1

Обратите внимание на набор изображений, которые будут использоваться для плиток. Они размещены в папке Assets > Tiles и названы в соответствии с размерами и тем, используются ли изображения для передней части двусторонней плитки (f) или задней (b). Мы собираемся обновить плитку приложения, создаваемую по умолчанию, используя эти изображения. Так как пользователь может переключить плитку к любому из поддерживаемых ей размера, нужно три комплекта изображений. При этом для маленькой плитки достаточно одного изображения, так как она не анимируется. Все эти изображения имеют формат PNG. Для дополнительной плитки, которая будет поддерживать возможность циклического обновления содержимого, мы подготовили два изображения, которые будут циклически сменять друг друга (поддерживается до 9 таких изображений), они имеют формат JPG, и одно изображение 159х159_c.png – оно будет использовано при переключении к маленькому формату дополнительной плитки, который не поддерживает анимацию.

Механизм автообновления плитки по расписанию создан на основе примера "Shell tile schedule" ("Обновление плитки по расписанию"), http://code.msdn.microsoft.com/Shell-Tile-Schedule-589f628e.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace P20_1
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Конструктор
        public MainPage()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //Получаем основную плитку приложения
            //Если она еще не закреплена на рабочем столе
            //будет произведена её настройка, которая повлияет на вид плитки
            //после закрепления
            ShellTile mainT = ShellTile.ActiveTiles.First();

            //Так как мы использовали шаблон FlipTile, 
            //Настроим соответствующий объект
            FlipTileData ftData = new FlipTileData();
            //Надписи на плитке
            ftData.Title = "Новая плитка!";
            ftData.Count = 1;
            ftData.BackTitle = "Добро пожаловать!";
            ftData.BackContent = "задняя часть плитки";
            ftData.WideBackContent = "задняя часть крупной плитки";
            //Передняя часть плитки
            ftData.SmallBackgroundImage = new Uri("Assets/Tiles/159x159_f.png", UriKind.Relative);
            ftData.BackgroundImage = new Uri("Assets/Tiles/336x336_f.png", UriKind.Relative);
            ftData.WideBackgroundImage = new Uri("Assets/Tiles/691x336_f.png", UriKind.Relative);
            //Задняя часть плитки
            ftData.BackBackgroundImage = new Uri("/Assets/Tiles/336x336_b.png", UriKind.Relative);
            ftData.WideBackBackgroundImage = new Uri("/Assets/Tiles/691x336_b.png", UriKind.Relative);
            //Обновим содержимое плитки
            mainT.Update(ftData);
        }

        private void btnNewTile_Click(object sender, RoutedEventArgs e)
        {

            //Список плиток
            List<ShellTile> tileList = ShellTile.ActiveTiles.ToList();

            MessageBox.Show("Количество плиток приложения: " + tileList.Count().ToString());

            //Данные циклически обновляемой плитки
            CycleTileData ctData = new CycleTileData();
            ctData.Title = "Циклическая плитка";
            ctData.Count = 2;

            //Для маленькой плитки, она не обновляется
            ctData.SmallBackgroundImage = new Uri("Assets/Tiles/159x159_c.png", UriKind.Relative);

            //Используем 2 изображения, поддерживаются до 9 изображееий
            ctData.CycleImages = new Uri[]
               {
                  new Uri("Assets/Tiles/1.jpg", UriKind.Relative), 
                  new Uri("Assets/Tiles/2.jpg", UriKind.Relative), 
               };

            //Находим плитку, в строке перехода которой содержится параметр com1
            ShellTile tileFinded = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("com1"));

            if (tileFinded != null && tileFinded.NavigationUri.ToString().Contains("com1"))
            {
                //Если плитка уже есть, удаляем её, после чего создаем снова
                tileFinded.Delete();
                ShellTile.Create(new Uri("/MainPage.xaml?command=com1", UriKind.Relative), ctData, true);
            }
            else
            {
                //Если плитки нет - создаём
                ShellTile.Create(new Uri("/MainPage.xaml?command=com1", UriKind.Relative), ctData, true);
            }
        }
        //При переходе на страницу
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            IDictionary<string, string> parameters = this.NavigationContext.QueryString;
            //Анализируем переданные параметры
            if (parameters.ContainsKey("command"))
            {
                if (parameters["command"] == "com1")
                {
                    //Если пристствует параметр command со значеием com1
                    MessageBox.Show("Запуск с дополнительной плитки, с командой " + parameters["command"]);
                }
            }
            base.OnNavigatedTo(e);
        }
        //Обовление основной плитки
        private void btnStartUpdate_Click(object sender, RoutedEventArgs e)
        {
            //Объект для планирования обновления фонового изображения плитки
            //Для первой плитки - это всегда основная плитка приложения
            ShellTileSchedule tileUpdShedule = new ShellTileSchedule(ShellTile.ActiveTiles.First());
            //Интервал обновления
            tileUpdShedule.Interval = UpdateInterval.EveryHour;
            //Производить периодические обновления
            tileUpdShedule.Recurrence = UpdateRecurrence.Interval;
            //Количество периодических обновления
            tileUpdShedule.MaxUpdateCount = 24;
            //Изображениее, загружаемое при обновлении
            tileUpdShedule.RemoteImageUri = new Uri(@"http://www.weather.gov/forecasts/graphical/images/conus/MaxT1_conus.png");
            //Время запуска обновления
            tileUpdShedule.StartTime = DateTime.Now;
            //Запускаем обновления по расписанию
            tileUpdShedule.Start();
        }
    }
}
Листинг 55.1. Код файла MainPage.xaml.cs

Выводы

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

Задания

Оцените разрабатываемое вами приложение на предмет использования в нём динамических плиток и дополнительных плиток. Опишите сценарии работы с приложением, в которых можно использовать эти механизмы. Подготовьте отчёт.

Дополнительные материалы

К данной лекции подготовлено видеоприложение и демонстрационный программный проект.