Freigeben über


Manuelles Upgrade einer Xamarin.Forms App auf eine .NET MAUI-App mit mehreren Projekten

Das Upgrade einer Multi-Project-Xamarin.Forms-App zu einer .NET Multi-platform App UI (.NET MAUI)-App folgt den gleichen Schritten wie ein Xamarin.Android- und Xamarin.iOS-Projekt, mit zusätzlichen Schritten, um die Vorteile von Änderungen in .NET MAUI zu nutzen.

In diesem Artikel wird beschrieben, wie Sie ein Xamarin.Forms Bibliotheksprojekt manuell zu einem .NET MAUI-Bibliotheksprojekt migrieren. Bevor Sie dies tun, müssen Sie Ihre Xamarin.Forms Plattformprojekte so aktualisieren, dass es sich um PROJEKTE im SDK-Stil handelt. Projekte im SDK-Stil sind dieselbe Projektformatierung, die von allen .NET-Workloads verwendet wird, und sind im Vergleich zu vielen Xamarin-Projekten deutlich weniger ausführlich. Informationen zum Aktualisieren Ihrer App-Projekte finden Sie unter Upgrade Xamarin.Android, Xamarin.iOS und Xamarin.Mac-Projekte auf .NET, Xamarin.Android-Projektmigration, Xamarin Apple-Projektmigration und Xamarin.Forms UWP-Projektmigration.

Um ein Xamarin.Forms Bibliotheksprojekt zu einem .NET MAUI-Bibliotheksprojekt zu migrieren, müssen Sie:

  • Aktualisieren Sie Ihre Xamarin.Forms-App, um Xamarin.Forms 5 zu verwenden.
  • Aktualisieren Sie die Abhängigkeiten der App auf die neuesten Versionen.
  • Stellen Sie sicher, dass die App weiterhin funktioniert.
  • Aktualisieren Sie Ihre Projektdatei auf SDK-Format.
  • Namespaces aktualisieren.
  • Berücksichtigen Sie alle Änderungen an der API.
  • Konfigurieren von .NET MAUI.
  • Aktualisieren oder ersetzen Sie inkompatible Abhängigkeiten mit .NET 8-Versionen.
  • Kompiliere und teste deine Anwendung.

Um den Upgradevorgang zu vereinfachen, sollten Sie ein neues .NET MAUI-Bibliotheksprojekt mit demselben Namen wie Ihr Xamarin.Forms Bibliotheksprojekt erstellen und dann in Code, Konfiguration und Ressourcen kopieren. Dies ist der unten aufgeführte Ansatz.

Aktualisieren Sie Ihre Xamarin.Forms-App

Bevor Sie Ihre Xamarin.Forms-App auf .NET MAUI aktualisieren, sollten Sie zuerst Ihre Xamarin.Forms-App auf Xamarin.Forms 5 aktualisieren und sicherstellen, dass sie weiterhin korrekt läuft. Darüber hinaus sollten Sie die Abhängigkeiten, die Ihre App verwendet, auf die neuesten Versionen aktualisieren.

Dies wird helfen, den Rest des Migrationsprozesses zu vereinfachen, da es die API-Unterschiede zwischen Xamarin.Forms und .NET MAUI minimieren wird und sicherstellen wird, dass Sie, falls vorhanden, .NET-kompatible Versionen Ihrer Abhängigkeiten verwenden.

Erstellen eines neuen Projekts

Erstellen Sie in Visual Studio ein neues .NET MAUI-Klassenbibliotheksprojekt mit demselben Namen wie Ihr Xamarin.Forms Bibliotheksprojekt. Dieses Projekt hostt den Code aus Ihrem Xamarin.Forms Bibliotheksprojekt. Beim Öffnen der Projektdatei wird bestätigt, dass Sie über ein .NET SDK-Formatprojekt verfügen:

<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>

