Поделиться через


Обновление Xamarin.Forms приложения вручную до многопроектного приложения .NET MAUI

Xamarin.Forms Обновление мультипроектного приложения до мультипроектного многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) выполняет те же действия, что и проект Xamarin.Android и Xamarin.iOS, а также дополнительные шаги, чтобы воспользоваться преимуществами изменений в .NET MAUI.

В этой статье описывается, как вручную перенести Xamarin.Forms проект библиотеки в проект библиотеки .NET MAUI. Перед этим необходимо обновить Xamarin.Forms проекты платформы, чтобы быть проектами в стиле SDK. Проекты в стиле ПАКЕТА SDK являются одинаковым форматом проекта, используемым всеми рабочими нагрузками .NET, и по сравнению с многими проектами Xamarin гораздо менее подробными. Сведения об обновлении проектов приложений см. в статье Об обновлении проектов Xamarin.Android, Xamarin.iOS и Xamarin.Mac до .NET, миграции проектов Xamarin.Android, миграции проектов Xamarin Apple иXamarin.Forms миграции проектов UWP.

Чтобы перенести проект библиотеки в Xamarin.Forms проект библиотеки .NET MAUI, необходимо:

  • Обновите Xamarin.Forms приложение, чтобы использовать Xamarin.Forms 5.
  • Обновите зависимости приложения до последних версий.
  • Убедитесь, что приложение по-прежнему работает.
  • Обновите файл проекта, чтобы он был стилем пакета SDK.
  • Обновление пространств имен.
  • Адресируйте все изменения API.
  • Настройте .NET MAUI.
  • Обновите или замените несовместимые зависимости версиями .NET 8.
  • Скомпилируйте и протестируйте приложение.

Чтобы упростить процесс обновления, необходимо создать проект библиотеки .NET MAUI с тем же именем, что Xamarin.Forms и проект библиотеки, а затем скопировать код, конфигурацию и ресурсы. Это подход, описанный ниже.

Xamarin.Forms Обновление приложения

Перед обновлением Xamarin.Forms приложения до .NET MAUI необходимо сначала обновить Xamarin.Forms приложение, чтобы использовать Xamarin.Forms 5, и убедиться, что он по-прежнему работает правильно. Кроме того, следует обновить зависимости, которые приложение использует до последних версий.

Это поможет упростить остальную часть процесса миграции, так как это позволит свести к минимуму различия API между Xamarin.Forms .NET MAUI и гарантировать, что вы используете совместимые с .NET версии зависимостей, если они существуют.

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

В Visual Studio создайте проект библиотеки классов MAUI .NET с тем же именем, что Xamarin.Forms и проект библиотеки. Этот проект будет размещать код из Xamarin.Forms проекта библиотеки. Открытие файла проекта подтвердит наличие проекта в стиле пакета SDK для .NET:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
        <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
        <!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
        <!-- <TargetFrameworks>$(TargetFrameworks);net8.0-tizen</TargetFrameworks> -->
        <UseMaui>true</UseMaui>
        <SingleProject>true</SingleProject>
        <ImplicitUsings>enable</ImplicitUsings>

        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
        <TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
    </PropertyGroup>

</Project>

В проектах платформы добавьте ссылку на этот новый проект библиотеки. Затем скопируйте Xamarin.Forms файлы библиотеки в проект библиотеки .NET MAUI.

Изменения пространства имен

Пространства имен изменились в переходе с Xamarin.Forms .NET MAUI, а Xamarin.Essentials функции теперь являются частью .NET MAUI. Чтобы обновить пространство имен, выполните поиск и замену для следующих пространств имен:

