Источник: Разработка приложений под Windows 8: почему и как

Последние 5-7 лет мы все наблюдаем явление, которое аналитики называют консьюмеризацией ИТ. Не вдаваясь в историю и подробности этого явления, характерного не только ИТ-отрасли, стоит отметить главное – именно «консьюмеры» сегодня создают львиную долю пресловутой добавленной стоимости – иногда своим большим числом, иногда – способностью и желанием переплачивать за новинки и вообще интересные идеи.
Операционная система Windows, получившая тотальное распространение на волне консьюмеризации середины девяностых годов, планомерно развивалась до середины «нулевых», когда персонализация вычислений получила новый мощный толчок – настоящую мобильность и доступность.

Одновременно с этим, с подачи Apple и просто в силу удешевления производства соответствующих экранов, огромную популярность стал завоевывать touch-интерфейс, когда пользователь работает с приложениями с помощью прикосновений и жестов, непосредственно касаясь пальцами экрана.
clip_image003[6]
Другим существенным сдвигом, в огромной степени повлиявшим на умы разработчиков приложений, стало следствие тотальной мобилизации вычислений – упрощение приложений. Нет, люди не стали меньше работать со «сложными» приложениями и их производительность не упала. Они стали работать и играть с компьютером (в форме телефона, планшета или лэптопа) на порядок чаще, фактически постоянно, на ходу. Людям стало необходимо сильно большее количество приложений.
clip_image005[4]Но, как следствие среды и размера устройств, все эти приложения становились очень простыми, чаще всего направленными на потребление контента или игру. Другими словами, без уменьшения спроса на приложения для созидания, появилась огромная, существенно большая потребность в приложениях для потребления.
Еще одним характерным явлением стала популярность магазинов приложений. Эта простая идея решила две важнейшие задачи: для пользователя – где взять приложение, для разработчика – где его продавать. При всей простоте идеи, много лет так называемый «канал продаж» был головной болью разработчиков консьюмерских приложений. Это как раз тот случай, когда прямые указания, где покупать и где продавать, делают путь от разработчика к покупателю самым коротким. И, конечно же, немаловажным фактором успеха современных магазинов приложений стала простота, с которой индивидуальные разработчики или небольшие команды могут размещать свои творения для продажи. Это, кстати, одно из немногих отличий магазинов приложений от классического ритейла.
Каждый из нас сегодня, работая с Visual Studio, AutoCAD, Photoshop, Excel или 1C, выполняет для мира производителей ПО и компьютеров ту же задачу, что и 15-20 лет назад – покупает «дом и хлеб». Беря в руки смартфон или планшет, вы становитесь покупателем «сникерсов и орбитов», то есть товаров или с ощутимо более высокой оборачиваемостью или, а чаще «и», с большей добавленной стоимостью.
clip_image007[4]Разработчики Windows, еще задолго до появления iPad, начали проект по разработке нового поколения флагманской операционной системы, где решались 3 задачи:
1. Увеличение времени автономной работы тремя путями – общей оптимизацией, переносом на другие архитектуры (ARM) и, наконец, выработкой правил для разработчиков, когда приложение минимизирует потребляемые ресурсы.
2. Оптимизация под touch-интерфейс.
3. Создание экосистемы по продаже и продвижению приложений.
В результате начала выкристаллизовываться новая Windows, обещающая стать самым существенным сдвигом в парадигме операционных систем от Microsoft и, одновременно, самым рискованным. Со времен Windows 95 мы не предлагали столь кардинальных изменений для разработчиков и пользователей. А учитывая огромную распространенность Windows, сегодняшние изменения – самые большие в истории.
Одновременно с этим, Windows 8 – самая большая в истории возможность для разработчиков. Ведь, у каждого пользователя Windows появляется Windows Store – магазин приложений, который является основным (а в некоторых случаях – единственным) источников приложений для его компьютера, будь то десктоп, лэптоп или планшет. Экономика Windows 8 – хорошая тема для отдельной статьи. А сейчас самое время перейти к разработке приложений.
Если вы еще не загрузили Windows 8 Release Preview и Visual Studio 2012 RC, сейчас самое время поставить их на закачку. Windows 8 можно загрузить отсюда, а Visual Studio 2012 RC доступен здесь. Для разработки под Windows 8 вам необходима сама Windows 8.