Fügen Sie in Ihren Plattformprojekten einen Verweis auf dieses neue Bibliotheksprojekt hinzu. Kopieren Sie dann Ihre Xamarin.Forms Bibliotheksdateien in das .NET MAUI-Bibliotheksprojekt.

Namensraumänderungen

Namespaces wurden beim Wechsel von Xamarin.Forms zu .NET MAUI geändert, und Xamarin.Essentials Funktionen sind jetzt Teil von .NET MAUI. Um Namespace-Updates durchzuführen, führen Sie eine Suche und Ersetzung für die folgenden Namespaces durch:

Xamarin.Forms-Namespace .NET MAUI-Namespaces
Xamarin.Forms Microsoft.Maui und Microsoft.Maui.Controls
Xamarin.Forms.DualScreen Microsoft.Maui.Controls.Foldable
Xamarin.Forms.Maps Microsoft.Maui.Controls.Maps und 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-Projekte verwenden implizite global using-Direktiven. Diese Funktion ermöglicht es Ihnen, using-Direktiven für den Xamarin.Essentials-Namensraum zu entfernen, ohne sie durch die entsprechenden .NET MAUI-Namensräume ersetzen zu müssen.

Außerdem hat sich der Standard-XAML-Namespace von http://xamarin.com/schemas/2014/forms in Xamarin.Forms zu http://schemas.microsoft.com/dotnet/2021/maui in .NET MAUI geändert. Daher sollten Sie alle Vorkommen von xmlns="http://xamarin.com/schemas/2014/forms" durch xmlns="http://schemas.microsoft.com/dotnet/2021/maui" ersetzen.

Hinweis

Sie können Ihre Xamarin.Forms Namensräume zu Microsoft.Maui schnell aktualisieren, indem Sie Schnellaktionen in Visual Studio nutzen, sofern Sie Upgrade Assistant installiert haben.

API-Änderungen

Einige APIs haben sich beim Wechsel von Xamarin.Forms zu .NET MAUI geändert. Es gibt mehrere Gründe, darunter das Entfernen von doppelter Funktionalität, verursacht durch Xamarin.Essentials, die Teil von .NET MAUI wird, sowie die Sicherstellung, dass APIs den .NET-Namenrichtlinien folgen. Die folgenden Abschnitte erörtern diese Änderungen.

Farbänderungen

In Xamarin.Forms ermöglicht Ihnen die Xamarin.Forms.Color-Struktur, Color-Objekte mithilfe von double-Werten zu erstellen und bietet benannte Farben wie Xamarin.Forms.Color.AliceBlue. In .NET MAUI wurde diese Funktionalität auf die Microsoft.Maui.Graphics.Color-Klasse und die Microsoft.Maui.Graphics.Colors-Klasse aufgeteilt.

Die Microsoft.Maui.Graphics.Color Klasse im Microsoft.Maui.Graphics Namensraum ermöglicht es Ihnen, Color Objekte mithilfe von float Werten, byte Werten und int Werten zu erstellen. Die Microsoft.Maui.Graphics.Colors-Klasse, die sich auch im Microsoft.Maui.Graphics-Namespace befindet, bietet weitgehend die gleichen benannten Farben. Verwenden Sie beispielsweise Colors.AliceBlue, um die AliceBlue-Farbe anzugeben.

Die folgende Tabelle zeigt die API-Änderungen zwischen der Xamarin.Forms.Color-Struktur und der Microsoft.Maui.Graphics.Color-Klasse:

Xamarin.Forms-API .NET MAUI-API Kommentar
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-Eigenschaft durch eine Methode in .NET MAUI ersetzt.
Xamarin.Forms.Color.Saturation Microsoft.Maui.Graphics.Color.GetSaturation Xamarin.Forms-Eigenschaft durch eine Methode in .NET MAUI ersetzt.
Xamarin.Forms.Color.Luminosity Microsoft.Maui.Graphics.Color.GetLuminosity Xamarin.Forms-Eigenschaft durch eine Methode in .NET MAUI ersetzt.
Xamarin.Forms.Color.Default Kein .NET MAUI-Gegenstück. Stattdessen ist die Standardeinstellung für Microsoft.Maui.Graphics.Color Objekte null.
Xamarin.Forms.Color.Accent Kein .NET MAUI-Gegenstück.
Xamarin.Forms.Color.FromHex Microsoft.Maui.Graphics.Color.FromArgb Microsoft.Maui.Graphics.Color.FromHex ist veraltet und wird in einer zukünftigen Version entfernt.

Zusätzlich sind alle numerischen Werte in einem Microsoft.Maui.Graphics.Colorfloat, statt double wie in Xamarin.Forms.Color verwendet.

Hinweis

Anders als Xamarin.Forms hat ein Microsoft.Maui.Graphics.Color keine implizite Umwandlung in System.Drawing.Color.

Layoutänderungen

Die folgende Tabelle listet die Layout-APIs auf, die beim Wechsel von Xamarin.Forms zu .NET MAUI entfernt wurden.

Xamarin.Forms-API .NET MAUI-API Kommentare
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add Die Add Überladung, die drei Argumente akzeptiert, ist in .NET MAUI nicht vorhanden.
Xamarin.Forms.Grid.IGridList<T>.AddHorizontal Kein .NET MAUI-Gegenstück.
Xamarin.Forms.Grid.IGridList<T>.AddVertical Kein .NET MAUI-Gegenstück.
Xamarin.Forms.RelativeLayout Microsoft.Maui.Controls.Compatibility.RelativeLayout In .NET MAUI existiert RelativeLayout nur als Kompatibilitätskontrolle für Benutzer, die von Xamarin.Forms migrieren. Verwenden Sie stattdessen Grid, oder fügen Sie das xmlns für den Kompatibilitäts-Namespace hinzu.

Darüber hinaus wird das Hinzufügen von Kindern zu einem Layout im Code in Xamarin.Forms dadurch erreicht, dass die Kinder zur Children-Sammlung des Layouts hinzugefügt werden.

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

In .NET MAUI ist die Children-Sammlung für den internen Gebrauch durch .NET MAUI vorgesehen und sollte nicht direkt bearbeitet werden. Daher sollten im Code Kinder direkt zum Layout hinzugefügt werden.

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

Von Bedeutung

Beliebige Add Layout-Erweiterungsmethoden, wie GridExtensions.Add, werden auf das Layout anstatt auf die Layouts Children Sammlung angewendet.

Ihnen könnte auffallen, dass das Layout-Verhalten anders ist, wenn Sie Ihre aktualisierte .NET MAUI-App ausführen. Weitere Informationen finden Sie unter Layoutverhaltensänderungen von Xamarin.Forms.

Benutzerdefinierte Layoutänderungen

Der Prozess zum Erstellen eines benutzerdefinierten Layouts in Xamarin.Forms umfasst das Erstellen einer Klasse, die von Layout<View> abgeleitet wird, und das Überschreiben der Methoden VisualElement.OnMeasure und Layout.LayoutChildren. Für weitere Informationen siehe Eigene Layouts erstellen in Xamarin.Forms.

In .NET MAUI leiten sich die Layout-Klassen von der abstrakten Layout Klasse ab. Diese Klasse delegiert plattformübergreifendes Layout und Messungen an eine Layout-Manager-Klasse. Jede Layout-Manager-Klasse implementiert die ILayoutManager-Schnittstelle, die vorgibt, dass Measure- und ArrangeChildren-Implementierungen bereitgestellt werden müssen.

  • Die Measure Implementierung ruft IView.Measure auf jede Ansicht im Layout auf und gibt die Gesamtgröße des Layouts unter Berücksichtigung der Einschränkungen zurück.
  • Die ArrangeChildren Implementierung bestimmt, wo jede Ansicht innerhalb der Grenzen des Layouts platziert werden soll, und ruft Arrange auf jeder Ansicht mit ihren entsprechenden Grenzen auf. Der Rückgabewert ist die tatsächliche Größe des Layouts.