Пространство имен Xamarin.Forms Пространства имен .NET MAUI
Xamarin.Forms Microsoft.Maui и Microsoft.Maui.Controls
Xamarin.Forms.DualScreen Microsoft.Maui.Controls.Foldable
Xamarin.Forms.Maps Microsoft.Maui.Controls.Maps и Microsoft.Maui.Maps
Xamarin.Forms.PlatformConfiguration Microsoft.Maui.Controls.PlatformConfiguration
Xamarin.Forms.PlatformConfiguration.AndroidSpecific Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific
Xamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat
Xamarin.Forms.PlatformConfiguration.TizenSpecific Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific
Xamarin.Forms.PlatformConfiguration.WindowsSpecific Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific
Xamarin.Forms.PlatformConfiguration.iOSSpecific Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific
Xamarin.Forms.Shapes Microsoft.Maui.Controls.Shapes
Xamarin.Forms.StyleSheets Microsoft.Maui.Controls.StyleSheets
Xamarin.Forms.Xaml Microsoft.Maui.Controls.Xaml

Проекты .NET MAUI используют неявные global using директивы. Эта функция позволяет удалять using директивы для Xamarin.Essentials пространства имен, не заменяя их эквивалентными пространствами имен .NET MAUI.

Кроме того, пространство имен XAML по умолчанию изменилось на http://xamarin.com/schemas/2014/forms Xamarin.Forms http://schemas.microsoft.com/dotnet/2021/maui .NET MAUI. Поэтому следует заменить все вхождения xmlns="http://xamarin.com/schemas/2014/forms" xmlns="http://schemas.microsoft.com/dotnet/2021/maui"на .

Примечание.

Вы можете быстро обновить Xamarin.Forms пространства имен с помощью быстрых Microsoft.Maui действий в Visual Studio, если установлен помощник по обновлению.

Изменения API

Некоторые API изменились в переходе с Xamarin.Forms .NET MAUI. Это несколько причин, включая удаление повторяющихся функций, вызванных Xamarin.Essentials тем, как стать частью .NET MAUI, и обеспечить соблюдение API-интерфейсов в соответствии с рекомендациями по именоваванию .NET. В следующих разделах рассматриваются эти изменения.

Изменения цвета

Xamarin.Forms.Color В Xamarin.Formsструктуре можно создавать Color объекты с помощью double значений и предоставляет именованные цвета, напримерXamarin.Forms.Color.AliceBlue. В .NET MAUI эта функция разделена на Microsoft.Maui.Graphics.Color класс и Microsoft.Maui.Graphics.Colors класс.

Класс Microsoft.Maui.Graphics.Color в Microsoft.Maui.Graphics пространстве имен позволяет создавать Color объекты с помощью float значений, byte значений и int значений. Класс Microsoft.Maui.Graphics.Colors , который также находится в пространстве имен, в значительной Microsoft.Maui.Graphics степени предоставляет те же именованные цвета. Например, используйте для Colors.AliceBlue указания AliceBlue цвета.

В следующей таблице показаны изменения API между структурой Xamarin.Forms.Color и классом Microsoft.Maui.Graphics.Color :

API Xamarin.Forms API .NET MAUI Комментарий
Xamarin.Forms.Color.R Microsoft.Maui.Graphics.Color.Red
Xamarin.Forms.Color.G Microsoft.Maui.Graphics.Color.Green
Xamarin.Forms.Color.B Microsoft.Maui.Graphics.Color.Blue
Xamarin.Forms.Color.A Microsoft.Maui.Graphics.Color.Alpha
Xamarin.Forms.Color.Hue Microsoft.Maui.Graphics.Color.GetHue Xamarin.Forms свойство заменено методом в .NET MAUI.
Xamarin.Forms.Color.Saturation Microsoft.Maui.Graphics.Color.GetSaturation Xamarin.Forms свойство заменено методом в .NET MAUI.
Xamarin.Forms.Color.Luminosity Microsoft.Maui.Graphics.Color.GetLuminosity Xamarin.Forms свойство заменено методом в .NET MAUI.
Xamarin.Forms.Color.Default Нет эквивалента .NET MAUI. Вместо этого Microsoft.Maui.Graphics.Color объекты по умолчанию null.
Xamarin.Forms.Color.Accent Нет эквивалента .NET MAUI.
Xamarin.Forms.Color.FromHex Microsoft.Maui.Graphics.Color.FromArgb Microsoft.Maui.Graphics.Color.FromHex устарел и будет удален в будущем выпуске.

