Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Обновление мультипроектного приложения до многоплатформенного приложения .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. Чтобы обновить пространства имен, выполните поиск и замену для следующих пространств имен:
Проекты .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, при условии, что у вас установлен Upgrade Assistant.
Изменения API
Некоторые API изменились при переходе с Xamarin.Forms на .NET MAUI. Существует несколько причин для этого, включая удаление дублирующегося функционала, вызванного тем, что Xamarin.Essentials стал частью .NET MAUI, и обеспечение того, чтобы API соответствовали руководствам по именованию .NET. В следующих разделах рассматриваются эти изменения.
Изменения цвета
В Xamarin.Forms структура Xamarin.Forms.Color позволяет создавать объекты 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.
| Xamarin.Forms API | 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:
| Xamarin.Forms API | API .NET MAUI | Комментарии |
|---|---|---|
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add |
Перегрузка Add , принимающая три аргумента, отсутствует в .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 коллекция Children предназначена для внутреннего использования .NET MAUI и не должна изменяться напрямую. Следовательно, в коде дочерние элементы должны быть добавлены непосредственно в макет.
Grid grid = new Grid();
grid.Add(new Label { Text = "Hello world" });
Это важно
Любые методы расширения макета, такие как Add, вызываются на самом макете, а не на коллекции макетов GridExtensions.Add.
Вы можете заметить, что при запуске обновленного приложения .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.Forms имеет класс Xamarin.Forms.Device, который помогает взаимодействовать с устройством и платформой, на которой работает приложение. Эквивалентный класс в .NET MAUI, Microsoft.Maui.Controls.Device, устарел, и его функциональность заменена несколькими типами.
В следующей таблице показаны замены MAUI .NET для функциональных возможностей Xamarin.Forms.Device класса:
| Xamarin.Forms API | 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.
Следующая таблица показывает замены .NET MAUI для функциональности в пространстве имен Xamarin.Forms.Maps:
| Xamarin.Forms API | 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 является одной из директив global using в .NET MAUI, при использовании элемента управления Microsoft.Maui.Controls.Maps.Map из кода необходимо полностью квалифицировать использование Map или воспользоваться с псевдонимом.
В XAML следует добавить определение пространства имен для контрола xmlns. Хотя это не обязательно, это предотвращает конфликт между типами Polygon и Polyline, которые существуют как в пространствах имен Microsoft.Maui.Controls.Maps, так и в Microsoft.Maui.Controls.Shapes. Для получения дополнительной информации см. Display a map.
Другие изменения
Небольшое количество других API было объединено при переходе с Xamarin.Forms на .NET MAUI. В следующей таблице показаны эти изменения:
| Xamarin.Forms API | 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 | Метод ApplyQueryAttributes, в Xamarin.Forms принимающий аргумент 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. |
Кроме того, в Xamarin.Forms вызов переопределения Page.OnAppearing на Android происходит, когда приложение переводится в фоновый режим, а затем возвращается на передний план. Однако этот оверрайд не вызывается на iOS и Windows в той же ситуации. В .NET MAUI переопределение OnAppearing() не вызывается на любых платформах, когда приложение переводится в фоновый режим, а затем возвращается в передний план. Вместо этого вы должны отслеживать события жизненного цикла на Window, чтобы получать уведомления, когда приложение возвращается на передний план. Для получения дополнительной информации см. .NET MAUI windows.
Изменения в родных формах
Собственные формы стали собственным внедрением в Xamarin.Forms .NET MAUI и использует другой подход инициализации и различные методы расширения для преобразования кроссплатформенных элементов управления в собственные типы. Для получения дополнительной информации см. Native embedding.
Настройка перенесенного приложения
При ручном обновлении Xamarin.Forms приложения до .NET MAUI необходимо включить поддержку .NET MAUI в каждом проекте платформы, обновить класс точки входа каждого проекта платформы и настроить начальную загрузку приложения .NET MAUI.
Включение .NET MAUI в проектах платформы
Перед обновлением класса точки входа каждого проекта платформы необходимо сначала включить поддержку .NET MAUI. Это можно сделать, задав для параметра сборки $(UseMaui) значение true в каждом проекте платформы.
<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();
}
}
Примечание.
Для UWP проектов ссылка App в builder.UseMauiApp<App>() находится в файле MainPage.xaml.cs.
Если существуют специфичные для платформы службы, которые необходимо перенести в .NET MAUI, используйте метод AddTransient(IServiceCollection, Type) для добавления временной службы указанного типа в указанное место IServiceCollection.
Примечание.
Вы можете быстро обновить свои Xamarin.Forms пространства имен до Microsoft.Maui, используя Быстрые действия в Visual Studio, при условии, что у вас установлен Upgrade Assistant.
Изменения в AssemblyInfo
Свойства, которые обычно задаются в файле AssemblyInfo.cs, теперь доступны в вашем проекте в стиле SDK. Мы рекомендуем перенести их из AssemblyInfo.cs в файл проекта в каждом проекте и удалить файл AssemblyInfo.cs.
При желании вы можете оставить файл AssemblyInfo.cs и установить свойство GenerateAssemblyInfo в вашем файле проекта на false:
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
Чтобы получить дополнительную информацию о свойстве GenerateAssemblyInfo, см. GenerateAssemblyInfo.
Обновление зависимостей приложений
Как правило, Xamarin.Forms пакеты NuGet несовместимы с .NET 8, если они не были перекомпилированы с использованием обозначений целевой платформы .NET (TFM). Однако приложения Android могут использовать пакеты NuGet, предназначенные для платформ monoandroid и monoandroidXX.X.
Вы можете убедиться, что пакет совместим с .NET 8, посмотрев на вкладку Frameworks на 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.
Если вы не можете найти совместимую с .NET 8 версию пакета NuGet, вам следует:
- Перекомпилируйте пакет с .NET TFMs, если вы являетесь владельцем кода.
- Ищите предварительный выпуск версии пакета .NET 8.
- Замените зависимость на совместимую с .NET 8 альтернативу.
Компиляция и устранение неполадок
После разрешения ваших зависимостей, вам следует собрать проект. Любые ошибки помогут вам определить следующие шаги.
Подсказка
- Удалите все папки bin и obj из всех проектов перед открытием и сборкой проектов в Visual Studio, особенно при изменении версий .NET.
- Удалите сгенерированный файл Resource.designer.cs из проекта Android.
Следующая таблица предоставляет рекомендации для преодоления распространенных проблем сборки или времени выполнения.
| Проблема | Подсказка |
|---|---|
Xamarin.* Пространство имен не существует. |
Обновите пространство имен на его эквивалент в .NET MAUI. Для получения дополнительной информации см. Изменения пространства имен. |
| API не существует. | Обновите использование API до его эквивалента в .NET MAUI. Для получения дополнительной информации см. Изменения API. |
| Приложение не может быть развернуто. | Убедитесь, что необходимый проект платформы установлен для развертывания в Configuration Manager Visual Studio. |
| Приложение не запускается. | Обновите класс точки входа каждого проекта платформы и точку входа приложения. Для получения дополнительной информации см. раздел Bootstrap your migrated app. |
| CollectionView не прокручивается. | Проверьте компоновку контейнера и измеренный размер CollectionView. По умолчанию элемент управления займет столько места, сколько позволяет контейнер. Grid ограничивает свои дочерние элементы своим собственным размером. Однако StackLayout позволяет детям занимать пространство за его пределами. |
| Всплывающее окно отображается под страницей на iOS. | Во Xamarin.Formsвсех всплывающих окнах iOS являются UIWindow экземплярами, но во .NET MAUI всплывающие окна отображаются, сначала находя текущий элемент ViewController, который выполняет представление, а затем отображая всплывающее окно.PresentViewControllerAsync В таких плагинах, как Mopups, чтобы убедиться, что ваши всплывающие окна отображаются правильно, вам следует вызвать DisplayAlert (или DisplayAlertAsync в .NET 10+), DisplayActionSheet (или DisplayActionSheetAsync в .NET 10+) или 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. Дополнительную информацию см. в разделе Перенос данных из словаря свойств приложения Xamarin.Forms в настройки .NET MAUI. |
| Не удается получить доступ к ранее созданным защищенным данным хранилища. | Перенесите данные безопасного хранилища в .NET MAUI. Дополнительную информацию см. в разделе Перенос из Xamarin.Essentials безопасного хранилища в безопасное хранилище .NET MAUI. |
| Невозможно получить доступ к данным отслеживания версий, созданным ранее. | Перенесите данные отслеживания версий на .NET MAUI. Дополнительные сведения см. в разделе "Миграция данных отслеживания версий Xamarin.Forms " из приложения в приложение .NET MAUI. |