Für weitere Informationen siehe Custom layouts.

Geräteänderungen

Xamarin.Forms verfügt über eine Xamarin.Forms.Device-Klasse, die Ihnen hilft, mit dem Gerät und der Plattform zu interagieren, auf der die App ausgeführt wird. Die entsprechende Klasse in .NET MAUI, Microsoft.Maui.Controls.Device, ist veraltet, und ihre Funktionalität wird durch mehrere Typen ersetzt.

Die folgende Tabelle zeigt die .NET MAUI-Ersetzungen für die Funktionalität in der Xamarin.Forms.Device-Klasse:

Xamarin.Forms-API .NET MAUI-API Kommentare
Xamarin.Forms.Device.Android Microsoft.Maui.Devices.DevicePlatform.Android
Xamarin.Forms.Device.iOS Microsoft.Maui.Devices.DevicePlatform.iOS
Xamarin.Forms.Device.GTK Kein .NET MAUI-Gegenstück.
Xamarin.Forms.Device.macOS Kein .NET MAUI-Gegenstück. Stattdessen verwenden Sie 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 Kein .NET MAUI-Gegenstück.
Xamarin.Forms.Device.Flags Kein .NET MAUI-Gegenstück.
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 Kein .NET MAUI-Gegenstück.
Xamarin.Forms.Device.GetNamedSize Kein .NET MAUI-Gegenstück.
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 Kein .NET MAUI-Gegenstück.
Xamarin.Forms.Device.SetFlowDirection Microsoft.Maui.Controls.Window.FlowDirection
Xamarin.Forms.Device.StartTimer Microsoft.Maui.Dispatching.DispatcherExtensions.StartTimer oder Microsoft.Maui.Dispatching.Dispatcher.DispatchDelayed

Kartenänderungen

In Xamarin.Forms befinden sich die Map-Steuerelemente und zugehörigen Typen im Xamarin.Forms.Maps-Namespace. In .NET MAUI wurde diese Funktionalität in die Microsoft.Maui.Controls.Maps und Microsoft.Maui.Maps Namensräume verschoben. Einige Eigenschaften wurden umbenannt und einige Typen wurden durch gleichwertige Typen aus Xamarin.Essentials ersetzt.

Die folgende Tabelle zeigt die .NET MAUI-Ersetzungen für die Funktionalität im Xamarin.Forms.Maps-Namespace:

Xamarin.Forms-API .NET MAUI-API Kommentar
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 Kein .NET MAUI-Gegenstück.
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 Mitglieder des Typs "Xamarin.Forms.Maps.Position" sind zum "Microsoft.Maui.Devices.Sensors.Location"-Typ geändert worden.
Xamarin.Forms.Maps.Geocoder Microsoft.Maui.Devices.Sensors.Geocoding Mitglieder des Typs "Xamarin.Forms.Maps.Geocoder" sind zum "Microsoft.Maui.Devices.Sensors.Geocoding"-Typ geändert worden.

.NET MAUI verfügt über zwei Map Typen : Microsoft.Maui.Controls.Maps.Map und Microsoft.Maui.ApplicationModel.Map. Da der Microsoft.Maui.ApplicationModel-Namespace eine der global using-Anweisungen von .NET MAUI ist, müssen Sie, wenn Sie das Microsoft.Maui.Controls.Maps.Map-Steuerelement aus dem Code verwenden, Ihre Verwendung von Map vollständig qualifizieren oder einen -Alias mitverwenden.

In XAML sollte eine xmlns Namensraumdefinition für das Map Steuerelement hinzugefügt werden. Obwohl dies nicht erforderlich ist, verhindert es eine Kollision zwischen den Polygon- und Polyline-Typen, die sowohl im Microsoft.Maui.Controls.Maps- als auch im Microsoft.Maui.Controls.Shapes-Namensraum existieren. ** Weitere Informationen finden Sie unter Display a map.