Кроме того, все числовые значения в объекте Microsoft.Maui.Graphics.Color , floatа не double используемые в Xamarin.Forms.Color.

Примечание.

В отличие от Xamarin.Formsнеявного Microsoft.Maui.Graphics.Color преобразования System.Drawing.Color.

Изменения макета

В следующей таблице перечислены API макета, которые были удалены в переходе с Xamarin.Forms .NET MAUI:

API Xamarin.Forms API .NET MAUI Комментарии
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add Перегрузка Add , принимающая 3 аргумента, отсутствует в .NET MAUI.
Xamarin.Forms.Grid.IGridList<T>.AddHorizontal Нет эквивалента .NET MAUI.
Xamarin.Forms.Grid.IGridList<T>.AddVertical Нет эквивалента .NET MAUI.
Xamarin.Forms.RelativeLayout Microsoft.Maui.Controls.Compatibility.RelativeLayout В .NET MAUI RelativeLayout существует только в качестве элемента управления совместимости для пользователей, которые переносятся.Xamarin.Forms Используйте Grid вместо этого или добавьте xmlns для пространства имен совместимости.

Кроме того, добавление дочерних элементов в макет в код Xamarin.Forms выполняется путем добавления дочерних элементов в коллекцию макета Children :

Grid grid = new Grid();
grid.Children.Add(new Label { Text = "Hello world" });

В .NET MAUI коллекция используется для внутреннего использования .NET MAUI Children и не должна управляться напрямую. Таким образом, в дочерних элементах кода следует добавлять непосредственно в макет:

Grid grid = new Grid();
grid.Add(new Label { Text = "Hello world" });

Внимание

Все Add методы расширения макета, например GridExtensions.Add, вызываются в макете, а не в коллекции макетов Children .

Вы можете заметить, что при запуске обновленного приложения .NET MAUI поведение макета отличается. Дополнительные сведения см. в разделе "Изменение поведения макета".Xamarin.Forms

Изменения пользовательского макета

Процесс создания пользовательского макета Xamarin.Forms включает создание класса, наследуемого от Layout<View>и переопределяющего VisualElement.OnMeasure Layout.LayoutChildren методы. Дополнительные сведения см. в статье "Создание пользовательского макета в Xamarin.Forms".

В .NET MAUI классы макета являются производными от абстрактного Layout класса. Этот класс делегирует кроссплатформенный макет и измерение классу диспетчера макетов. Каждый класс диспетчера макетов реализует ILayoutManager интерфейс, который указывает, что Measure и ArrangeChildren реализации должны быть предоставлены:

  • Реализация Measure вызывает IView.Measure каждое представление в макете и возвращает общий размер макета с учетом ограничений.
  • Реализация ArrangeChildren определяет, где каждое представление должно размещаться в границах макета, и вызывается Arrange для каждого представления с соответствующими границами. Возвращаемое значение — это фактический размер макета.

Дополнительные сведения см. в разделе "Пользовательские макеты".

Изменения устройства

Xamarin.FormsXamarin.Forms.Device имеет класс, который помогает взаимодействовать с устройством и платформой, в котором работает приложение. Эквивалентный класс в .NET MAUI, Microsoft.Maui.Controls.Deviceне рекомендуется, а его функциональные возможности заменяются несколькими типами.

В следующей таблице показаны замены MAUI .NET для функциональных возможностей Xamarin.Forms.Device класса:

API Xamarin.Forms API .NET MAUI Комментарии
Xamarin.Forms.Device.Android Microsoft.Maui.Devices.DevicePlatform.Android
Xamarin.Forms.Device.iOS Microsoft.Maui.Devices.DevicePlatform.iOS
Xamarin.Forms.Device.GTK Нет эквивалента .NET MAUI.
Xamarin.Forms.Device.macOS Нет эквивалента .NET MAUI. Используйте Microsoft.Maui.Devices.DevicePlatform.MacCatalyst.
Xamarin.Forms.Device.Tizen Microsoft.Maui.Devices.DevicePlatform.Tizen
Xamarin.Forms.Device.UWP Microsoft.Maui.Devices.DevicePlatform.WinUI
Xamarin.Forms.Device.WPF Нет эквивалента .NET MAUI.
Xamarin.Forms.Device.Flags Нет эквивалента .NET MAUI.
Xamarin.Forms.Device.FlowDirection Microsoft.Maui.ApplicationModel.AppInfo.RequestedLayoutDirection
Xamarin.Forms.Device.Idiom Microsoft.Maui.Devices.DeviceInfo.Idiom
Xamarin.Forms.Device.IsInvokeRequired Microsoft.Maui.Dispatching.Dispatcher.IsDispatchRequired
Xamarin.Forms.Device.OS Microsoft.Maui.Devices.DeviceInfo.Platform
Xamarin.Forms.Device.RuntimePlatform Microsoft.Maui.Devices.DeviceInfo.Platform
Xamarin.Forms.Device.BeginInvokeOnMainThread Microsoft.Maui.ApplicationModel.MainThread.BeginInvokeOnMainThread
Xamarin.Forms.Device.GetMainThreadSynchronizationContextAsync Microsoft.Maui.ApplicationModel.MainThread.GetMainThreadSynchronizationContextAsync
Xamarin.Forms.Device.GetNamedColor Нет эквивалента .NET MAUI.
Xamarin.Forms.Device.GetNamedSize Нет эквивалента .NET MAUI.
Xamarin.Forms.Device.Invalidate Microsoft.Maui.Controls.VisualElement.InvalidateMeasure
Xamarin.Forms.Device.InvokeOnMainThreadAsync Microsoft.Maui.ApplicationModel.MainThread.InvokeOnMainThreadAsync
Xamarin.Forms.Device.OnPlatform Microsoft.Maui.Devices.DeviceInfo.Platform
Xamarin.Forms.Device.OpenUri Microsoft.Maui.ApplicationModel.Launcher.OpenAsync
Xamarin.Forms.Device.SetFlags Нет эквивалента .NET MAUI.
Xamarin.Forms.Device.SetFlowDirection Microsoft.Maui.Controls.Window.FlowDirection
Xamarin.Forms.Device.StartTimer Microsoft.Maui.Dispatching.DispatcherExtensions.StartTimer или Microsoft.Maui.Dispatching.Dispatcher.DispatchDelayed

Изменения карты

В Xamarin.Formsэтом Map элементе управления и связанные типы находятся в Xamarin.Forms.Maps пространстве имен. В .NET MAUI эта функция перемещена в Microsoft.Maui.Controls.Maps пространства имен и Microsoft.Maui.Maps пространства имен. Некоторые свойства были переименованы, а некоторые типы были заменены эквивалентными типами.Xamarin.Essentials

В следующей таблице показаны замены MAUI .NET для функциональных возможностей Xamarin.Forms.Maps в пространстве имен:

API Xamarin.Forms API .NET MAUI Комментарий
Xamarin.Forms.Maps.Map.HasScrollEnabled Microsoft.Maui.Controls.Maps.Map.IsScrollEnabled
Xamarin.Forms.Maps.Map.HasZoomEnabled Microsoft.Maui.Controls.Maps.Map.IsZoomEnabled
Xamarin.Forms.Maps.Map.TrafficEnabled Microsoft.Maui.Controls.Maps.Map.IsTrafficEnabled
Xamarin.Forms.Maps.Map.MoveToLastRegionOnLayoutChange Нет эквивалента .NET MAUI.
Xamarin.Forms.Maps.Pin.Id Microsoft.Maui.Controls.Maps.Pin.MarkerId
Xamarin.Forms.Maps.Pin.Position Microsoft.Maui.Controls.Maps.Pin.Location
Xamarin.Forms.Maps.MapClickedEventArgs.Position Microsoft.Maui.Controls.Maps.MapClickedEventArgs.Location
Xamarin.Forms.Maps.Position Microsoft.Maui.Devices.Sensors.Location Члены типа Xamarin.Forms.Maps.Position изменились на Microsoft.Maui.Devices.Sensors.Location тип.
Xamarin.Forms.Maps.Geocoder Microsoft.Maui.Devices.Sensors.Geocoding Члены типа Xamarin.Forms.Maps.Geocoder изменились на Microsoft.Maui.Devices.Sensors.Geocoding тип.

