Настройка проектов Windows

Добавление новых проектов Windows в существующее Xamarin.Forms решение

Старые Xamarin.Forms решения (или созданные в macOS) не будут иметь проекты приложений универсальная платформа Windows (UWP). Поэтому необходимо вручную добавить проект UWP для создания приложения Windows 10 (UWP).

Добавление приложения универсальная платформа Windows

Visual Studio 2019 в Windows 10 рекомендуется создавать приложения UWP. Дополнительные сведения о универсальная платформа Windows см. в универсальная платформа Windows.

UWP доступна в Xamarin.Forms версии 2.1 и более поздних версиях, а Xamarin.Forms.Карты поддерживается в Xamarin.Forms версии 2.2 и более поздних версиях.

Ознакомьтесь с разделом по устранению неполадок, чтобы ознакомиться с полезными советами.

Следуйте этим инструкциям, чтобы добавить приложение UWP, которое будет работать на телефонах, планшетах и настольных компьютерах Windows 10:

1. Щелкните правой кнопкой мыши решение и выберите "Добавить > новый проект" и добавьте пустой проект приложения (универсального приложения Windows):

Add New Project Dialog

2. В диалоговом окне "Новый универсальная платформа Windows проект" выберите минимальные и целевые версии Windows 10, в которые будет работать приложение:

New Universal Windows Platform Project Dialog

3. Щелкните правой кнопкой мыши проект UWP и выберите "Управление пакетами NuGet..." и добавьте Xamarin.Forms этот пакет. Убедитесь, что другие проекты в решении также обновляются до той же версии Xamarin.Forms пакета.

4. Убедитесь, что новый проект UWP будет построен в окне Build > Configuration Manager (это, вероятно, не произошло по умолчанию). Установите флажки "Сборка и развертывание" для универсального проекта:

Configuration Manager Window

5. Щелкните проект правой кнопкой мыши и выберите "Добавить > ссылку " и создайте ссылку на Xamarin.Forms проект приложения (.NET Standard или общий проект).

Reference Manager Dialog

6. В проекте UWP измените App.xaml.cs , чтобы включить Init вызов метода в OnLaunched метод около строки 52:

// under this line
rootFrame.NavigationFailed += OnNavigationFailed;
// add this line
Xamarin.Forms.Forms.Init (e); // requires the `e` parameter

7. В проекте UWP измените MainPage.xaml , удалив Grid содержащийся в элементе Page .

8. В MainPage.xaml добавьте новую xmlns запись для Xamarin.Forms.Platform.UWP:

xmlns:forms="using:Xamarin.Forms.Platform.UWP"

9. В MainPage.xaml измените корневой <Page элемент <forms:WindowsPageна:

<forms:WindowsPage
...
   xmlns:forms="using:Xamarin.Forms.Platform.UWP"
...
</forms:WindowsPage>

10. В проекте UWP измените MainPage.xaml.cs , чтобы удалить : Page описатель наследования для имени класса (так как теперь он наследуется из-за WindowsPage изменений, внесенных на предыдущем шаге):

public sealed partial class MainPage  // REMOVE ": Page"

11. В MainPage.xaml.cs добавьте LoadApplication вызов в MainPage конструктор, чтобы запустить Xamarin.Forms приложение:

// below this existing line
this.InitializeComponent();
// add this line
LoadApplication(new YOUR_NAMESPACE.App());

Примечание.

Аргументом LoadApplication метода является экземпляр, определенный Xamarin.Forms.Application в проекте .NET standard.

12. Добавьте все локальные ресурсы (например, файлы изображений) из существующих проектов платформы, необходимых.

Устранение неполадок

"Исключение целевого вызова" при использовании "Компиляция с цепочкой инструментов .NET Native"

Если приложение UWP ссылается на несколько сборок (например, сторонние библиотеки управления или само приложение разделено на несколько библиотек), Xamarin.Forms может не удается загрузить объекты из этих сборок (например, пользовательские отрисовщики).

Это может произойти при использовании цепочки инструментов Компиляции с .NET Native, которая является вариантом для приложений UWP в окне ">Общие свойства" > проекта.

Это можно исправить с помощью перегрузки Forms.Init вызова для UWP в App.xaml.cs , как показано в приведенном ниже коде (следует заменить ClassInOtherAssembly фактическим классом ссылки на код):

// You'll need to add `using System.Reflection;`
List<Assembly> assembliesToInclude = new List<Assembly>();

// Now, add in all the assemblies your app uses
assembliesToInclude.Add(typeof (ClassInOtherAssembly).GetTypeInfo().Assembly);

// Also do this for all your other 3rd party libraries
Xamarin.Forms.Forms.Init(e, assembliesToInclude);
// replaces Xamarin.Forms.Forms.Init(e);

Добавьте запись для каждой сборки, которую вы добавили в качестве ссылки в Обозреватель решений, через прямую ссылку или NuGet.

Службы зависимостей и собственная компиляция .NET

Сборки выпуска с помощью компиляции .NET Native могут не разрешать службы зависимостей, определенные вне основного исполняемого файла приложения (например, в отдельном проекте или библиотеке).

DependencyService.Register<T>() Используйте метод, чтобы вручную зарегистрировать классы служб зависимостей. В соответствии с приведенным выше примером добавьте метод регистрации следующим образом:

Xamarin.Forms.Forms.Init(e, assembliesToInclude);
Xamarin.Forms.DependencyService.Register<ClassInOtherAssembly>(); // add this