Что такое Metro

Основные изменения для пользователя и разработчика в Windows 8 можно описать одним словом – METRO. Этот термин включает в себя две новых концепции: Windows Runtime (WinRT) и Metro UI.
Говоря “metro-приложения”, мы подразумеваем не только новый интерфейс, но и новую платформу разработки. Это важно.
Что же представляет собой приложение в стиле metro. Если кратко, то это сплав новой парадигмы интерфейса, нового эффективного API и соответствующей платформы разработки, плюс интеграция с системой и другими приложениями.

У приложений имеется одно окно с поддержкой нескольких представлений

В отличие от классических приложений приложения в стиле Metro содержат одно окно без хрома, по умолчанию занимающее весь экран, чтобы пользователя не отвлекали лишние детали.
clip_image008[4]
Приложение в стиле Metro может поддерживать различные компоновки и представления, чтобы обеспечить динамичное и удобное обслуживание пользователя при различных параметрах конструкции и размерах экрана устройств.
clip_image009[4]

Приложения позволяют использовать сенсорный ввод? ввод с помощью пера, клавиатуры и мыши

Приложения в стиле Metro без проблем работают с различными источниками входных данных, включая перо, мышь, клавиатуру и сенсорный ввод. Для всех этих источников входных данных вы можете использовать единый набор событий. В приложения в стиле Metro включается набор стилей по умолчанию, гарантирующий нормальную работу элементов пользовательского интерфейса с сенсорным вводом.
clip_image003[7]

Приложения могут взаимодействовать друг с другом

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

В приложениях доступны новые элементы управления и области интерфейса

Приложения в стиле Metro содержат несколько новых элементов управления, упрощающих организацию эффективного взаимодействия с пользователями. Среди этих элементов можно выделить строку команд (App Bar) приложения и чудо-кнопки (Charms).

Строка команд приложения(App Bar)

Строка команд приложения размещается вне окна приложения и является его основным командным интерфейсом. Используйте строку команд для размещения элементов навигации, команд и инструментов для пользователей. По умолчанию строка команд приложения скрыта и появляется, когда пользователь проводит пальцем в направлении от верхнего или нижнего края экрана. Она является обложкой для содержимого приложения и может быть скрыта пользователем, если он проведет пальцем по краю экрана или будет взаимодействовать с приложением.
clip_image010[4]

Чудо-кнопки (Charms)

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

  • Искать содержимое, размещенное в вашем или другом приложении. Кроме того, поиск содержимого в вашем приложении возможен из другого приложения.
  • Делиться содержимым из вашего приложения с контактами или службами.
  • Перейти прямо на Начальный экран.
  • Подключаться к устройствам и отправлять содержимое, выполнять потоковую передачу мультимедиа, а также печатать документы.
  • Использовать параметры для настройки приложения по своему усмотрению.

clip_image011[4]

Приложения используют плитки вместо значков (Tiles vs. Icons)

Когда пользователь устанавливает ваше приложение, оно появляется на начальном экране как плитка. Если коснуться или щелкнуть плитку, приложение будет запущено.
clip_image012[4]
Приложение может предоставлять содержимое с помощью плитки, даже когда не работает. Используя динамические плитки (Live Tiles), приложение способно выводить на экран полезные данные в краткой форме при минимальном расходе заряда батареи устройства.
Приложение может настроить систему для периодического запроса обновлений в веб-службе вне зависимости от того, работает ли оно. Кроме того, в приложениях доступна настройка служб push-уведомлений Windows (WNS), чтобы отправлять сообщения напрямую из веб-службы в динамическую плитку.
clip_image013[4]

Написание приложений на знакомом разработчику языке

Вы можете создавать приложения в стиле Metro на языках, которые лучше всего знаете, например на JavaScript, C#, Visual Basic или C++. Более того, можно создавать компоненты на одном языке и использовать их в приложении, написанном на другом языке программирования.

Продажа приложений через Магазин Windows