Andere Änderungen

Eine kleine Anzahl anderer APIs wurde im Zuge des Wechsels von Xamarin.Forms zu .NET MAUI konsolidiert. Die folgende Tabelle zeigt diese Änderungen:

Xamarin.Forms-API .NET MAUI-API Kommentare
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 In Xamarin.Forms akzeptiert die ApplyQueryAttributes-Methode ein IDictionary<string, string>-Argument. In .NET MAUI akzeptiert die ApplyQueryAttributes Methode ein IDictionary<string, object> Argument.
Xamarin.Forms.MenuItem.Icon Microsoft.Maui.Controls.MenuItem.IconImageSource Xamarin.Forms.MenuItem.Icon ist die Basisklasse für Xamarin.Forms.ToolbarItem, und daher wird ToolbarItem.Icon zu ToolbarItem.IconImageSource.
Xamarin.Forms.OrientationStateTrigger.Orientation Microsoft.Maui.Controls.OrientationStateTrigger.Orientation In Xamarin.Forms ist die OrientationStateTrigger.Orientation-Eigenschaft vom Typ Xamarin.Forms.Internals.DeviceOrientation. In .NET MAUI ist die OrientationStateTrigger.Orientation-Eigenschaft vom Typ 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 ist die Basisklasse für Microsoft.Maui.Controls.ToolbarItem, und daher wird ToolbarItem.Name zu ToolbarItem.Text.

Darüber hinaus wird in Xamarin.Forms das Page.OnAppearing-Override auf Android aufgerufen, wenn eine App im Hintergrund läuft und dann in den Vordergrund gebracht wird. In dieser Situation wird das Überschreiben jedoch nicht auf iOS und Windows aufgerufen. In .NET MAUI wird das OnAppearing()-Override auf keiner Plattform aufgerufen, wenn eine App in den Hintergrund gestellt und dann in den Vordergrund gebracht wird. Stattdessen sollten Sie auf Lebenszyklusereignisse von Window hören, um benachrichtigt zu werden, wenn eine App in den Vordergrund zurückkehrt. Für weitere Informationen siehe .NET MAUI windows.

Änderungen der nativen Formulare

Native Forms in Xamarin.Forms sind in .NET MAUI zu einer nativen Einbettung geworden und verwenden einen anderen Initialisierungsansatz sowie unterschiedliche Erweiterungsmethoden, um plattformübergreifende Steuerelemente in ihre nativen Typen zu konvertieren. Für weitere Informationen siehe Native embedding.

Starten Sie Ihre migrierte App

Wenn Sie eine Xamarin.Forms App manuell auf .NET MAUI aktualisieren, müssen Sie die .NET MAUI-Unterstützung in jedem Plattformprojekt aktivieren, die Einstiegspunktklasse jedes Plattformprojekts aktualisieren und dann das Bootstrapping Ihrer .NET MAUI-App konfigurieren.

Aktivieren von .NET MAUI in Plattformprojekten

Bevor Sie die Einstiegspunktklasse jedes Plattformprojekts aktualisieren, müssen Sie zuerst die .NET MAUI-Unterstützung aktivieren. Dies kann erreicht werden, indem die Buildeigenschaft $(UseMaui) in jedem Plattformprojekt auf true festgelegt wird.

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

Von Bedeutung

Sie müssen <UseMaui>true</UseMaui> zu Ihrer Projektdatei hinzufügen, um die .NET MAUI-Unterstützung zu aktivieren. Stellen Sie außerdem sicher, dass Sie Ihrer WinUI-Projektdatei hinzugefügt <EnableDefaultMauiItems>false</EnableDefaultMauiItems> haben. Dies wird verhindern, dass Sie Buildfehler erhalten, weil die Methode InitializeComponent bereits definiert ist.