.NET MAUI имеет два Map типа — Microsoft.Maui.Controls.Maps.Map и Microsoft.Maui.ApplicationModel.Map. Microsoft.Maui.ApplicationModel Так как пространство имен является одной из директив MAUI global using .NET, при использовании Microsoft.Maui.Controls.Maps.Map элемента управления из кода вам придется полностью квалифицировать Map использование или использовать псевдоним.

В XAML xmlns необходимо добавить определение пространства имен для Map элемента управления. Хотя это не обязательно, он предотвращает столкновение между Polygon типами и типами, которые существуют как в пространствах имен, так и Polyline Microsoft.Maui.Controls.Shapes в Microsoft.Maui.Controls.Maps пространствах имен. Дополнительные сведения см. в разделе "Отображение карты".

Другие изменения

Небольшое количество других API были консолидированы в переходе от Xamarin.Forms .NET MAUI. В следующей таблице показаны следующие изменения:

API Xamarin.Forms API .NET MAUI Комментарии
Xamarin.Forms.Application.Properties Microsoft.Maui.Storage.Preferences
Xamarin.Forms.Button.Image Microsoft.Maui.Controls.Button.ImageSource
Xamarin.Forms.Frame.OutlineColor Microsoft.Maui.Controls.Frame.BorderColor
Xamarin.Forms.IQueryAttributable.ApplyQueryAttributes Microsoft.Maui.Controls.IQueryAttributable.ApplyQueryAttributes В Xamarin.Formsметоде ApplyQueryAttributes IDictionary<string, string> принимается аргумент. В .NET MAUI ApplyQueryAttributes метод принимает IDictionary<string, object> аргумент.
Xamarin.Forms.MenuItem.Icon Microsoft.Maui.Controls.MenuItem.IconImageSource Xamarin.Forms.MenuItem.Icon — базовый класс для Xamarin.Forms.ToolbarItem, и поэтому ToolbarItem.Icon становится ToolbarItem.IconImageSource.
Xamarin.Forms.OrientationStateTrigger.Orientation Microsoft.Maui.Controls.OrientationStateTrigger.Orientation В Xamarin.Forms, OrientationStateTrigger.Orientation свойство имеет тип Xamarin.Forms.Internals.DeviceOrientation. В .NET MAUI OrientationStateTrigger.Orientation свойство имеет тип DisplayOrientation.
Xamarin.Forms.OSAppTheme Microsoft.Maui.ApplicationModel.AppTheme
Xamarin.Forms.Span.ForegroundColor Microsoft.Maui.Controls.Span.TextColor
Xamarin.Forms.ToolbarItem.Name Microsoft.Maui.Controls.MenuItem.Text Microsoft.Maui.Controls.MenuItem.Text — базовый класс для Microsoft.Maui.Controls.ToolbarItem, и поэтому ToolbarItem.Name становится ToolbarItem.Text.

Кроме того, переопределение вызывается на Android, Xamarin.FormsPage.OnAppearing когда приложение фонируется, а затем добавляется на передний план. Однако эта переопределение не вызывается в iOS и Windows в том же сценарии. В .NET MAUI OnAppearing() переопределение не вызывается на каких-либо платформах, когда приложение фонируется, а затем добавляется на передний план. Вместо этого следует слушать события Window жизненного цикла, чтобы получать уведомления, когда приложение возвращается на передний план. Дополнительные сведения см. в окнах MAUI .NET.

Изменения в собственных формах

