Разработка информационных систем для Windows Store

Разработка и реализация приложения для Windows Store

Разбить на страницы
Показывать лекцию целиком

Приложения для Windows Store поддерживают несколько типов навигации:

  • иерархическая система
  • плоская система
  • (рис 9.1)

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

    Данная система навигации делает приложения для Windows Store быстрыми и динамичными, сохраняя при этом простоту использования. Лучше всего подходит для приложений с крупными коллекциями содержимого или большим количеством разделов содержимого, предназначенного для исследования пользователем. (рис 9.2)

    Суть узловой навигации - в распределении содержимого по различным разделам и по степени развернутости.

    Страницы узлов

    Страницы узлов - это точки входа пользователя в приложение. Здесь содержимое отображается с развертыванием по горизонтали и акцентирует внимание пользователей на новых и доступных элементах.

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

    Страницы разделов

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

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

    Страницы сведений

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

    Страница сведений содержит сведения об элементе или функцию. Страницы сведений могут содержать множество сведений или отдельный объект, например изображение или видеоролик.

    Во многих приложениях для Windows Store используется плоская система навигации. Такая структура распространена в играх, браузерах и офисных приложениях, где пользователь переходит между страницами, вкладками или режимами, которые находятся на одном и том же иерархическом уровне. (рис 9.3)

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

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

    Реализация навигации

    Давайте посмотрим, как приложение в Windows 8 способно отобразить контент. Речь идет именно о контенте, так как разработка приложений для Windows Store базируется на отсутствии оболочки у окна. Тем не менее, окно в приложении присутствует, оно создается неявно, но на него можно получить ссылку, используя свойство Current класса Window. Получив ссылку на окно приложения, разработчик может установить свойство Content, которое будет определять содержимое окна. Когда же содержимое полностью сформировано, его можно отобразить с помощью метода Activate. Иными словами, если в Вашем приложении предусмотрен переход на другие страницы, то этого можно достичь, установив свойство Content в ссылку на страницу и вызвав Activate. В сентябрьской версии Windows 8 (Platform Preview) нечто подобное было реализовано. Проблема лишь в том, что данный механизм не позволяет сохранять историю переходов, не поддерживает хорошего способа передачи параметров и т.д. Поэтому для организации навигации правильно использовать специальный контейнер Frame, который предназначен для поддержки контекста навигации.

    Заглянем внутрь файла App.xaml.cs.

    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
     var rootFrame = new Frame();
     rootFrame.Navigate(typeof(BlankPage));
     Window.Current.Content = rootFrame;
     Window.Current.Activate();
    } 

    Как видите, при запуске приложения создается объект типа Frame, который устанавливается в свойство Content. С помощью метода Navigate объект типа Frame загружает страницу BlankPage (имя страницы по умолчанию), что позволяет отобразить ее после вызова метода окна Activate. Таким образом, Frame является тем классом, который обеспечивает контекст навигации, и дает доступ к ряду методов и свойств, связанных с навигацией:

  • CacheSize - указывает количество страниц, сохраняемых в кэше при "глубокой" навигации;
  • CanGoBack - определяет, возможно ли осуществить навигацию на предыдущую страницу (была ли и есть ли страница в кэше);
  • CanGoForward - определяет, можно ли совершить навигацию на страницу, которую пользователь уже посещал и с которой вернулся на предыдущую;
  • GoBack - выполняет навигацию на предыдущую страницу;
  • GoForward - выполняет навигацию на следующую страницу;
  • Navigated - событие, генерируемое после успешной навигации;
  • Navigating - событие, которое генерируется перед попыткой навигации;
  • NavigationFailed - событие, которое возникает, если во время навигации произошла ошибка (например, страница отсутствует);
  • NavigationStopped - событие, которое генерируется в тот момент, когда текущая навигация была прервана с помощью метода StopLoading или путем выполнения другой навигации;
  • StopLoading - завершает загрузку данных и прекращает навигацию на указанную страницу;
  • Navigate - самый важный метод, который позволяет выполнять навигацию на указанную страницу.
  • Перечисленные методы достаточно просты, поэтому реализация навигации не составляет труда. Если говорить об использовании этих методов в сгенерированном коде, рекомендуется обратиться к файлу LayoutAwarePage.cs, который генерируется при создании любого проекта.

    protected virtual void GoHome(object sender, RoutedEventArgs e)
    {
     if (this.Frame != null)
     {
     while (this.Frame.CanGoBack) this.Frame.GoBack();
     }
    }

    Тут описан обработчик события, которое возникает при нажатии кнопки Home на панели приложения. Как Вы видите, для перехода на основную страницу совершена попытка вернуться на главную вследствие пролистывания всех страниц в обратном порядке. При этом объект типа Frame можно получить через одноименное свойство объекта Page, а потом осуществлять навигацию.

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

    Создавая приложения для Windows 8, возможно использовать различные уведомления (Tile, Toast), интеграцию с поиском, делиться информацией со своими друзьями через социальные сервисы и удобно настраивать приложения под свои нужды. В этой главе мы рассмотрим возможности интеграции наших приложений с Windows 8.

    Работа с плиткой

    Плитка является неотъемлемой частью приложения для Windows Store и позволяет пользователям запускать приложения со стартового экрана ОС. По умолчанию плитка - статическое изображение. Но мы можем добавить ему динамики, тем самым заинтересовав пользователя, сообщая об изменениях, когда приложение находится в неактивном состоянии. Динамические плитки позволяют Windows 8 казаться "живой".

    Для приложений мы можем использовать два режима отображения плиток (Рис. 9.4). Пользователь сам выбирает, какой из них использовать на стартовом экране:

  • Стандартный - может содержать бренд приложения - название или логотип продукта, а также значок. Из-за того, что данный режим отображения плитки может содержать ограниченный набор контента, доступен только один шаблон для его создания;
  • Расширенный - этот режим отображения плитки может содержать те же данные, что и стандартный режим, а также еще более детализированное описание и визуально интригующее оформление. В этом режиме существует широкий выбор шаблонов, которые позволят сделать контент более привлекательным. При использовании этого режима приложение обязательно должно иметь плитку стандартного размера, чтобы пользователь мог в любой момент переключиться на компактную плитку.
  • (рис 9.4)

    Содержимое плитки определяется в документе XML, который выбирается из множества шаблонов. Плитка может содержать изображение и текст, в зависимости от того, какой шаблон был выбран, а также отображать значок, логотип или короткое имя приложения (Рис. 9.5). Значок отображается в правом нижнем углу плитки. Короткое имя располагается в левом нижнем углу. В манифесте приложения мы выбираем, что хотим отображать: короткое имя приложения или его логотип. (рис 9.5) (рис 9.6)

    При настройке плитки можно указать возможность повторения до 5 последних уведомлений. Каждому уведомлению можно присваивать идентификатор, с помощью которого система будет решать, необходимы ли обновление или замена одного из существующих уведомлений на клиенте. Если Windows находит уведомление с таким же идентификатором, происходит замена. Если такого идентификатора в очереди нет, то из нее вытесняется наиболее старое уведомление.

    Когда приложение устанавливается в первый раз, на стартовом экране отображается плитка приложения по умолчанию. Это статическая картинка определена в манифесте приложения; обычно она отображает логотип продукта.

    Эта картинка заменяется только в случае отправки соответствующего уведомления. Фактически мы создаем плитки при указании их в манифесте приложения. Дальнейшие его модификации возможны только через уведомления. Плитка приложения может вернуться в исходное состояние, если отсутствуют уведомления, которые необходимо отобразить. Это возможно, если пользователь находится в автономном режиме или истек срок действия уведомлений. Статические плитки прорисовываются поверх установленного цвета фона приложения в манифесте. Если плитка содержит прозрачные области, то в этих местах будет отображаться установленный фон.

    К плиткам приложения по умолчанию есть несколько требований:

  • изображение должно быть в формате .png или .jpg;
  • размер стандартной плитки 150 x 150 пикселей;
  • размер расширенной плитки 310 x 150 пикселей (является дополнительным);
  • маленькая версия стандартной плитки 30 х 30 пикселей. Используется на странице поиска;
  • размер файла до 150 KB.
  • Для использования плиток необходимо добавить их в проект и настроить манифест проекта на их использование (Рис. 9.7). (рис 9.7)

    Теперь перейдем к созданию динамических плиток. Выше мы обсуждали возможные шаблоны плиток. В текущей версии Windows 8 у нас есть на выбор 30 шаблонов. Чтобы выбрать один из заготовленных шаблонов, необходимо использовать метод GetTemplateContent класса Windows.UI.Notifi cations.TileUpdateManager. Ниже приведен пример кода, который отправляет сообщение "Tile Message" на расширенную плитку нашего приложения (приложение должно содержать картинку расширенной плитки):

    XmlDocument tileXml = TileUpdateManager.
    GetTemplateContent(TileTemplateType.TileWideText04);
    XmlNodeList textElements = tileXml.GetElementsByTagName("text");
    textElements.Item(0).AppendChild(tileXml.CreateTextNode("Tile Message"));
    TileNotifi cation tile = new TileNotifi cation(tileXml);
    TileUpdateManager.CreateTileUpdaterForApplication().Update(tile); 

    Параметр метода GetTemplateContent указывает на то, какой шаблон мы хотим использовать. Каждый шаблон представлен в виде разметки xml. Так, разметка нашего шаблона следующая:

    <?xml version="1.0" encoding="utf-16"?><tile>
    <visual lang="en-US">
    <binding template="TileWideText04">
    <text id="1"></text>
    </binding> 
    </visual>
    </tile> 

    После добавления необходимого сообщения шаблон будет отображаться следующим образом:

    <?xml version="1.0" encoding="utf-16"?><tile>
    <visual lang="en-US">
    <binding template="TileWideText04">
    <text id="1">Tile Message</text>
    </binding>
    </visual>
    </tile> 

    При помощи последней строки кода из приведенного выше примера обновляется плитка приложения. Выбранный нами шаблон позволяет отображать указанное сообщение на расширенной плитке приложения. Полный список возможных шаблонов приведен на странице MSDN (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.notifications.tiletemplatetype.aspx).

    Рассмотренные выше возможности по изменению плитки приложения можно выполнять как локально (вышеприведенный пример), так и с сервиса, который находится в облаке и связан с приложением.

    Помимо основной плитки приложение может иметь дополнительную. Дополнительная плитка позволяет пользователю создавать еще один интерактивный элемент на стартовом экране Windows 8, а также открыть приложение на странице, на которой была создана дополнительная плитка.

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

  • быстрый переход на страницу важного контакта в социальных приложениях;
  • лента для программы RSS Reader;
  • пользовательские события в приложении Календарь и т.д.
  • Ситуация, в которой пользователю необходимо иметь быстрый доступ к часто обновляемому контенту или странице в глубине навигации приложения, является отличной возможностью для использования дополнительной плитки. Для применения дополнительной плитки хорошо подходят следующие сценарии:

  • отображение последних новостей из RSS;
  • данные о погоде;
  • обновление статусов друзей в социальных сетях;
  • журнал событий из календаря пользователя.
  • Любой часто изменяющийся контент нашего приложения может быть размещен в дополнительной плитке. Требования к дополнительной плитке приложения преимущественно совпадают с требованиями к основной:

  • изображение размером 150 х 150 пикселей;
  • использование шаблонов плитки для определения внутреннего контента;
  • может содержать расширенный логотип размером 310 х 150 пикселей;
  • автоматическое удаление при удалении приложения;
  • размещение как на рабочем столе, так и при просмотре списка всех приложений;
  • может отображать уведомления и значки.
  • Хотя у основной и дополнительной плитки много общего, есть и ряд отличий:

  • дополнительная плитка создается пользователем во время выполнения приложения;
  • при добавлении плитки пользователь должен подтвердить данное действие;
  • дополнительную плитку пользователь может удалить в любой момент без удаления программы.
  • Для добавления плитки необходимо создать объект класса Windows. UI.StartScreen.SecondaryTile и указать минимальный набор данных:

    var secondaryTile = new Windows.UI.StartScreen.SecondaryTile();
    secondaryTile.TileId = "3gFDG34GFS456FER";
    secondaryTile.ShortName = "2nd Tile";
    secondaryTile.DisplayName = "Secondary Tile";
    secondaryTile.Arguments = "Some arguments";
    secondaryTile.Logo = new Uri("ms-resource:Assets/secondLogo.png");
    secondaryTile.WideLogo = new Uri("ms-resource:Assets/secondWideLogo.png"); 

    Для объекта SecondaryTile обязательно должны быть инициализированы следующие свойства:

  • TileId - идентификатор плитки. С помощью этого значения можно в дальнейшем получать доступ к плитке и обновлять ее содержимое. Статический метод FindAllAsync класса SecondaryTile позволяет получить доступ к плитке, а метод экземпляра UpdateAsync - обновить его;
  • ShortName -сокращенное имя, которое отображается непосредственно на плитке;
  • DisplayName - полное название приложения, которое отображается в подсказке плитки, в списке всех установленных приложений и в панели управления;
  • Arguments - параметры, которые передаются в приложение при запуске с дополнительной плитки;
  • Logo - логотип приложения для дополнительной плитки;
  • WideLogo - расширенный логотип для дополнительной плитки. Свойство WideLogo необходимо инициализировать, только если нужно использовать расширенную дополнительную плитку для нашего приложения. После инициализации всех обязательных данных необходимо вызвать метод RequestCreateAsync экземпляра класса SecondaryTile: secondaryTile.RequestCreateAsync();
  • Этот метод может принимать объект типа Point, который указывает координаты отображения диалога (Рис. 9.8) о подтверждении размещения дополнительной плитки приложения. Можно также использовать метод RequestCreateForSelectionAsync, который позволяет более гибко управлять местоположением и размерами диалога подтверждения. (рис 9.8)

    Кроме обязательных данных, которые мы инициализировали, есть ряд параметров для дополнительной плитки:

    secondaryTile.BackgroundColor = "Yellow";
    secondaryTile.ForegroundText =
    Windows.UI.StartScreen.ForegroundText.Dark;
    secondaryTile.TileOptions =
    Windows.UI.StartScreen.TileOptions.ShowNameOnLogo;
    secondaryTile.SmallLogo = new Uri("ms-resource:Assets/secondSmallLogo.png"); 
  • BackgroundColor - фоновый цвет дополнительной плитки;
  • ForegroundText - цвет текста плитки;
  • TileOptions - настройка отображения сокращенного имени на дополнительной плитке;
  • SmallLogo - логотип дополнительной плитки размером 30 x 30 пикселей.
  • Каждое приложение может иметь несколько таких плиток. При этом необходимо помнить, что пользователь решает - размещать дополнительные плитки приложения или нет. У нас же остается возможность решать, какие части приложения пользователь может использовать как дополнительные плитки.

    Во время разработки функционала по добавлению дополнительной плитки желательно следовать ряду рекомендаций. А именно, кнопку добавления удаления плитки размещать во встроенном меню приложения и использовать стандартные значки (Рис. 9.9) для этой кнопки. Если пользователь находится на странице приложения, ссылка на которую не может быть размещена как дополнительная плитка, кнопку добавления отображать не следует. В отдельных сценариях возможны варианты размещения кнопки добавления/удаления плитки вне меню приложения. В таких случаях кнопка не должна дублироваться в меню приложения или должна быть неактивна. (рис 9.9)

    При раз работке логики размещения дополнительной плитки следует подумать об алгоритме формирования идентификаторов для плиток. Это поможет решить, что с ними делать при повторной установке приложения на другом устройстве пользователя.

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

    Контракты приложения

    Еще одной возможностью интеграции приложения с платформой Windows 8 является использование контрактов. Контракты представляют собой соглашение между Windows 8 и одним или несколькими приложениями для Windows Store.

    Для каждого из возможных вариантов интеграции приложения с платформой существует свои контракт. Например, Windows 8 позволяет обмениваться данными между приложениями. Приложение, которое является источником таких данных, поддерживает для этого соответствующий контракт и должно удовлетворять его требованиям. Аналогично для приложений, которые являются потребителями таких данных. Они должны быть интегрированы с соответствующим контактом, который позволит им получать данные.

    Когда приложение использует контракты такого рода, они обязательно должны быть указаны в списке возможностей. В текущей версии платформы мы можем использовать следующие контракты:

  • Settings
  • Search;
  • Sharing;
  • Play To;
  • App to App Picking.
  • В этой лекции рассмотрим первые три.

    Настройки приложения (Settings)

    При использовании этого типа контакта приложение может размещать свои элементы в системной панели настроек (Рис. 9.10). (рис 9.10)

    Панель настроек можно отобразить, используя возможности платформы или из приложения. Для открытия панели из приложения необходимо вызвать статический метод Show() класса Windows.UI.ApplicationSettings.SettingsPane.

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

    var settingsPane = Windows.UI.ApplicationSettings.SettingsPane
    .GetForCurrentView();
    settingsPane.CommandsRequested += settingsPane_CommandsRequested;
    void settingsPane_CommandsRequested(SettingsPane sender,
    SettingsPaneCommandsRequestedEventArgs args)
    {
    args.Request.ApplicationCommands.Add(new
    SettingsCommand("SomeId", "Log Out", (handler)=>
    {
    }));
    }

    Метод GetForCurrentView возвращает объект типа SettingsPane, который, в свою очередь, позволяет подписаться на событие CommandsRequested и в обработчике события добавить необходимые команды в системную панель настроек. При добавлении элементов списка в эту панель необходимо создать объект класса SettingsCommand и указать в конструкторе идентификатор элемента, текстовую строку для отображения в интерфейсе и делегат, который будет обрабатывать нажатия этого элемента списка.

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

    Интеграция с поиском

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

    Используя данный тип контракта, мы соглашаемся с тем, что контент приложения доступен для механизма поиска платформы. Перед использованием этого контракта следует указать в манифесте, что приложение его использует (Рис. 9.11). (рис 9.11) (рис 9.12)

    Дальнейшая интеграция с поиском происходит через объект класса Windows. ApplicationModel.Search.SearchPane. Чтобы получить к нему доступ, следует вызвать статический метод GetForCurrentView() этого же класса. Ключевые события этого класса:

  • QuerySubmitted - уведомляет о том, что приложению следует выполнить поиск по указанному поисковому запросу от пользователя;
  • SuggestionsRequested - позволяет приложению предоставить на выбор пользователя список подсказок для запроса;
  • VisibilityChanged - уведомляет об открытии/закрытии панели поиска.
  • Совместное использование данных (Sharing)

    Возможность совместного использования данных позволяет пользователям работать с несколькими приложениями или службами одновременно. При использовании этого контракта не нужно писать дополнительный код или руководство для других разработчиков только для того, чтобы реализовать механизм совместного использования данных.

    Во время работы с этим видом контракта различают два вида приложений:

  • приложения, которые является источниками данных и отдают их в различных форматах;
  • приложения, которые используют данные совместно.
  • Начнем с механизма, который позволяет предоставлять данные для других приложений/сервисов.

    В основе механизма обмена данными лежит объект класса Windows. ApplicationModel.DataTransfer.DataTransferManager. Доступ к нему можно получить, вызвав статический метод GetForCurrentView() этого же класса:

    datatransferManager = DataTransferManager.GetForCurrentView();
    datatransferManager.DataRequested += new TypedEventHandler
    <DataTransferManager, DataRequestedEventArgs>(this.DataRequested); 

    В обработчике события DataRequested можно указать данные, которые необходимо предоставить другим приложениям. Пример:

    void DataRequested(DataTransferManager sender, DataRequestedEventArgs e)
    {
    e.Request.Data.Properties.Title = this.dataPackageTitle;
    e.Request.Data.Properties.Description =
    this.dataPackageDescription;
    if (this.dataPackageThumbnail != null)
    {
    e.Request.Data.Properties.Thumbnail =
    this.dataPackageThumbnail;
    }
    e.Request.Data.SetText(this.dataPackageText);
    }

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

    Для приложения, которое использует совместные данные, необходимо переопределить метод OnShareTargetActivated класса Application и через параметры получить доступ к совместным данным:

    protected override async void OnShareTargetActivated
    (ShareTargetActivatedEventArgs args)
    {
    if (args.Kind == Windows.ApplicationModel.
    Activation.ActivationKind.ShareTarget)
    {
    var text = await args.ShareOperation.Data.
    GetTextAsync()
    }
    }

    Кроме текста, приложения могут обмениваться файлами, изображениями, контентом html и др. Можно определять свой собственный формат и передавать его другим приложениям. При этом важно, чтобы приложение-потребитель знало формат принимаемых данных.

    Краткие итоги

    Рассмотрены вопросы использования системы навигации WinRT-приложения. Приведены структуры иерархической и плоской систем навигации. Описано назначение и способы работы с панелью навигации WinRT-приложения. Определены особенности WinRT при работе с файлами при разработке WinRT-приложения.

    Вопросы

  • В чем суть иерархической системы навигации?
  • В чем суть плоской системы навигации?
  • Какова структура иерархической навигации?
  • Для чего нужна панель навигации?
  • Какова структура навигации между разделами в приложении?
  • Как используется панель приложения?
  • В чем состоит особенность WinRT при работе с файлами и данными?
  • Какие типа файлового хранилища есть у WinRT-приложения?
  • В чем особенности файловой системы WinRT-приложения?
  • Страницы:

    Приложения для Windows Store поддерживают несколько типов навигации:

  • иерархическая система
  • плоская система
  • (рис 9.1)

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

    Данная система навигации делает приложения для Windows Store быстрыми и динамичными, сохраняя при этом простоту использования. Лучше всего подходит для приложений с крупными коллекциями содержимого или большим количеством разделов содержимого, предназначенного для исследования пользователем. (рис 9.2)

    Суть узловой навигации - в распределении содержимого по различным разделам и по степени развернутости.

    Страницы узлов

    Страницы узлов - это точки входа пользователя в приложение. Здесь содержимое отображается с развертыванием по горизонтали и акцентирует внимание пользователей на новых и доступных элементах.

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

    Страницы разделов

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

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

    Страницы сведений

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

    Страница сведений содержит сведения об элементе или функцию. Страницы сведений могут содержать множество сведений или отдельный объект, например изображение или видеоролик.

    Во многих приложениях для Windows Store используется плоская система навигации. Такая структура распространена в играх, браузерах и офисных приложениях, где пользователь переходит между страницами, вкладками или режимами, которые находятся на одном и том же иерархическом уровне. (рис 9.3)

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

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

    Реализация навигации

    Давайте посмотрим, как приложение в Windows 8 способно отобразить контент. Речь идет именно о контенте, так как разработка приложений для Windows Store базируется на отсутствии оболочки у окна. Тем не менее, окно в приложении присутствует, оно создается неявно, но на него можно получить ссылку, используя свойство Current класса Window. Получив ссылку на окно приложения, разработчик может установить свойство Content, которое будет определять содержимое окна. Когда же содержимое полностью сформировано, его можно отобразить с помощью метода Activate. Иными словами, если в Вашем приложении предусмотрен переход на другие страницы, то этого можно достичь, установив свойство Content в ссылку на страницу и вызвав Activate. В сентябрьской версии Windows 8 (Platform Preview) нечто подобное было реализовано. Проблема лишь в том, что данный механизм не позволяет сохранять историю переходов, не поддерживает хорошего способа передачи параметров и т.д. Поэтому для организации навигации правильно использовать специальный контейнер Frame, который предназначен для поддержки контекста навигации.

    Заглянем внутрь файла App.xaml.cs.

    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
     var rootFrame = new Frame();
     rootFrame.Navigate(typeof(BlankPage));
     Window.Current.Content = rootFrame;
     Window.Current.Activate();
    } 

    Как видите, при запуске приложения создается объект типа Frame, который устанавливается в свойство Content. С помощью метода Navigate объект типа Frame загружает страницу BlankPage (имя страницы по умолчанию), что позволяет отобразить ее после вызова метода окна Activate. Таким образом, Frame является тем классом, который обеспечивает контекст навигации, и дает доступ к ряду методов и свойств, связанных с навигацией:

  • CacheSize - указывает количество страниц, сохраняемых в кэше при "глубокой" навигации;
  • CanGoBack - определяет, возможно ли осуществить навигацию на предыдущую страницу (была ли и есть ли страница в кэше);
  • CanGoForward - определяет, можно ли совершить навигацию на страницу, которую пользователь уже посещал и с которой вернулся на предыдущую;
  • GoBack - выполняет навигацию на предыдущую страницу;
  • GoForward - выполняет навигацию на следующую страницу;
  • Navigated - событие, генерируемое после успешной навигации;
  • Navigating - событие, которое генерируется перед попыткой навигации;
  • NavigationFailed - событие, которое возникает, если во время навигации произошла ошибка (например, страница отсутствует);
  • NavigationStopped - событие, которое генерируется в тот момент, когда текущая навигация была прервана с помощью метода StopLoading или путем выполнения другой навигации;
  • StopLoading - завершает загрузку данных и прекращает навигацию на указанную страницу;
  • Navigate - самый важный метод, который позволяет выполнять навигацию на указанную страницу.
  • Перечисленные методы достаточно просты, поэтому реализация навигации не составляет труда. Если говорить об использовании этих методов в сгенерированном коде, рекомендуется обратиться к файлу LayoutAwarePage.cs, который генерируется при создании любого проекта.

    protected virtual void GoHome(object sender, RoutedEventArgs e)
    {
     if (this.Frame != null)
     {
     while (this.Frame.CanGoBack) this.Frame.GoBack();
     }
    }

    Тут описан обработчик события, которое возникает при нажатии кнопки Home на панели приложения. Как Вы видите, для перехода на основную страницу совершена попытка вернуться на главную вследствие пролистывания всех страниц в обратном порядке. При этом объект типа Frame можно получить через одноименное свойство объекта Page, а потом осуществлять навигацию.

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

    Создавая приложения для Windows 8, возможно использовать различные уведомления (Tile, Toast), интеграцию с поиском, делиться информацией со своими друзьями через социальные сервисы и удобно настраивать приложения под свои нужды. В этой главе мы рассмотрим возможности интеграции наших приложений с Windows 8.

    Работа с плиткой

    Плитка является неотъемлемой частью приложения для Windows Store и позволяет пользователям запускать приложения со стартового экрана ОС. По умолчанию плитка - статическое изображение. Но мы можем добавить ему динамики, тем самым заинтересовав пользователя, сообщая об изменениях, когда приложение находится в неактивном состоянии. Динамические плитки позволяют Windows 8 казаться "живой".

    Для приложений мы можем использовать два режима отображения плиток (Рис. 9.4). Пользователь сам выбирает, какой из них использовать на стартовом экране:

  • Стандартный - может содержать бренд приложения - название или логотип продукта, а также значок. Из-за того, что данный режим отображения плитки может содержать ограниченный набор контента, доступен только один шаблон для его создания;
  • Расширенный - этот режим отображения плитки может содержать те же данные, что и стандартный режим, а также еще более детализированное описание и визуально интригующее оформление. В этом режиме существует широкий выбор шаблонов, которые позволят сделать контент более привлекательным. При использовании этого режима приложение обязательно должно иметь плитку стандартного размера, чтобы пользователь мог в любой момент переключиться на компактную плитку.
  • (рис 9.4)

    Содержимое плитки определяется в документе XML, который выбирается из множества шаблонов. Плитка может содержать изображение и текст, в зависимости от того, какой шаблон был выбран, а также отображать значок, логотип или короткое имя приложения (Рис. 9.5). Значок отображается в правом нижнем углу плитки. Короткое имя располагается в левом нижнем углу. В манифесте приложения мы выбираем, что хотим отображать: короткое имя приложения или его логотип. (рис 9.5) (рис 9.6)

    При настройке плитки можно указать возможность повторения до 5 последних уведомлений. Каждому уведомлению можно присваивать идентификатор, с помощью которого система будет решать, необходимы ли обновление или замена одного из существующих уведомлений на клиенте. Если Windows находит уведомление с таким же идентификатором, происходит замена. Если такого идентификатора в очереди нет, то из нее вытесняется наиболее старое уведомление.

    Когда приложение устанавливается в первый раз, на стартовом экране отображается плитка приложения по умолчанию. Это статическая картинка определена в манифесте приложения; обычно она отображает логотип продукта.

    Эта картинка заменяется только в случае отправки соответствующего уведомления. Фактически мы создаем плитки при указании их в манифесте приложения. Дальнейшие его модификации возможны только через уведомления. Плитка приложения может вернуться в исходное состояние, если отсутствуют уведомления, которые необходимо отобразить. Это возможно, если пользователь находится в автономном режиме или истек срок действия уведомлений. Статические плитки прорисовываются поверх установленного цвета фона приложения в манифесте. Если плитка содержит прозрачные области, то в этих местах будет отображаться установленный фон.

    К плиткам приложения по умолчанию есть несколько требований:

  • изображение должно быть в формате .png или .jpg;
  • размер стандартной плитки 150 x 150 пикселей;
  • размер расширенной плитки 310 x 150 пикселей (является дополнительным);
  • маленькая версия стандартной плитки 30 х 30 пикселей. Используется на странице поиска;
  • размер файла до 150 KB.
  • Для использования плиток необходимо добавить их в проект и настроить манифест проекта на их использование (Рис. 9.7). (рис 9.7)

    Теперь перейдем к созданию динамических плиток. Выше мы обсуждали возможные шаблоны плиток. В текущей версии Windows 8 у нас есть на выбор 30 шаблонов. Чтобы выбрать один из заготовленных шаблонов, необходимо использовать метод GetTemplateContent класса Windows.UI.Notifi cations.TileUpdateManager. Ниже приведен пример кода, который отправляет сообщение "Tile Message" на расширенную плитку нашего приложения (приложение должно содержать картинку расширенной плитки):

    XmlDocument tileXml = TileUpdateManager.
    GetTemplateContent(TileTemplateType.TileWideText04);
    XmlNodeList textElements = tileXml.GetElementsByTagName("text");
    textElements.Item(0).AppendChild(tileXml.CreateTextNode("Tile Message"));
    TileNotifi cation tile = new TileNotifi cation(tileXml);
    TileUpdateManager.CreateTileUpdaterForApplication().Update(tile); 

    Параметр метода GetTemplateContent указывает на то, какой шаблон мы хотим использовать. Каждый шаблон представлен в виде разметки xml. Так, разметка нашего шаблона следующая:

    <?xml version="1.0" encoding="utf-16"?><tile>
    <visual lang="en-US">
    <binding template="TileWideText04">
    <text id="1"></text>
    </binding> 
    </visual>
    </tile> 

    После добавления необходимого сообщения шаблон будет отображаться следующим образом:

    <?xml version="1.0" encoding="utf-16"?><tile>
    <visual lang="en-US">
    <binding template="TileWideText04">
    <text id="1">Tile Message</text>
    </binding>
    </visual>
    </tile> 

    При помощи последней строки кода из приведенного выше примера обновляется плитка приложения. Выбранный нами шаблон позволяет отображать указанное сообщение на расширенной плитке приложения. Полный список возможных шаблонов приведен на странице MSDN (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.notifications.tiletemplatetype.aspx).

    Рассмотренные выше возможности по изменению плитки приложения можно выполнять как локально (вышеприведенный пример), так и с сервиса, который находится в облаке и связан с приложением.

    Помимо основной плитки приложение может иметь дополнительную. Дополнительная плитка позволяет пользователю создавать еще один интерактивный элемент на стартовом экране Windows 8, а также открыть приложение на странице, на которой была создана дополнительная плитка.

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

  • быстрый переход на страницу важного контакта в социальных приложениях;
  • лента для программы RSS Reader;
  • пользовательские события в приложении Календарь и т.д.
  • Ситуация, в которой пользователю необходимо иметь быстрый доступ к часто обновляемому контенту или странице в глубине навигации приложения, является отличной возможностью для использования дополнительной плитки. Для применения дополнительной плитки хорошо подходят следующие сценарии:

  • отображение последних новостей из RSS;
  • данные о погоде;
  • обновление статусов друзей в социальных сетях;
  • журнал событий из календаря пользователя.
  • Любой часто изменяющийся контент нашего приложения может быть размещен в дополнительной плитке. Требования к дополнительной плитке приложения преимущественно совпадают с требованиями к основной:

  • изображение размером 150 х 150 пикселей;
  • использование шаблонов плитки для определения внутреннего контента;
  • может содержать расширенный логотип размером 310 х 150 пикселей;
  • автоматическое удаление при удалении приложения;
  • размещение как на рабочем столе, так и при просмотре списка всех приложений;
  • может отображать уведомления и значки.
  • Хотя у основной и дополнительной плитки много общего, есть и ряд отличий:

  • дополнительная плитка создается пользователем во время выполнения приложения;
  • при добавлении плитки пользователь должен подтвердить данное действие;
  • дополнительную плитку пользователь может удалить в любой момент без удаления программы.
  • Для добавления плитки необходимо создать объект класса Windows. UI.StartScreen.SecondaryTile и указать минимальный набор данных:

    var secondaryTile = new Windows.UI.StartScreen.SecondaryTile();
    secondaryTile.TileId = "3gFDG34GFS456FER";
    secondaryTile.ShortName = "2nd Tile";
    secondaryTile.DisplayName = "Secondary Tile";
    secondaryTile.Arguments = "Some arguments";
    secondaryTile.Logo = new Uri("ms-resource:Assets/secondLogo.png");
    secondaryTile.WideLogo = new Uri("ms-resource:Assets/secondWideLogo.png"); 

    Для объекта SecondaryTile обязательно должны быть инициализированы следующие свойства:

  • TileId - идентификатор плитки. С помощью этого значения можно в дальнейшем получать доступ к плитке и обновлять ее содержимое. Статический метод FindAllAsync класса SecondaryTile позволяет получить доступ к плитке, а метод экземпляра UpdateAsync - обновить его;
  • ShortName -сокращенное имя, которое отображается непосредственно на плитке;
  • DisplayName - полное название приложения, которое отображается в подсказке плитки, в списке всех установленных приложений и в панели управления;
  • Arguments - параметры, которые передаются в приложение при запуске с дополнительной плитки;
  • Logo - логотип приложения для дополнительной плитки;
  • WideLogo - расширенный логотип для дополнительной плитки. Свойство WideLogo необходимо инициализировать, только если нужно использовать расширенную дополнительную плитку для нашего приложения. После инициализации всех обязательных данных необходимо вызвать метод RequestCreateAsync экземпляра класса SecondaryTile: secondaryTile.RequestCreateAsync();
  • Этот метод может принимать объект типа Point, который указывает координаты отображения диалога (Рис. 9.8) о подтверждении размещения дополнительной плитки приложения. Можно также использовать метод RequestCreateForSelectionAsync, который позволяет более гибко управлять местоположением и размерами диалога подтверждения. (рис 9.8)

    Кроме обязательных данных, которые мы инициализировали, есть ряд параметров для дополнительной плитки:

    secondaryTile.BackgroundColor = "Yellow";
    secondaryTile.ForegroundText =
    Windows.UI.StartScreen.ForegroundText.Dark;
    secondaryTile.TileOptions =
    Windows.UI.StartScreen.TileOptions.ShowNameOnLogo;
    secondaryTile.SmallLogo = new Uri("ms-resource:Assets/secondSmallLogo.png"); 
  • BackgroundColor - фоновый цвет дополнительной плитки;
  • ForegroundText - цвет текста плитки;
  • TileOptions - настройка отображения сокращенного имени на дополнительной плитке;
  • SmallLogo - логотип дополнительной плитки размером 30 x 30 пикселей.
  • Каждое приложение может иметь несколько таких плиток. При этом необходимо помнить, что пользователь решает - размещать дополнительные плитки приложения или нет. У нас же остается возможность решать, какие части приложения пользователь может использовать как дополнительные плитки.

    Во время разработки функционала по добавлению дополнительной плитки желательно следовать ряду рекомендаций. А именно, кнопку добавления удаления плитки размещать во встроенном меню приложения и использовать стандартные значки (Рис. 9.9) для этой кнопки. Если пользователь находится на странице приложения, ссылка на которую не может быть размещена как дополнительная плитка, кнопку добавления отображать не следует. В отдельных сценариях возможны варианты размещения кнопки добавления/удаления плитки вне меню приложения. В таких случаях кнопка не должна дублироваться в меню приложения или должна быть неактивна. (рис 9.9)

    При раз работке логики размещения дополнительной плитки следует подумать об алгоритме формирования идентификаторов для плиток. Это поможет решить, что с ними делать при повторной установке приложения на другом устройстве пользователя.

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

    Контракты приложения

    Еще одной возможностью интеграции приложения с платформой Windows 8 является использование контрактов. Контракты представляют собой соглашение между Windows 8 и одним или несколькими приложениями для Windows Store.

    Для каждого из возможных вариантов интеграции приложения с платформой существует свои контракт. Например, Windows 8 позволяет обмениваться данными между приложениями. Приложение, которое является источником таких данных, поддерживает для этого соответствующий контракт и должно удовлетворять его требованиям. Аналогично для приложений, которые являются потребителями таких данных. Они должны быть интегрированы с соответствующим контактом, который позволит им получать данные.

    Когда приложение использует контракты такого рода, они обязательно должны быть указаны в списке возможностей. В текущей версии платформы мы можем использовать следующие контракты:

  • Settings
  • Search;
  • Sharing;
  • Play To;
  • App to App Picking.
  • В этой лекции рассмотрим первые три.

    Настройки приложения (Settings)

    При использовании этого типа контакта приложение может размещать свои элементы в системной панели настроек (Рис. 9.10). (рис 9.10)

    Панель настроек можно отобразить, используя возможности платформы или из приложения. Для открытия панели из приложения необходимо вызвать статический метод Show() класса Windows.UI.ApplicationSettings.SettingsPane.

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

    var settingsPane = Windows.UI.ApplicationSettings.SettingsPane
    .GetForCurrentView();
    settingsPane.CommandsRequested += settingsPane_CommandsRequested;
    void settingsPane_CommandsRequested(SettingsPane sender,
    SettingsPaneCommandsRequestedEventArgs args)
    {
    args.Request.ApplicationCommands.Add(new
    SettingsCommand("SomeId", "Log Out", (handler)=>
    {
    }));
    }

    Метод GetForCurrentView возвращает объект типа SettingsPane, который, в свою очередь, позволяет подписаться на событие CommandsRequested и в обработчике события добавить необходимые команды в системную панель настроек. При добавлении элементов списка в эту панель необходимо создать объект класса SettingsCommand и указать в конструкторе идентификатор элемента, текстовую строку для отображения в интерфейсе и делегат, который будет обрабатывать нажатия этого элемента списка.

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

    Интеграция с поиском

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

    Используя данный тип контракта, мы соглашаемся с тем, что контент приложения доступен для механизма поиска платформы. Перед использованием этого контракта следует указать в манифесте, что приложение его использует (Рис. 9.11). (рис 9.11) (рис 9.12)

    Дальнейшая интеграция с поиском происходит через объект класса Windows. ApplicationModel.Search.SearchPane. Чтобы получить к нему доступ, следует вызвать статический метод GetForCurrentView() этого же класса. Ключевые события этого класса:

  • QuerySubmitted - уведомляет о том, что приложению следует выполнить поиск по указанному поисковому запросу от пользователя;
  • SuggestionsRequested - позволяет приложению предоставить на выбор пользователя список подсказок для запроса;
  • VisibilityChanged - уведомляет об открытии/закрытии панели поиска.
  • Совместное использование данных (Sharing)

    Возможность совместного использования данных позволяет пользователям работать с несколькими приложениями или службами одновременно. При использовании этого контракта не нужно писать дополнительный код или руководство для других разработчиков только для того, чтобы реализовать механизм совместного использования данных.

    Во время работы с этим видом контракта различают два вида приложений:

  • приложения, которые является источниками данных и отдают их в различных форматах;
  • приложения, которые используют данные совместно.
  • Начнем с механизма, который позволяет предоставлять данные для других приложений/сервисов.

    В основе механизма обмена данными лежит объект класса Windows. ApplicationModel.DataTransfer.DataTransferManager. Доступ к нему можно получить, вызвав статический метод GetForCurrentView() этого же класса:

    datatransferManager = DataTransferManager.GetForCurrentView();
    datatransferManager.DataRequested += new TypedEventHandler
    <DataTransferManager, DataRequestedEventArgs>(this.DataRequested); 

    В обработчике события DataRequested можно указать данные, которые необходимо предоставить другим приложениям. Пример:

    void DataRequested(DataTransferManager sender, DataRequestedEventArgs e)
    {
    e.Request.Data.Properties.Title = this.dataPackageTitle;
    e.Request.Data.Properties.Description =
    this.dataPackageDescription;
    if (this.dataPackageThumbnail != null)
    {
    e.Request.Data.Properties.Thumbnail =
    this.dataPackageThumbnail;
    }
    e.Request.Data.SetText(this.dataPackageText);
    }

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

    Для приложения, которое использует совместные данные, необходимо переопределить метод OnShareTargetActivated класса Application и через параметры получить доступ к совместным данным:

    protected override async void OnShareTargetActivated
    (ShareTargetActivatedEventArgs args)
    {
    if (args.Kind == Windows.ApplicationModel.
    Activation.ActivationKind.ShareTarget)
    {
    var text = await args.ShareOperation.Data.
    GetTextAsync()
    }
    }

    Кроме текста, приложения могут обмениваться файлами, изображениями, контентом html и др. Можно определять свой собственный формат и передавать его другим приложениям. При этом важно, чтобы приложение-потребитель знало формат принимаемых данных.

    Краткие итоги

    Рассмотрены вопросы использования системы навигации WinRT-приложения. Приведены структуры иерархической и плоской систем навигации. Описано назначение и способы работы с панелью навигации WinRT-приложения. Определены особенности WinRT при работе с файлами при разработке WinRT-приложения.

    Вопросы

  • В чем суть иерархической системы навигации?
  • В чем суть плоской системы навигации?
  • Какова структура иерархической навигации?
  • Для чего нужна панель навигации?
  • Какова структура навигации между разделами в приложении?
  • Как используется панель приложения?
  • В чем состоит особенность WinRT при работе с файлами и данными?
  • Какие типа файлового хранилища есть у WinRT-приложения?
  • В чем особенности файловой системы WinRT-приложения?
  • Вернуться к учебному плану