- PVSM.RU - https://www.pvsm.ru -

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML)

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [1]

Это третья статья из цикла, посвященного обновлению Windows Phone 8.0 приложений до версии 8.1. На этот раз, мы поговорим про самый сложный сценарий – обновление приложения Windows Phone 8.0 (Silverlight) до Windows Phone 8.1 (XAML). Этот процесс не такой прозрачный и понятный как в случае с Silverlight [2] или Windows Store, где есть специальные действия в Visual Studio (Reterget), чтобы поменять сборки и ссылки на них. В нашем случае, придется пересобрать приложение в ручную для новой версии. Этим мы и займемся.

По результатам работы, мы не только обновим приложение до новой платформы 8.1, перейдем на использование WinRT [3] и сможем пользоваться её возможностями, но и получим проект универсального приложения для Phone и Windows с общим кодом.
План работы такой:

  • Создание нового проекта Windows Phone 8.1
  • Перенос кода
  • Перенос интерфейса
  • Создание проекта Windows Store

У меня есть простое приложение, разработанное под Windows Phone 8.0, которое мы будем обновлять до Windows Phone 8.1.

Приложение состоит из двух проектов: проект Windows Phone приложения и Portable Class Library со всякими нужными классами. Из сторонних библиотек это приложение использует только MVVMLight [4].

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [5]

Создание нового проекта Windows Phone 8.1

Чтобы приложение работало не только на Windows Phone 8.1, но и на предыдущих версиях Windows Phone, придется продолжить поддерживать проект Windows Phone 8.0 на ряду с новым проектом.

Самым оптимальным решением будет создать проект Windows Phone 8.1 рядом в этом же Solution и максимально переиспользовать код на оба проекта.

Второй вариант – в существующем проекте поправить ссылки на библиотеки автоматически, используя действие Retarget to Windows Phone 8.1. Но тогда вы получите Silverlight 8.1 приложение, а не XAML и лишитесь обратной совместимости.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [6]

По этому пути мы не пойдем и будем создавать рядом еще одно приложение для Windows Phone 8.1.
В Visual Studio нажимаем AddNew Project. В качестве шаблона проекта выбираем Blank App.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [7]

Перенос кода

Нам очень повезло, что проект использует MVVM, код надежно отделен от интерфейса и у нас есть Portable Class Library где уже лежат вспомогательные классы и объекты. Если у вас этого нет, то вынесете модели, контроллеры и логику в PCL. Получится что-то близкое к структуре на картинке ниже.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [8]

Подключаем готовый PCL к проекту для Windows Phone 8.1 и добавляем остальные используемые библиотеки.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [9]

Теперь надо аккуратно копировать файлы из проекта Windows Phone 8.0 и устранять все что будет ломаться. Это не так быстро, как кажется, но достаточно рутинно.
В скопированных файлах лучше поменять пространство имен, чтобы избежать конфликтов в Solution. Быстро это сделать можно используя возможность Find and Replace.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [10]

Если ваше приложение Windows Phone 8.0 поддерживало несколько языков, и вы использовали файлы ресурсов для локализации, то важно знать, что в 8.1 просто в папке Resources их оставлять уже нельзя. Необходимо будет создать новые файлы ресурсов и перенести туда данные.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [11]

Перенос интерфейса

Если попробовать скомпилировать и запустить приложение – нас постигнет неудача. Весь интерфейс в XAML файлах будет ругаться. В моём двухстраничном приложении 44 ошибки.
К счастью, они все типовые и касаются пространств имен, элементов управления или их свойств. Новый Windows Phone 8.1 использует WinRT и там может не оказаться элементов управления и свойств, которые вы использовали в Silverlight Toolkit.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [12]

Например:

  • Открывающий тэг для страницы не <phone:PhoneApplicationPage …>, a просто <Page …>.
  • Вместо <phone:PhoneApplicationPage.Resources> надо использовать <Page.Resources>.
  • Многие стандартные стили будут не найдены и вам необходимо будет воссоздавать их руками.
  • Некоторые свойства у элементов управления изменились или вообще больше не существуют.