Hinzufügen von Paketverweisen

In .NET 8 wird .NET MAUI als .NET-Workload und mehrere NuGet-Pakete ausgeliefert. Der Vorteil dieses Ansatzes besteht darin, dass Sie Ihre Projekte auf einfache Weise an bestimmte Versionen anheften und gleichzeitig einfach eine Vorschau unveröffentlichter und experimenteller Builds anzeigen können.

Sie sollten die folgenden expliziten Paketverweise in eine <ItemGroup> in jede Projektdatei hinzufügen.

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

Auf die $(MauiVersion) Variable wird aus der Version von .NET MAUI verwiesen, die Sie installiert haben. Sie können dies ändern, indem Sie die Buildeigenschaft $(MauiVersion) zu jeder Projektdatei hinzufügen.

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

Android-Projektkonfiguration

Aktualisieren Sie in Ihrem .NET MAUI Android-Projekt die MainApplication Klasse so, dass sie dem folgenden Code entspricht:

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();
    }
}

Aktualisieren Sie außerdem die MainActivity-Klasse, um von MauiAppCompatActivity zu erben.

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);
        }
    }
}

Aktualisieren Sie dann Ihre Manifestdatei, um anzugeben, dass die minSdKVersion Version 21 ist, bei der es sich um die minimale Android SDK-Version handelt, die von .NET MAUI benötigt wird. Dies kann durch Ändern des <uses-sdk /> Knotens erreicht werden, der ein untergeordnetes Element des <manifest> Knotens ist:

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

iOS-Projektkonfiguration

Aktualisieren Sie in Ihrem .NET MAUI iOS-Projekt die AppDelegate-Klasse, um von MauiUIApplicationDelegate abzuleiten.

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();
    }
}

Aktualisieren Sie dann Info.plist so, dass MinimumOSVersion 11.0 ist, was die mindeste iOS-Version ist, die von .NET MAUI erforderlich ist.

UWP-Projektkonfiguration

Aktualisieren Sie in Ihrem .NET MAUI WinUI 3-Projekt "App.xaml " so, dass er dem folgenden Code entspricht:

<?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>

Hinweis

Wenn Ihr Projekt Ressourcen in Ihre vorhandene App.xaml aufgenommen hat, sollten Sie sie in die neue Version der Datei migrieren.

Außerdem aktualisieren Sie App.xaml.cs entsprechend dem folgenden Code:

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();
}

Hinweis

Wenn Ihr Projekt Geschäftslogik in App.xaml.cs enthält, sollten Sie diese Logik in die neue Version der Datei migrieren.

Fügen Sie dann dem Ordner "Eigenschaften" des Projekts eine launchSettings.json Datei hinzu, und fügen Sie der Datei den folgenden JSON-Code hinzu:

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

App-Einstiegspunkt

.NET MAUI-Apps verfügen über einen einzigen plattformübergreifenden App-Einstiegspunkt. Jeder Plattformeinstiegspunkt ruft eine CreateMauiApp Methode für die statische MauiProgram Klasse auf und gibt eine MauiApp.

Fügen Sie daher eine neue Klasse mit dem Namen MauiProgram hinzu, die den folgenden Code enthält:

namespace YOUR_NAMESPACE_HERE;

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

        return builder.Build();
    }
}

Hinweis

Für Xamarin.Forms UWP-Projekte kann der App-Verweis in builder.UseMauiApp<App>() der Datei MainPage.xaml.cs gefunden werden.

Wenn plattformspezifische Dienste vorhanden sind, die zu .NET MAUI migriert werden müssen, verwenden Sie die AddTransient(IServiceCollection, Type)-Methode, um einen vorübergehenden Dienst des angegebenen Typs zum angegebenen IServiceCollection hinzuzufügen.

Hinweis

Sie können Ihre Xamarin.Forms Namensräume zu Microsoft.Maui schnell aktualisieren, indem Sie Schnellaktionen in Visual Studio nutzen, sofern Sie Upgrade Assistant installiert haben.