Главный источник приложений в стиле Metro – Windows Store. Вы создаете приложение, указываете цену, а Магазин Windows предложит ваше приложение на мировом рынке более чем на 100 языках.
clip_image014[4]

WinRT

До недавнего времени разработчики под Windows использовали две основных группы API: native через Win32 API и managed через .NET Framework. При этом, вторая группа постепенно развивалась, получая различные модели создания пользовательского интерфейса, работы с данными и сервисами, построения исходного кода и архитектуры приложений и так далее.
Между тем, сама Windows – то есть Win32 API получала не так много настоящих толчков к развитию базовой модели разработки. Пожалуй, последним существенным явлением был COM. Все эти годы сами компьютеры не стояли на месте. Появлялись всевозможные сенсоры, сетевые устройства (включая 3G/LTE и т.п.), камеры, чувствительные к прикосновениям экраны. Наконец, энергопотребление становилось все более важным.
Таким образом, создавая новую Windows, мы понимали, что необходимо разработать и новый API, который будучи родным (native) для операционной системы, станет отвечать неким минимальным требованиям и веяниям времени. В результате родился Windows Runtime (WinRT).
Что несет с собой WinRT:
1. Это native API, работающий вместе с оптимизированным COM API. При этом возможна работа manage-сред поверх WinRT (и .NET Framework в Windows 8 – тому пример).
2. Это объектно-ориентированный API, включающий универсальный формат метаданных типов.
3. WinRT включает поддержку многих современных свойств персональных компьютеров (сенсоры, камеры и т.п.). а энергосбережение является тут чрезвычайно важным.
4. Это языконезависимый API, изначально поддерживающий различные модели:
a. С++
b. .NET Framework с C# и Visual Basic
c. HTML5 и JavaScript
5. Современная декларативная модель разработки интерфейсов на XAML или HTML5 стала частью Windows API, а не надстройкой над ним.
В результате приложения под Windows разделились на 2 группы:
1. Классические desktop-приложения.
2. Новые metro-приложения.
clip_image016[4]
Сам WinRT, помимо, собственно функционала, отвечающего за выполнение тех или иных функций, получил ряд важных компонентов.
clip_image018[4]
Этими компонентами стали:
1. Подсистема метаданных и языковых проекций.
Благодаря ей, компоненты, написанные на разных языках программирования, могут вызывать друг друга.
2. Брокеры. Эти компоненты несут две важные функции:
a. Поддержка обмена данными между приложениями. Например, в тех случаях, когда вы хотите отправить данные из какого-то приложения через почтовый клиент.
b. Защита некоторых важных вызовов через механизм capabilities и явных разрешений. Например, если приложение захочет использовать камеру, система сперва спросит у пользователя, допускает ли он это. Аналогично и, например, с GPS – приложение должно обозначить такую потребность еще на этапе разработки, плюс пользователь может явно разрешить или запретить ему использование информации о местоположении.
Есть также еще две важные части Windows API, доступные и используемые metro-приложениями:
1. Application Model и Windows Store API.
Эта группа управляет важными составляющими приложения:
a. Составом компонентов.
b. Возможностями (capabilities), затрагивающим безопасность и функционирование системы, такими как, доступ к местоположению, файловой системе, сети, идентификации пользователя, всевозможным точкам интеграции с системой и так далее.
c. Взаимодействием с Windows Store и информацией о приложении, которое, как мы уже знаем, в подавляющем большинстве случаев, будет установлено именно оттуда.
2. DirectX и подмножество Win32 и COM API, доступные для компонентов и приложений, разрабатываемых на C++.
Они необходимы с одной стороны разработчикам игр и мультимедиа-приложений (DirectX), с другой стороны – для портирования существующего кода (подмножество Win32).

Модель выполнения приложений в WinRT