Собственные формы стали собственным внедрением в Xamarin.Forms .NET MAUI и использует другой подход инициализации и различные методы расширения для преобразования кроссплатформенных элементов управления в собственные типы. Дополнительные сведения см. в разделе "Внедрение машинного кода".

Начальная загрузка перенесенного приложения

При ручном обновлении Xamarin.Forms приложения до .NET MAUI необходимо включить поддержку .NET MAUI в каждом проекте платформы, обновить класс точки входа каждого проекта платформы и настроить начальную загрузку приложения .NET MAUI.

Включение .NET MAUI в проектах платформы

Перед обновлением класса точки входа каждого проекта платформы необходимо сначала включить поддержку .NET MAUI. Это можно сделать, задав для свойства true сборки $(UseMaui) значение в каждом проекте платформы:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    ...
    <UseMaui>true</UseMaui>
  </PropertyGroup>
</Project>

Внимание

Чтобы включить поддержку .NET MAUI, необходимо добавить <UseMaui>true</UseMaui> в файл проекта файл проекта. Кроме того, убедитесь, что вы добавили <EnableDefaultMauiItems>false</EnableDefaultMauiItems> в файл проекта WinUI. Это приведет к остановке получения ошибок сборки о том, что InitializeComponent метод уже определен.

Добавление ссылок на пакеты

В .NET 8 MAUI поставляется в виде рабочей нагрузки .NET и нескольких пакетов NuGet. Преимущество этого подхода заключается в том, что он позволяет легко закреплять проекты в определенных версиях, а также позволяет легко просматривать нераспроданные или экспериментальные сборки.

В каждый файл проекта необходимо добавить следующие явные ссылки <ItemGroup> на пакет:

<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />

Эта $(MauiVersion) переменная ссылается на установленную версию .NET MAUI. Это можно переопределить, добавив свойство сборки $(MauiVersion) в каждый файл проекта:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <UseMaui>True</UseMaui>
        <MauiVersion>8.0.3</MauiVersion>
    </PropertyGroup>
</Project>

Конфигурация проекта Android

В проекте .NET MAUI Android обновите MainApplication класс, чтобы он соответствовал приведенному ниже коду:

using System;
using Android.App;
using Android.Runtime;
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using YOUR_MAUI_CLASS_LIB_HERE;

namespace YOUR_NAMESPACE_HERE.Droid
{
    [Application]
    public class MainApplication : MauiApplication
    {
        public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership)
        {
        }

        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}

Также обновите класс, MainActivity чтобы наследовать от MauiAppCompatActivity:

using System;
using Microsoft.Maui;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;

namespace YOUR_NAMESPACE_HERE.Droid
{
    [Activity(Label = "MyTitle", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
    public class MainActivity : MauiAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
        }
    }
}

Затем обновите файл манифеста, чтобы указать, что minSdKVersion значение равно 21, которое является минимальной версией пакета SDK для Android, необходимой для .NET MAUI. Это можно сделать, изменив <uses-sdk /> узел, который является дочерним элементом <manifest> узла:

<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="32" />

Конфигурация проекта iOS

В проекте .NET MAUI iOS обновите AppDelegate класс, чтобы наследовать от MauiUIApplicationDelegate:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Maui;
using Foundation;
using UIKit;
using YOUR_MAUI_CLASS_LIB_HERE;

namespace YOUR_NAMESPACE_HERE.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : MauiUIApplicationDelegate
    {
        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}

Затем обновите Info.plist таким образом, чтобы MinimumOSVersion он был равен 11.0, который является минимальной версией iOS, необходимой для .NET MAUI.

Конфигурация проекта UWP

В проекте .NET MAUI WinUI 3 обновите App.xaml , чтобы он соответствовал приведенному ниже коду:

<?xml version="1.0" encoding="utf-8"?>
<maui:MauiWinUIApplication
    x:Class="YOUR_NAMESPACE_HERE.WinUI.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:maui="using:Microsoft.Maui"
    xmlns:local="using:YOUR_NAMESPACE_HERE.WinUI">
    <maui:MauiWinUIApplication.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
                <!-- Other merged dictionaries here -->
            </ResourceDictionary.MergedDictionaries>
            <!-- Other app resources here -->
        </ResourceDictionary>
    </maui:MauiWinUIApplication.Resources>
