Это третья статья из цикла, посвященного обновлению Windows Phone 8.0 приложений до версии 8.1. На этот раз, мы поговорим про самый сложный сценарий – обновление приложения Windows Phone 8.0 (Silverlight) до Windows Phone 8.1 (XAML). Этот процесс не такой прозрачный и понятный как в случае с Silverlight или Windows Store, где есть специальные действия в Visual Studio (Reterget), чтобы поменять сборки и ссылки на них. В нашем случае, придется пересобрать приложение в ручную для новой версии. Этим мы и займемся.
По результатам работы, мы не только обновим приложение до новой платформы 8.1, перейдем на использование WinRT и сможем пользоваться её возможностями, но и получим проект универсального приложения для Phone и Windows с общим кодом.
План работы такой:
- Создание нового проекта Windows Phone 8.1
- Перенос кода
- Перенос интерфейса
- Создание проекта Windows Store
У меня есть простое приложение, разработанное под Windows Phone 8.0, которое мы будем обновлять до Windows Phone 8.1.
Приложение состоит из двух проектов: проект Windows Phone приложения и Portable Class Library со всякими нужными классами. Из сторонних библиотек это приложение использует только MVVMLight.
Создание нового проекта 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.1.
В Visual Studio нажимаем Add – New Project. В качестве шаблона проекта выбираем Blank App.
Перенос кода
Нам очень повезло, что проект использует MVVM, код надежно отделен от интерфейса и у нас есть Portable Class Library где уже лежат вспомогательные классы и объекты. Если у вас этого нет, то вынесете модели, контроллеры и логику в PCL. Получится что-то близкое к структуре на картинке ниже.
Подключаем готовый PCL к проекту для Windows Phone 8.1 и добавляем остальные используемые библиотеки.
Теперь надо аккуратно копировать файлы из проекта Windows Phone 8.0 и устранять все что будет ломаться. Это не так быстро, как кажется, но достаточно рутинно.
В скопированных файлах лучше поменять пространство имен, чтобы избежать конфликтов в Solution. Быстро это сделать можно используя возможность Find and Replace.
Если ваше приложение Windows Phone 8.0 поддерживало несколько языков, и вы использовали файлы ресурсов для локализации, то важно знать, что в 8.1 просто в папке Resources их оставлять уже нельзя. Необходимо будет создать новые файлы ресурсов и перенести туда данные.
Перенос интерфейса
Если попробовать скомпилировать и запустить приложение – нас постигнет неудача. Весь интерфейс в XAML файлах будет ругаться. В моём двухстраничном приложении 44 ошибки.
К счастью, они все типовые и касаются пространств имен, элементов управления или их свойств. Новый Windows Phone 8.1 использует WinRT и там может не оказаться элементов управления и свойств, которые вы использовали в Silverlight Toolkit.
Например:
- Открывающий тэг для страницы не <phone:PhoneApplicationPage …>, a просто <Page …>.
- Вместо <phone:PhoneApplicationPage.Resources> надо использовать <Page.Resources>.
- Многие стандартные стили будут не найдены и вам необходимо будет воссоздавать их руками.
- Некоторые свойства у элементов управления изменились или вообще больше не существуют.
В результате этого процесса, у меня получилось два практически одинаковых на вид приложения. Cлева Windows Phone 8.0, справа Windows Phone 8.1.
Создание проекта Windows Store
После того, как приложение Windows Phone 8.1 заработает, можно пойти дальше и расширить его до Windows Store приложения, чтобы опубликовать в магазин Windows.
Этот процесс не такой трудоемкий как предыдущий. Необходимо в контекстном меню проекта выбрать Add Windows 8.1
Создастся два новых проекта: проект для Windows Store приложения и проект Shared для общего кода между Windows 8.1 и Phone 8.1 приложениями.
В Shared проект можно перенести большую часть кода, a часть xaml превратить в элементы управления (user controls) и повторно использовать.
Если запустить Windows приложение, то оно будет так же очень похоже на Phone приложение и над более удобным дизайном придется еще поработать отдельно.
Заключение
Мы получили три приложения: 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