Отдельно необходимо остановиться на модели выполнения или, как еще можно сказать, жизни приложения в Windows 8 и WinRT.
Цикл жизни metro-приложения существенно отличается от такового для приложений классических. Его можно разделить на три группы:
1. Установка.
2. Выполнение.
3. Удаление.
С первым и третьим все более-менее понятно, хотя Windows Store и тут дает дополнительные возможности. Но вот цикл выполнения сам по себе требует отдельного внимания.
Стадии выполнения приложения точно описываются перечислениемApplicationExecutionState.
clip_image019[4]
Говоря проще, если пользователь не работает прямо сейчас с вашим приложением, не работает и само приложение. Оно либо спит (suspended) либо и вовсе выгружается. Подробнее об этом написано в статье Application lifecycle.
Однако, не стоит думать, что в WinRT невозможно выполнение фоновых процессов. Два замечательных документа очень хорошо описывают подходы и правила разработки фоновых процессов.

Introduction to Background Tasks  This paper describes the programming model to create background tasks, resource management policies for background tasks, and built-in user controls that allow the user to control per-app background task activity by using lock screen personalization.
Background Networking This paper provides information about an app lifecycle management model for apps that require real-time connectivity between the client and server. To address the lifecycle limitations for real-time connected apps, Windows 8 introduces a new set of APIs that enable users to build always-reachable apps.

 

Файловая система и данные приложений в WinRT

Еще одна особенность WinRT – порядок работы с файлами и данными. Для начала следует сказать, что в общем случае данные metro-приложений изолированы друг от друга. Это обеспечивает стабильность и безопасность как самих приложений, так и системы в целом.
Подробнее об данных приложений можно прочитать здесь, но суть состоит в том, что у всякого metro-приложения есть три типа файлового хранилища:
1. Локальное.
2. Временно.
3. Переносимое (roaming).
Первый тип, как следует из названия, содержит файлы и папки, которые приложение создает на локальном компьютере в специальной области, выделенной этому приложению.
Второй тип очень похож на первый с тем исключением, что как только приложение выгружается, система может в любой момент удалить такие временные данные.
Третий тип хранилища – roaming, представляет собой файлы и папки синхронизируемые между всеми устройствами с Windows 8, где зарегистрировался тот же пользователь, который в вашем приложении изначально создал данные. Пользователь определяется по Microsoft ID, который также все знают под именем LiveID.

Файловая система и разрешения

Все это не означает, что приложение не может получить доступ к файлам, находящимся на всем остальном пространстве дисков устройства. Для этого предназначено два механизма: File Pickers и Libraries.
Первый механизм позволяет получить доступ к файлам через запрос пользователя на выбор таких файлов. Он их явно выбирает, давая таким образом доступ к этим файлам вашему приложению.
Второй механизм дает прямой доступ к файлам библиотек документов Windows: Documents, Pictures, Videos и т.д. Этот подход требует соблюдения двух условий:
1. Декларации того факта, что вы хотите получить доступ к библиотекам. Декларация производится еще на этапе разработки приложения. Устанавливая его из Windows Store, пользователь видит, к каким библиотекам приложение будет иметь доступ.
2. Для некоторых типов библиотек (Documents и файлов на внешних устройствах) необходимо определить ассоциацию приложения с типами файлов. И именно к файлам этих типов оно получит доступ.
Подробнее обо все этом можно почитать здесь.

Манифест приложения и capabilities

Выше в тексте уже неоднократно упоминались capabilities (характеристик) в контексте декларации приложением некоторых действий, которые оно планирует совершать в системе.
Действительно, схема пакета приложения важна сама по себе, а файл манифеста как ее часть, говорит очень много о функционале программы.
Подробнее об это можно почитать тут. Также посмотреть и послушать эту сессиюконференции BUILD.

Дальнейшие шаги

В этой статье дан обзор основных идей Windows 8:
· Зачем она создавалась именно такой
· Что такое Metro и Windows Runtime (WinRT)
· Каковы особенности функционирования приложений в WinRT
Теперь самое время запустить Visual Studio 2012 в уже установленной Windows 8 и попробовать написать свое первое приложение.
Для этого есть отличное пошаговое руководство «Разработка приложений в стиле Metro с помощью Visual Studio 2012 RC».
clip_image020[4]
Очень важно правильно спланировать приложение – его интерфейс, схему организации, возможности по интеграции с системой и т.д. В этом вам поможет «Руководство по планированию приложений в стиле Metro»