В результате этого процесса, у меня получилось два практически одинаковых на вид приложения. Cлева Windows Phone 8.0, справа Windows Phone 8.1.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [13]

Создание проекта Windows Store

После того, как приложение Windows Phone 8.1 заработает, можно пойти дальше и расширить его до Windows Store приложения, чтобы опубликовать в магазин Windows.
Этот процесс не такой трудоемкий как предыдущий. Необходимо в контекстном меню проекта выбрать Add Windows 8.1

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [14]

Создастся два новых проекта: проект для Windows Store приложения и проект Shared для общего кода между Windows 8.1 и Phone 8.1 приложениями.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [15]

В Shared проект можно перенести большую часть кода, a часть xaml превратить в элементы управления (user controls) и повторно использовать.

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [16]

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

Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML) [17]

Заключение

Мы получили три приложения: Windows Phone 8.0, Windows Phone 8.1 и Windows Store 8.1.

Весь код и другие переиспользуемые файлы были вынесены из Windows Phone 8.1 и Windows Store проектов в Shared проект для общего кода или Portable Class Library.

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

Скачать готовый пример можно тут: Universal.zip [18]

Автор: MissUFO

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/windows-phone/65197

Ссылки в тексте:

[1] Image: http://habrastorage.org/getpro/habr/post_images/179/990/d16/179990d16ee626c318c5ced2068de9d5.png

[2] в случае с Silverlight: http://habrahabr.ru/company/microsoft/blog/230015/

[3] WinRT: http://msdn.microsoft.com/ru-ru/library/windows/apps/dn632424.aspx

[4] MVVMLight: https://www.nuget.org/packages/MvvmLight/

[5] Image: http://habrastorage.org/getpro/habr/post_images/b54/5b6/caa/b545b6caa4a84ac687b15b13c1e8a190.png

[6] Image: http://habrastorage.org/getpro/habr/post_images/8fe/1ef/82a/8fe1ef82a18ada7576feaea46e814c6b.png

[7] Image: http://habrastorage.org/getpro/habr/post_images/a27/571/add/a27571add87d378caa414102716a7222.png

[8] Image: http://habrastorage.org/getpro/habr/post_images/c86/859/ae2/c86859ae2bde8756476d0fb229c18062.png

[9] Image: http://habrastorage.org/getpro/habr/post_images/23d/700/f07/23d700f07572514e4acd91af399da331.png

[10] Image: http://habrastorage.org/getpro/habr/post_images/763/9dd/6ce/7639dd6ce83e0216372ed5e365eef0b8.png

[11] Image: http://habrastorage.org/getpro/habr/post_images/265/3c1/475/2653c14755531a5fe962f8d96bf6542a.png

[12] Image: http://habrastorage.org/getpro/habr/post_images/687/977/7ec/6879777ec151a6894a27b3d2daf155d3.png

[13] Image: http://habrastorage.org/getpro/habr/post_images/ab3/38b/242/ab338b242c63b5a0476b2b5b228ba20b.png

[14] Image: http://habrastorage.org/getpro/habr/post_images/b23/f3c/54a/b23f3c54ae21e2d13ad7f65619033b44.png

[15] Image: http://habrastorage.org/getpro/habr/post_images/295/993/35d/29599335dc9b6772cbd0044918adec4f.png

[16] Image: http://habrastorage.org/getpro/habr/post_images/cd6/32d/379/cd632d379ff742126e5e8bad41546743.png

[17] Image: http://habrastorage.org/getpro/habr/post_images/43c/bb6/b41/43cbb6b414e3e43ab1656cdefc0896ea.png

[18] Universal.zip: https://onedrive.live.com/download?resid=DA8C144CFF7C40EE%21160881

[19] Источник: http://habrahabr.ru/post/229931/