Änderungen an AssemblyInfo

In einem SDK-Projekt im Stil Ihrer Vorgaben sind nun Eigenschaften verfügbar, die normalerweise in einer AssemblyInfo.cs-Datei festgelegt werden. Wir empfehlen, in jedem Projekt die AssemblyInfo.cs zu entfernen und auf die Projektdatei zu übertragen.

Optional können Sie die Datei AssemblyInfo.cs behalten und die Eigenschaft GenerateAssemblyInfo in Ihrer Projektdatei auf false setzen.

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

Weitere Informationen über die GenerateAssemblyInfo-Eigenschaft finden Sie unter GenerateAssemblyInfo.

Aktualisieren Sie die Abhängigkeiten der App

Generell sind Xamarin.Forms NuGet-Pakete mit .NET 8 nicht kompatibel, es sei denn, sie wurden unter Verwendung von .NET-Ziel-Framework-Monikern (TFMs) neu kompiliert. Allerdings können Android-Apps NuGet-Pakete verwenden, die für die monoandroid- und monoandroidXX.X-Frameworks bestimmt sind.

Sie können bestätigen, dass ein Paket mit .NET 8 kompatibel ist, indem Sie auf der Registerkarte Frameworks auf NuGet nachsehen, ob eines der kompatiblen Frameworks aufgelistet ist, die in der folgenden Tabelle dargestellt sind.

Kompatible Frameworks Inkompatible Frameworks
net8.0-android, Monoandroid, MonoandroidXX.X
net8.0-ios Monotouch, xamarinios, xamarinios10
net8.0-macos Monomac, xamarinmac, xamarinmac20
net8.0-tvos xamarintvos
xamarinwatchos

Hinweis

Bibliotheken des .NET-Standards, die keine Abhängigkeiten zu den oben aufgelisteten inkompatiblen Frameworks haben, sind weiterhin mit .NET 8 kompatibel.

Wenn ein Paket auf NuGet Kompatibilität mit einem der oben genannten kompatiblen Frameworks anzeigt, unabhängig davon, ob auch inkompatible Frameworks enthalten sind, dann ist das Paket kompatibel. Kompatible NuGet-Pakete können Ihrem .NET MAUI-Bibliotheksprojekt mit dem NuGet-Paket-Manager in Visual Studio hinzugefügt werden.

Wenn Sie keine mit .NET 8 kompatible Version eines NuGet-Pakets finden können, sollten Sie:

  • Kompilieren Sie das Paket mit .NET TFMs neu, wenn Sie über den Code verfügen.
  • Suchen Sie nach einer Vorschauversion einer .NET 8-Version des Pakets.
  • Ersetzen Sie die Abhängigkeit durch eine mit .NET 8 kompatible Alternative.

Kompilieren und Fehlerbehebung

Sobald Ihre Abhängigkeiten gelöst sind, sollten Sie Ihr Projekt bauen. Jegliche Fehler werden Ihnen die nächsten Schritte aufzeigen.

Tipp

  • Löschen Sie alle bin- und obj-Ordner aus allen Projekten, bevor Sie die Projekte in Visual Studio öffnen und erstellen, insbesondere beim Ändern der .NET-Versionen.
  • Löschen Sie die generierte Datei Resource.designer.cs aus dem Android-Projekt.

Die folgende Tabelle bietet eine Anleitung zur Behebung häufiger Build- oder Laufzeitprobleme:

Thema Tipp
Xamarin.* Namespace existiert nicht. Aktualisieren Sie den Namespace auf das entsprechende .NET MAUI-Äquivalent. Für weitere Informationen siehe Namespace changes.
API existiert nicht. Aktualisieren Sie die API-Nutzung auf das .NET MAUI Äquivalent. Für weitere Informationen siehe API-Änderungen.
Die App lässt sich nicht bereitstellen. Stellen Sie sicher, dass das erforderliche Plattformprojekt im Konfigurationsmanager von Visual Studio zum Einsatz bereitgestellt ist.
Die App wird nicht gestartet. Aktualisieren Sie die Einstiegspunktklasse jedes Plattformprojekts und den Einstiegspunkt der App. Weitere Informationen finden Sie unter Bootstrap your migrated app.
CollectionView scrollt nicht. Überprüfen Sie das Containerlayout und die gemessene Größe des CollectionView. Standardmäßig wird das Steuerelement so viel Platz einnehmen, wie der Container erlaubt. Ein Grid beschränkt Kinder in seiner eigenen Größe. Allerdings ermöglicht ein StackLayout den Kindern, über seine Grenzen hinaus Platz einzunehmen.
Das Pop-up wird auf iOS unter der Seite angezeigt. In Xamarin.Forms sind alle Pop-ups auf iOS UIWindow-Instanzen, aber in .NET MAUI werden Pop-ups angezeigt, indem die aktuelle präsentierende ViewController ermittelt und das Pop-up mit PresentViewControllerAsync angezeigt wird. In Plugins wie Mopups sollten Sie, um sicherzustellen, dass Ihre Pop-ups korrekt angezeigt werden, DisplayAlert (oder DisplayAlertAsync in .NET 10+), DisplayActionSheet (oder DisplayActionSheetAsync in .NET 10+) oder DisplayPromptAsync vom ContentPage aufrufen, das innerhalb des Mopup-Popups verwendet wird.
BoxView wird nicht angezeigt. Die Standardgröße eines BoxView in Xamarin.Forms beträgt 40x40. Die Standardgröße eines BoxView in .NET MAUI ist 0x0. Setze WidthRequest und HeightRequest auf 40.
Im Layout fehlen Polsterung, Rand oder Abstand. Fügen Sie Standardwerte zu Ihrem Projekt hinzu, basierend auf der .NET MAUI Stilressource. Für weitere Informationen siehe Standardwertänderungen von Xamarin.Forms.
Das benutzerdefinierte Layout funktioniert nicht. Der benutzerdefinierte Layout-Code muss aktualisiert werden, um in .NET MAUI zu funktionieren. Weitere Informationen finden Sie unter Benutzerdefinierte Layoutänderungen.
Der benutzerdefinierte Renderer funktioniert nicht. Der Renderer-Code muss aktualisiert werden, um in .NET MAUI zu funktionieren. Weitere Informationen finden Sie unter Use custom renderers in .NET MAUI.
Der Effekt funktioniert nicht. Der Effekt-Code muss aktualisiert werden, um in .NET MAUI zu funktionieren. Für weitere Informationen siehe Use effects in .NET MAUI.
SkiaSharp Code funktioniert nicht. Der SkiaSharp Code benötigt kleinere Aktualisierungen, um in .NET MAUI zu funktionieren. Weitere Informationen finden Sie unter Reuse SkiaSharp code in .NET MAUI.
Der Zugriff auf zuvor erstellte App-Eigenschaftsdaten ist nicht möglich. Migrieren Sie die App-Eigenschaftsdaten zu .NET MAUI-Voreinstellungen. Weitere Informationen finden Sie unter Migrate data from the Xamarin.Forms app properties dictionary to .NET MAUI preferences.
Kein Zugriff auf zuvor erstellte sichere Speicherdaten. Migrieren Sie die Daten des sicheren Speichers zu .NET MAUI. Weitere Informationen finden Sie unter Migrate from Xamarin.Essentials secure storage to .NET MAUI secure storage.
Kein Zugriff auf zuvor erstellte Versionstracking-Daten. Migrieren Sie die Versionsverfolgungsdaten zu .NET MAUI. Weitere Informationen finden Sie unter Version-Tracking-Daten von einer Xamarin.Forms App in eine .NET MAUI App migrieren.

Siehe auch