Полезные ссылки

* * *

Источник: Windows 8. Контракт «поиск» в деталях

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

В этой статье рассматривается:
1. Интеграция поиска в метро приложение
2. Контекстные подсказки (suggestions).
3. Обработка запроса по мере ввода данных.
4. Неосторожное использование контракта поиска (обычные ошибки интеграции).

1. Интеграция поиска в метро приложение

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

Самым простым способом добавления поддержки контракта поиска является использование готового шаблона в студии:

В VS2012 есть встроенный шаблон SearchContract который добавляет соответствующую запись в манифест (если этого не было сделано), добавляет запись в app.xaml.cs(переопределение метода OnSearchActivated если этого еще не было сделано), и добавляет страницу принимающий поисковой запрос с минимальной логикой обработки.

Мы не будем детально рассматривать использования этого шаблона и пошагово рассмотрим добавление поддержки контракта поиска:

В первую очередь в манифесте приложения (файл Package.appxmanifest) нам необходимо указать, что наше приложение поддерживает контракт поиска. Для этого открыв этот манифест в студии, во вкладке “declarations” добавляем контракт поиска.

Далее в классе приложения “app.xaml.cs” мы можем переопределить алгоритм активации приложения через контракт поиска и указать нужную нам логику. Для простоты сделаем, что бы у нас всегда открывалась отдельная страница (SearchPage.xaml) при активации по контракту поиска.

 protected override void OnSearchActivated(SearchActivatedEventArgs args) { var frame = Window.Current.Content as Frame; if(frame==null) { frame=new Frame(); Window.Current.Content = frame; } frame.Navigate(typeof(SearchPage), args.QueryText); Window.Current.Activate(); } 

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

Надо учитывать, что если приложение не было запущено, приложение запускается через метод OnSearchActivated. В связи с этим текущий фрейм может быть еще не создан. Проверка на null осуществляется для инициализации фрейма при первом запуске приложения.

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

 protected override void OnNavigatedTo(NavigationEventArgs e) { var query = (string)e.Parameter; SearchByQuery(query); } private void SearchByQuery(string queryText) { pageTitle.Text = "Search result for \"" + queryText + "\":"; //Логика обработки поискового запроса } 

2. Контекстные подсказки (suggestions).

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

 2. 1. Текстовые подсказки

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

 public SearchPage()         {             this.InitializeComponent();             SearchPane.GetForCurrentView().SuggestionsRequested += SearchPage_SuggestionsRequested;         } 

Далее в методе SearchPage_SuggestionsRequested мы можем добавить необходимые контекстные подсказки:

 void SearchPage_SuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs args)         {             var products=new[] { "apple", "cheese", "bread", "onion", "orange", "potato"}             args.Request.SearchSuggestionCollection.AppendQuerySuggestions(products);         } 

Теперь, если мы в конструкторе подпишемся на событие выбор запроса:

SearchPane.GetForCurrentView().QueryChanged += SearchPage_QueryChanged;

Мы сможем обрабатывать выбор пользователя из подсказок.

 void SearchPage_QueryChanged(SearchPane sender, SearchPaneQueryChangedEventArgs args)         {             SearchByQuery(args.QueryText);         }

2.2. Сложные подсказки

API SearchContract позволяет нам реализовать более сложные виды контекстных подсказок:

Предположим у нас есть некий слой логики (LogicLayer) который возвращает нам продукт с полями:

 public class Product     {         public string Name { get; set; }         public string Image { get; set; }         public string Description { get; set; }         public string Id { get; set; }     } 

Теперь в методе SearchPage_SuggestionsRequested мы должны использовать метод args.Request.SearchSuggestionCollection.AppendResultSuggestion для добавления более сложных подсказок.

 void SearchPage_SuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs args)         {             foreach (var product in LogicLayer.SearchProduct(args.QueryText))             {                 var image = RandomAccessStreamReference.CreateFromUri(newUri(product.Image));                 args.Request.SearchSuggestionCollection.AppendResultSuggestion(product.Name, product.Description, product.Id, image, String.Empty);             }         } 