</maui:MauiWinUIApplication>

Примечание.

Если проект включал ресурсы в существующий файл App.xaml , их следует перенести в новую версию файла.

Кроме того, обновите App.xaml.cs для соответствия приведенному ниже коду:

using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using YOUR_MAUI_CLASS_LIB_HERE;

namespace YOUR_NAMESPACE_HERE.WinUI;

public partial class App : MauiWinUIApplication
{
    public App()
    {
        InitializeComponent();
    }

    protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

Примечание.

Если проект включал бизнес-логику в App.xaml.cs следует перенести эту логику в новую версию файла.

Затем добавьте файл launchSettings.json в папку "Свойства " проекта и добавьте в файл следующий код JSON:

{
  "profiles": {
    "Windows Machine": {
      "commandName": "MsixPackage",
      "nativeDebugging": true
    }
  }
}

Точка входа приложения

Приложения .NET MAUI имеют одну кроссплатформенную точку входа приложения. Каждая точка входа платформы вызывает CreateMauiApp метод статического MauiProgram класса и возвращает значение MauiApp.

Поэтому добавьте новый класс с именем MauiProgram , который содержит следующий код:

namespace YOUR_NAMESPACE_HERE;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>();

        return builder.Build();
    }
}

Примечание.

Для Xamarin.Forms проектов App UWP ссылка builder.UseMauiApp<App>() находится в файле MainPage.xaml.cs .

Если существуют определенные платформы службы, которые необходимо перенести в .NET MAUI, используйте AddTransient(IServiceCollection, Type) метод для добавления временной службы указанного типа в указанный.IServiceCollection

Примечание.

Вы можете быстро обновить Xamarin.Forms пространства имен с помощью быстрых Microsoft.Maui действий в Visual Studio, если установлен помощник по обновлению.

Изменения AssemblyInfo

Свойства, которые обычно задаются в файле AssemblyInfo.cs, теперь доступны в проекте в стиле пакета SDK. Мы рекомендуем перенести их из AssemblyInfo.cs в файл проекта в каждом проекте и удалить файл AssemblyInfo.cs .

При необходимости можно сохранить файл AssemblyInfo.cs и задать GenerateAssemblyInfo свойство в файле falseпроекта следующим образом:

<PropertyGroup>
  <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

Дополнительные сведения о свойстве GenerateAssemblyInfo см. в разделе GenerateAssemblyInfo.

Обновление зависимостей приложений

Как правило, пакеты NuGet несовместимы с .NET 8, Xamarin.Forms если они не были перекомпилированы с помощью моникеров платформы .NET (TFM). Однако приложения Android могут использовать пакеты NuGet, monoandroid предназначенные для платформ и monoandroidXX.X платформ.

Вы можете убедиться, что пакет совместим с .NET 8, просматривая вкладку Платформы в NuGet для используемого пакета, и убедитесь, что он содержит одну из совместимых платформ, показанных в следующей таблице:

Совместимые платформы Несовместимые платформы
net8.0-android, monoandroid, monoandroidXX.X
net8.0-ios monotouch, xamarinios, xamarinios10
net8.0-macos monomac, xamarinmac, xamarinmac20
net8.0-tvos xamarintvos
xamarinwatchos

Примечание.

Библиотеки .NET Standard, не зависящие от несовместимых платформ, перечисленных выше, по-прежнему совместимы с .NET 8.

Если пакет в NuGet указывает на совместимость с любой из совместимых платформ, приведенных выше, независимо от того, включая несовместимые платформы, то пакет совместим. Совместимые пакеты NuGet можно добавить в проект библиотеки .NET MAUI с помощью диспетчера пакетов NuGet в Visual Studio.

