Перенос проектов Windows Phone Silverlight в проекты UWP
В предыдущем разделе описаны сопоставления пространства имен и классов.
Процесс переноса начинается путем создания проекта Windows 10 в Visual Studio и копирования файлов в него.
Создание проекта и копирование файлов в него
- Запустите Microsoft Visual Studio 2015 и создайте проект пустого приложения (универсального приложения Windows). Дополнительные сведения см. в руководстве по переходу к приложению среда выполнения Windows 8.x с помощью шаблонов (C#, C++, Visual Basic). Новый проект создает пакет приложения (appx-файл), который будет выполняться во всех семействах устройств.
- В проекте приложения Windows Phone Silverlight определите все файлы исходного кода и файлы визуальных активов, которые требуется повторно использовать. Использование проводник, копирование моделей данных, моделей представления, визуальных ресурсов, словарей ресурсов, структуры папок и других элементов, которые вы хотите повторно использовать, в новый проект. При необходимости скопируйте или создайте вложенные папки на диске.
- Скопируйте представления (например, MainPage.xaml и MainPage.xaml.cs) в новый узел проекта. При необходимости создайте новые вложенные папки и удалите существующие представления из проекта. Но перед перезаписью или удалением представления, созданного Visual Studio, сохраните копию, так как она может оказаться полезной для ссылки на нее позже. Первый этап переноса приложения Windows Phone Silverlight фокусируется на том, чтобы он выглядел хорошо и хорошо работает на одном семействе устройств. Позже вы повернете внимание, чтобы убедиться, что представления хорошо адаптируются ко всем форм-факторам, а также к добавлению адаптивного кода, чтобы получить больше всего из определенного семейства устройств.
- В Обозреватель решений убедитесь, что включен переключатель "Показать все файлы". Выберите скопированные файлы, щелкните их правой кнопкой мыши и нажмите кнопку "Включить в проект". Это будет автоматически включать их содержащиеся папки. После этого можно включить переключатель "Показать все файлы ", если вы хотите. Альтернативный рабочий процесс, если вы предпочитаете, — использовать команду "Добавить существующий элемент", создав все необходимые вложенные папки в Обозреватель решений Visual Studio. Дважды убедитесь, что визуальные ресурсы имеют действие сборки для содержимого и копирования в выходной каталог, для которых задано значение "Не копировать".
- Различия в пространстве имен и именах классов будут создавать множество ошибок сборки на этом этапе. Например, если открыть созданные Visual Studio представления, вы увидите, что они имеют тип Page, а не PhoneApplicationPage. В этом руководстве по переносу подробно описано множество различий в разметке XAML и императивном коде. Но вы будете быстро выполнять следующие общие действия: измените "clr-namespace" на "using" в объявлениях префикса пространства имен в разметке XAML; Используйте раздел сопоставления пространства имен и классов и команду поиска и замены Visual Studio, чтобы внести массовые изменения в исходный код (например, замените "System.Windows" на "Windows.UI.Xaml"), а в редакторе императивного кода в Visual Studio используйте команды "Разрешить и упорядочить использование" в контекстном меню для более целевых изменений.
Пакеты SDK расширения
Большинство API-интерфейсов универсальная платформа Windows (UWP), которые будут вызывать перенесенное приложение, реализуются в наборе API, известном как универсальное семейство устройств. Но некоторые из них реализованы в пакетах SDK для расширений, и Visual Studio распознает только API, реализованные семейством целевых устройств вашего приложения или любыми пакетами SDK для расширений, на которые вы ссылаетесь.
Если вы получаете ошибки компиляции о пространствах имен или типах или членах, которые не удалось найти, это, скорее всего, будет причиной. Откройте раздел API в справочной документации по API и перейдите к разделу "Требования", чтобы узнать, что такое семейство устройств. Если это не ваше семейство целевых устройств, то чтобы сделать API доступным для проекта, вам потребуется ссылка на пакет SDK расширений для этого семейства устройств.
Щелкните Project>Add Reference Windows Universal>Extensions (Добавить эталонные> расширения Windows) и выберите соответствующий пакет SDK расширений. Например, если API,которые вы хотите вызвать, доступны только в семействе мобильных устройств, и они были представлены в версии 10.0.x.y, а затем выберите расширения Windows Mobile для UWP.
Это добавит следующую ссылку на файл проекта:
<ItemGroup>
<SDKReference Include="WindowsMobile, Version=10.0.x.y">
<Name>Windows Mobile Extensions for the UWP</Name>
</SDKReference>
</ItemGroup>
Имя и номер версии соответствуют папкам в установленном расположении пакета SDK. Например, приведенные выше сведения соответствуют этому имени папки:
\Program Files (x86)\Windows Kits\10\Extension SDKs\WindowsMobile\10.0.x.y
Если приложение не предназначено для семейства устройств, реализующих API, необходимо использовать класс ApiInformation для проверки наличия API перед его вызовом (это называется адаптивным кодом). Это условие будет оцениваться везде, где выполняется приложение, но оно будет оцениваться только на устройствах, где присутствует API и поэтому доступен для вызова. Используйте только пакеты SDK расширения и адаптивный код после первой проверки наличия универсального API. Ниже приведены некоторые примеры.
Кроме того, см . манифест пакета приложения.
Максимизация разметки и повторного использования кода
Вы найдете, что рефакторинг немного и (или) добавление адаптивного кода (как описано ниже), позволит максимально увеличить разметку и код, который работает во всех семействах устройств. Ниже приведены дополнительные сведения.
- Файлы, которые являются общими для всех семейств устройств, не требуют особого внимания. Эти файлы будут использоваться приложением во всех семействах устройств, на которых он работает. К ним относятся файлы разметки XAML, императивные файлы исходного кода и файлы ресурсов.
- Приложение может обнаружить семейство устройств, на котором оно работает, и перейти к представлению, разработанному специально для этого семейства устройств. Дополнительные сведения см. в статье "Обнаружение платформы, в котором работает приложение".
- Аналогичный метод, который может оказаться полезным, если нет альтернативы, предоставить файл разметки или файл ResourceDictionary (или папку, содержащую файл), специальное имя, которое автоматически загружается во время выполнения, только если приложение работает в определенном семействе устройств. Этот метод иллюстрируется в примере bookstore1 .
- Чтобы использовать функции, которые недоступны во всех семействах устройств (например, принтеры, сканеры или кнопка камеры), можно написать адаптивный код. См. третий пример в условной компиляции и адаптивном коде в этом разделе.
- Если вы хотите поддерживать Windows Phone Silverlight и Windows 10, вы можете предоставить общий доступ к файлам исходного кода между проектами. Вот как: в Visual Studio щелкните проект правой кнопкой мыши в Обозреватель решений, выберите "Добавить существующий элемент", выберите файлы для общего доступа и нажмите кнопку "Добавить как ссылку". Сохраните файлы исходного кода в общей папке в файловой системе, где проекты, которые ссылались на них, и не забудьте добавить их в систему управления версиями. Если вы можете факторировать императивный исходный код таким образом, чтобы большинство, если не все, файл будет работать на обеих платформах, то вам не нужно иметь две копии. Вы можете упаковать любую логику для конкретной платформы в файл в директивы условной компиляции, где это возможно, или условия времени выполнения при необходимости. Ознакомьтесь со следующим разделом ниже и директивами препроцессора C#.
- Для повторного использования на двоичном уровне, а не на уровне исходного кода, существуют переносимые библиотеки классов, поддерживающие подмножество API .NET, доступные в Windows Phone Silverlight, а также подмножество для приложений Windows 10 (.NET Core). Переносимые сборки библиотеки классов совместимы с этими платформами .NET и многое другое. Используйте Visual Studio для создания проекта, предназначенного для переносимой библиотеки классов. См . кроссплатформенную разработку с помощью переносимой библиотеки классов.
Условная компиляция и адаптивный код
Если вы хотите поддерживать Windows Phone Silverlight и Windows 10 в одном файле кода, это можно сделать. При просмотре проекта Windows 10 на страницах свойств проекта вы увидите, что проект определяет WINDOWS_UAP как символ условной компиляции. Как правило, для выполнения условной компиляции можно использовать следующую логику.
#if WINDOWS_UAP
// Code that you want to compile into the Windows 10/11 app.
#else
// Code that you want to compile into the Windows Phone Silverlight app.
#endif // WINDOWS_UAP
Если у вас есть код, который вы поделились между приложением Windows Phone Silverlight и приложением среда выполнения Windows 8.x, возможно, у вас уже есть исходный код с такой логикой:
#if NETFX_CORE
// Code that you want to compile into the Windows Runtime 8.x app.
#else
// Code that you want to compile into the Windows Phone Silverlight app.
#endif // NETFX_CORE
Если это так, и если теперь вы хотите поддерживать Windows 10, то это также можно сделать.
#if WINDOWS_UAP
// Code that you want to compile into the Windows 10/11 app.
#else
#if NETFX_CORE
// Code that you want to compile into the Windows Runtime 8.x app.
#else
// Code that you want to compile into the Windows Phone Silverlight app.
#endif // NETFX_CORE
#endif // WINDOWS_UAP
Возможно, вы использовали условную компиляцию, чтобы ограничить обработку аппаратной кнопки назад на Windows Phone. В Windows 10 событие кнопки "Назад" является универсальной концепцией. Кнопки назад, реализованные в оборудовании или программном обеспечении, будут вызывать событие BackRequested , поэтому это один для обработки.
Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested +=
this.ViewModelLocator_BackRequested;
...
private void ViewModelLocator_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
{
// Handle the event.
}
Возможно, вы использовали условную компиляцию, чтобы ограничить обработку кнопки аппаратной камеры на Windows Phone. В Windows 10 кнопка аппаратной камеры — это концепция, определенная для семейства мобильных устройств. Так как один пакет приложения будет работать на всех устройствах, мы изменим условие времени компиляции на условие времени выполнения с помощью адаптивного кода. Для этого мы используем класс ApiInformation для запроса во время выполнения для наличия класса HardwareButtons. HardwareButtons определен в пакете SDK для мобильных расширений, поэтому нам потребуется добавить ссылку на этот пакет SDK в наш проект для компиляции этого кода. Обратите внимание, что обработчик будет выполняться только на устройстве, которое реализует типы, определенные в пакете SDK для мобильных расширений, и это семейство мобильных устройств. Таким образом, приведенный ниже код тщательно использует только функции, которые присутствуют, хотя он достигает его по-другому от условной компиляции.
// Note: Cache the value instead of querying it more than once.
bool isHardwareButtonsAPIPresent = Windows.Foundation.Metadata.ApiInformation.IsTypePresent
("Windows.Phone.UI.Input.HardwareButtons");
if (isHardwareButtonsAPIPresent)
{
Windows.Phone.UI.Input.HardwareButtons.CameraPressed +=
this.HardwareButtons_CameraPressed;
}
...
private void HardwareButtons_CameraPressed(object sender, Windows.Phone.UI.Input.CameraEventArgs e)
{
// Handle the event.
}
Кроме того, ознакомьтесь с разделом "Обнаружение платформы, на котором запущено приложение".
Манифест пакета приложения
Параметры проекта (включая ссылки на пакеты SDK расширений) определяют область поверхности API, которую может вызвать ваше приложение. Но манифест пакета приложения — это то, что определяет фактический набор устройств, на которые клиенты могут установить приложение из Магазина. Дополнительные сведения см. в примерах в TargetDeviceFamily.
Стоит знать, как редактировать манифест пакета приложения, так как разделы, которые следуют за его использованием для различных объявлений, возможностей и других параметров, необходимых некоторым функциям. Для его редактирования можно использовать редактор манифеста пакета приложения Visual Studio. Если Обозреватель решений не отображается, выберите его в меню "Вид". Дважды щелкните Package.appxmanifest. Откроется окно редактора манифеста. Выберите соответствующую вкладку, чтобы внести изменения, а затем сохранить изменения. Возможно, необходимо убедиться, что элемент pm:PhoneIdentity в манифесте перенесенного приложения соответствует тому, что находится в манифесте приложения, которое вы переносите (полные сведения см . в разделе pm:PhoneIdentity ).
См. справочник по схеме манифеста пакета для Windows 10.
Следующий раздел — устранение неполадок.