Здесь мы в качестве тегов передаем Id продукта. При выборе пользователем сложных подсказок не срабатывает событие QueryChanged. Для обработки сложных подсказок есть специальное
событие ResultSuggestionChosen.

Мы можем добавить в конструктор обработку этого события.

SearchPane.GetForCurrentView().ResultSuggestionChosen += SearchPage_ResultSuggestionChosen;

Теперь мы можем получить ссылку на идентификатор продукта и обработать его:

 void SearchPage_ResultSuggestionChosen(SearchPane sender, SearchPaneResultSuggestionChosenEventArgs args)         {             var id = args.Tag;             SearchById(query);         } 

2.3. Контекстные подсказки на всех страницах.

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

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

Добавим метод SubscribeToSearchEvents в App.xaml.cs

 private bool isSubscribed; public void SubscribeToSearchEvents() { if (!isSubscribed) { isSubscribed = true; SearchPane.GetForCurrentView().SuggestionsRequested += SearchPage_SuggestionsRequested; SearchPane.GetForCurrentView().ResultSuggestionChosen += SearchPage_ResultSuggestionChosen; SearchPane.GetForCurrentView().QueryChanged += SearchPage_QueryChanged; } } 

Теперь достаточно вызвать его в методах OnLaunched и OnSearchActivated

 protected override void OnLaunched(LaunchActivatedEventArgs args) { SubscribeToSearchEvents(); ... }
 protected override void OnSearchActivated(SearchActivatedEventArgs args) { SubscribeToSearchEvents(); }

3. Обработка запроса по мере ввода данных.

Если нам требуется реализовать еще более сложные сценарии подсказок, или если мы можем быстро обработать запрос и сразу показать результат поискового запроса до завершения ввода, мы можем подписаться на события изменения поискового запроса (QueryChanged).

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

SearchPane.GetForCurrentView().QueryChanged += SearchPage_QueryChanged;

Аналогично остальным событиям мы можем обработать поисковый запрос:

 void SearchPage_QueryChanged(SearchPane sender, SearchPaneQueryChangedEventArgs args) { SearchByQuery(args.QueryText); }

4. Исправляем типичные ошибки интеграции поиска:

Описанные здесь рекомендации относиться к версии Windows 8 RP и наверняка будут исправлены в релизе. Тем не менее сейчас есть несколько «симптом» присущих практически всем приложениям (включая встроенные системные приложения, такие как «Люди»).