Если не удается найти совместимую версию пакета NuGet с .NET 8, необходимо:

  • Перекомпилируйте пакет с помощью TFM .NET, если вы владеете кодом.
  • Найдите предварительный выпуск пакета .NET 8.
  • Замените зависимость альтернативой, совместимой с .NET 8.

Компиляция и устранение неполадок

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

Совет

  • Удалите все папки bin и obj из всех проектов перед открытием и сборкой проектов в Visual Studio, особенно при изменении версий .NET.
  • Удалите созданный Resource.designer.cs файл из проекта Android.

В следующей таблице приведены рекомендации по преодолению распространенных проблем со сборкой или средой выполнения.

Проблема Совет
Xamarin.* Пространство имен не существует. Обновите пространство имен до эквивалента MAUI .NET. Дополнительные сведения см. в разделе "Изменения пространства имен".
API не существует. Обновите использование API до эквивалента .NET MAUI. Дополнительные сведения см. в разделе об изменениях API.
Приложение не будет развертывать. Убедитесь, что необходимый проект платформы установлен для развертывания в Configuration Manager Visual Studio.
Приложение не запустится. Обновите класс точки входа каждого проекта платформы и точку входа приложения. Дополнительные сведения см. в статье Начальная загрузка перенесенного приложения.
CollectionView не прокручивается. Проверьте макет контейнера и размер измеряемого CollectionViewразмера. По умолчанию элемент управления занимает столько места, сколько позволяет контейнеру. Дочерние Grid элементы ограничивают собственный размер. Однако дочерние StackLayout элементы могут занять место за пределами границ.
Всплывающее окно отображается на странице в iOS. Во Xamarin.Formsвсех всплывающих окнах iOS отображаются UIWindow экземпляры, но во всплывающем окну .NET MAUI отображаются при поиске текущего представления ViewController и отображении всплывающего окна.PresentViewControllerAsync В подключаемых модулях, таких как Mopups, чтобы убедиться, что всплывающие окна отображаются правильно, следует вызвать DisplayAlertDisplayActionSheetили DisplayPromptAsync из ContentPage используемого внутри всплывающего Mopup окна.
BoxView не отображается. Размер BoxView Xamarin.Forms по умолчанию — 40x40. Размер BoxView по умолчанию в .NET MAUI 0x0. Установите WidthRequest и HeightRequest установите значение 40.
Макет отсутствует заполнение, поле или интервал. Добавьте значения по умолчанию в проект на основе ресурса стиля .NET MAUI. Дополнительные сведения см. в разделе Об изменениях значений по умолчанию.Xamarin.Forms
Настраиваемый макет не работает. Код пользовательского макета должен обновляться для работы в .NET MAUI. Дополнительные сведения см. в разделе "Изменения пользовательского макета".
Пользовательский отрисовщик не работает. Код отрисовщика должен обновляться для работы в .NET MAUI. Дополнительные сведения см. в разделе "Использование пользовательских отрисовщиков" в .NET MAUI.
Эффект не работает. Код эффекта должен обновляться для работы в .NET MAUI. Дополнительные сведения см. в статье "Использование эффектов в .NET MAUI".
SkiaSharp код не работает. SkiaSharp коду требуются незначительные обновления для работы в .NET MAUI. Дополнительные сведения см. в статье "Повторное использование SkiaSharp кода" в .NET MAUI.
Не удается получить доступ к ранее созданным данным свойств приложения. Перенос данных свойств приложения в параметры .NET MAUI. Дополнительные сведения см. в разделе "Миграция данных из словаря свойств приложения" Xamarin.Forms в параметры .NET MAUI.
Не удается получить доступ к ранее созданным защищенным данным хранилища. Перенос защищенных данных хранилища в .NET MAUI. Дополнительные сведения см. в статье "Миграция из защищенного хранилища в Xamarin.Essentials безопасное хранилище .NET MAUI".
Не удается получить доступ к ранее созданным данным отслеживания версий. Перенос данных отслеживания версий в .NET MAUI. Дополнительные сведения см. в разделе "Миграция данных отслеживания версий Xamarin.Forms " из приложения в приложение .NET MAUI.

См. также