4.1. Потеря возможности попасть на главную страницу.

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

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

 protected override void OnSearchActivated(SearchActivatedEventArgs args)         {             var frame = Window.Current.Content as Frame;             if(frame==null)             {                 frame=new Frame();                 Window.Current.Content = frame;

 

 //Переход на главную страницу                frame.Navigate(typeof(MainPage));             }                        frame.Navigate(typeof(SearchPage), args.QueryText);             Window.Current.Activate();         }

4.2. Многочисленные экземпляры страницы поиска

Если ввести несколько поисковых фраз подряд, то каждый раз создается еще один экземпляр страницы, и попытка попасть на главную страницу по кнопке «назад» приводит к тому что мы попадаем на предыдущую страницу поиска. Возможно это не баг а фича, в таком случае надо учитывать что событие поиска срабатывает в каждом созданном экземпляре и обработка запросов от нескольких экземпляров может привести к серьезным проблемам с производительностью.
Лично мое мнение это баг, так как довольно часто меня раздражала небходимость по несколько раз нажимать кнопку «назад» что бы снова вернуться на главную страницу.

Одно из решений довольно простое. При активации приложения по поиску проверять, является ли текущая страница страницей поиска и возвращаться назад в таком случае:

 protected override void OnSearchActivated(SearchActivatedEventArgs args)         {            RemoveSearchPage();             var frame = Window.Current.Content as Frame;             if(frame==null)             {                 frame=new Frame();                 Window.Current.Content = frame;                 frame.Navigate(typeof(MainPage));             }                          frame.Navigate(typeof(SearchPage), args.QueryText);             Window.Current.Activate();         }

Соответственно реализация метода RemoveSearchPage:

 private void RemoveSearchPage() { var frame = Window.Current.Content as Frame; if (frame== null) { return; } var page=frame.Content as Page; if (page == null) { return; } if (page.GetType()==typeof(SearchPage)) { frame.GoBack(); } }

Исходный код (288,51 kb)

Комментарии: Если в формате видео, а не статей, то можно посмотреть обзорные доклады на Windows 8 Camp и более углублённые найти в докладах DevCon’12.

* * *

Источник: Контракты и расширения Windows 8

Если вы интересовались разработкой приложений в metro-стиле под Windows 8, вы, наверное, уже знаете, что жизненный цикл этих приложений ближе к жизненному циклу приложений на Windows Phone. Это означает, что приложение, фактически не исполняется, когда пользователь его не видит. Таким образом, возникает вопрос, как приложения могут взаимодействовать друг с другом и системой.

В Windows 8 для приложений в metro-стиле для взаимодействия приложений друг с другом используются контракты, а для взаимодействия с системой – расширения.

Разнообразных контрактов и расширений достаточно много. Написать пост про то, какие контракты и расширения доступны разработчику, меня натолкнула статья Windows 8. Контракт «поиск» в деталях, после которой я решил систематизировать свои знания и собрать в одном месте краткие, буквально в несколько строчек, «how to» по большинству контрактов и расширений, с примерами из Windows SDK Samples.

Итак, приступим. Начнём с контрактов.

Контракты:

  • App to App Picking– возможность одному приложению напрямую выбрать файлы, которые предоставляет другое приложение;Как реализовать File Open Picker Contract:
    1) добавить в проект элемент File Open Picket Contract (Add Item);
    2) обрабатывать FileOpenPickerActivated;
    3) использовать FileOpenPickerUI.Как реализовать File Save Picker Contract:
    1) определить в манифесте;
    2) обрабатывать FileSavePickerActivated;
    3) использовать FileSavePickerUI.Пример приложения в которое реализует File Open и File Save Picker контракты
  • Cached File Updater– возможность управлять кэширование удалённого контента локальным приложением, а также обновлением локально изменённого закэшированого контента на удалённый сервер;Как реализовать поддержку кеширование с обновлением:
    1) определить в манифесте;
    2) зарегистрироваться на событие FileUpdateRequested;
    3) обрабатывать запросы на обновление файлов;
    4) требует поддержки со стороны удалённого сервера.
  • Play To– реализация проигрывания контента вашего приложение на присоединённом DLNA-совместимом устройстве;Пример приложения, реализующего контракт Play To
  • Search– возможность интегрироваться со стандартным интерфейсом поиска;Как реализовать контракт поиска:
    1) добавить элемент Search Contract в проект (Add Item);
    2) реализовать страницу результатов поиска.Пример приложения, реализующего контракт поиска
    Windows 8. Контракт «поиск» в деталях
  • Settings– возможность предоставить доступ пользователю к контекстно-зависимые настройкам в стандартном системном метро-представлении;Как реализовать контракт Settings:
    1) определить в манифесте;
    2) подписаться на событие CommandRequested объекта SettingsPaneView;
    3) зарегистрировать свои команды;
    3) реализовать обработчик(и) команд.Пример приложения, с использованием интеграции настроек
  • Share – простой способ предоставить или получить контент вашего приложения другому приложению или сервису.
    Можно отдавать/получать: текст, URI, Bitmap, HTML, RTF и StorageItemsКак сделать Share Target:
    1) добавить элемент «Share Target Contract» в проект (Add Item);
    2) добавить декларацию в манифест;
    3) реализовать UI полученияПриложение, пример реализации целевого приложения для ShareКак сделать Share Source:
    1) зарегистрировать себя, вызвав DataTransferManager;
    2) вызвать ShowShareUI;
    3) подготовить данные к передаче.

    Приложение, пример реализации источников данных для Share.

Перейдём к расширениям.

Расширения:

Если хотите попробовать реализовать какой-нибудь контракт или расширение прямо сейчас, то чтобы начать разрабатывать приложения под Windows 8 нужно на Windows 8 установить бесплатные средства разработки.

 

Комментарии запрещены.