Manuelles Upgrade einer Xamarin.Forms-App zu einer projektübergreifenden .NET MAUI-App
Das Upgrade einer Multiprojekt-Xamarin.Forms-App auf eine Multiprojekt-.NET Multiplatform App UI (.NET MAUI)-App erfolgt in denselben Schritten wie bei einem Xamarin.Android- und Xamarin.iOS-Projekt, mit zusätzlichen Schritten, um die Vorteile der Änderungen in .NET MAUI zu nutzen.
In diesem Artikel wird beschrieben die manuelle Migration eines Xamarin.Forms-Bibliotheksprojekts in ein .NET MAUI-Bibliotheksprojekt. Bevor Sie dies tun, müssen Sie Ihre Xamarin.Forms-Plattformprojekte so aktualisieren, dass es sich um Projekte im SDK-Stil handelt. SDK-Projekte sind das gleiche Projektformat, das von allen .NET-Workloads verwendet wird, und im Vergleich zu vielen Xamarin-Projekten sind sie viel weniger umfangreich. Informationen zum Aktualisieren Ihrer App-Projekte finden Sie unter Upgraden von Xamarin.Android-, Xamarin.iOS- und Xamarin.Mac-Projekten auf .NET, Xamarin.Android-Projektmigration, Xamarin Apple-Projektmigration und Xamarin.Forms-UWP-Projektmigration.
Um ein Xamarin.Forms-Bibliotheksprojekt in ein .NET MAUI-Bibliotheksprojekt zu migrieren, müssen Sie:
- Aktualisieren Sie Ihre Xamarin.Forms-App, um Xamarin.Forms zu verwenden 5.
- Aktualisieren Sie alle Abhängigkeiten auf die neueste Version.
- Stellen Sie sicher, dass die App weiterhin funktioniert.
- Aktualisieren der Projektdatei als Projekt im SDK-Stil
- Aktualisieren von Namespaces.
- Behandeln Sie alle API-Änderungen.
- Konfigurieren von .NET MAUI.
- Aktualisieren oder ersetzen Sie inkompatible Abhängigkeiten durch .NET 8-Versionen.
- Kompilieren und Testen Der App.
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 beschriebene Ansatz.
Aktualisieren Ihrer Xamarin.Forms-App
Bevor Sie Ihre Xamarin.Forms-App auf .NET MAUI aktualisieren, sollten Sie zunächst Ihre Xamarin.Forms-App aktualisieren, um Xamarin.Forms 5 zu verwenden, 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.
Dadurch wird der restliche Migrationsprozess vereinfacht, da die API-Unterschiede zwischen Xamarin.Forms und .NET MAUI minimiert werden und sichergestellt wird, dass Sie .NET-kompatible Versionen Ihrer Abhängigkeiten verwenden, falls diese existieren.
Erstellen eines neuen Projekts
Erstellen Sie in Visual Studio ein neues .NET MAUI-Klassenbibliotheksprojekt mit demselben Namen wie Ihr Xamarin.Forms-Bibliotheksprojekt. Dieses Projekt wird den Code Ihres Xamarin.Forms-Bibliotheksprojekts enthalten. Wenn Sie die Projektdatei öffnen, wird bestätigt, dass Sie ein Projekt im Stil des .NET SDK haben:
<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.
Namespaceänderungen
Die Namensräume haben sich mit dem Übergang von Xamarin.Forms zu .NET MAUI geändert, und die Xamarin.Essentials-Funktionen sind jetzt Teil von .NET MAUI. Führen Sie zum Erstellen von Namespaceupdates einen Such- und Ersetzungsvorgang für die folgenden Namespaces aus:
.NET MAUI-Projekte verwenden implizite global using
-Anweisungen. Mit dieser Funktion können Sie using
-Anweisungen für den Xamarin.Essentials
-Namespace entfernen, ohne sie durch die entsprechenden .NET MAUI-Namensräume ersetzen zu müssen.
Darüber hinaus 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
-Namespaces schnell auf Microsoft.Maui
aktualisieren, indem Sie Schnelle Aktionen in Visual Studio verwenden, vorausgesetzt, Sie haben Upgrade-Assistent installiert.
API-Änderungen
Einige APIs haben sich durch den Übergang von Xamarin.Forms zu .NET MAUI geändert. Dafür gibt es mehrere Gründe, darunter die Beseitigung doppelter Funktionalität, die dadurch entstanden ist, dass Xamarin.Essentials Teil von .NET MAUI geworden ist, und die Sicherstellung, dass APIs den .NET-Namensrichtlinien folgen. Diese Faktoren werden in den folgenden Abschnitten erläutert.
Farbänderungen
In Xamarin.Forms ermöglicht die Xamarin.Forms.Color
-Struktur die Konstruktion von Color-Objekten unter Verwendung von double
-Werten und bietet benannte Farben, wie Xamarin.Forms.Color.AliceBlue
. In .NET MAUI wurde diese Funktionalität in die Klasse Microsoft.Maui.Graphics.Color und die Klasse Microsoft.Maui.Graphics.Colors aufgeteilt.
Mit der Klasse Microsoft.Maui.Graphics.Color im Microsoft.Maui.Graphics-Namespace können Sie Color-Objekte mit float
-Werten, byte
-Werten und int
-Werten konstruieren. Die Klasse Microsoft.Maui.Graphics.Colors, die sich ebenfalls im Microsoft.Maui.Graphics-Namespace befindet, bietet weitgehend die gleichen benannten Farben. Verwenden Sie z. B. Colors.AliceBlue, um die AliceBlue
Farbe anzugeben.
Die folgende Tabelle zeigt die API-Änderungen zwischen der Xamarin.Forms.Color
struct und der Microsoft.Maui.Graphics.Color-Klasse:
Xamarin.Forms-API | .NET MAUI-App | 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 wurde durch eine Methode in .NET MAUI ersetzt. |
Xamarin.Forms.Color.Saturation |
Microsoft.Maui.Graphics.Color.GetSaturation | Xamarin.Forms-Eigenschaft wurde durch eine Methode in .NET MAUI ersetzt. |
Xamarin.Forms.Color.Luminosity |
Microsoft.Maui.Graphics.Color.GetLuminosity | Xamarin.Forms-Eigenschaft wurde durch eine Methode in .NET MAUI ersetzt. |
Xamarin.Forms.Color.Default |
Keine .NET MAUI-Entsprechung. Stattdessen werden Microsoft.Maui.Graphics.Color-Objekte standardmäßig auf null gesetzt. |
|
Xamarin.Forms.Color.Accent |
Keine .NET MAUI-Entsprechung. | |
Xamarin.Forms.Color.FromHex |
Microsoft.Maui.Graphics.Color.FromArgb | Microsoft.Maui.Graphics.Color.FromHex ist veraltet und wird in einer zukünftigen Version entfernt werden. |
Darüber hinaus sind alle numerischen Werte in einem Microsoft.Maui.Graphics.Color float
und nicht double
wie in Xamarin.Forms.Color
.
Hinweis
Im Gegensatz zu Xamarin.Forms gibt es bei Microsoft.Maui.Graphics.Color keine implizite Umwandlung in System.Drawing.Color.
Layoutänderungen
In der folgenden Tabelle sind die Layout-APIs aufgeführt, die bei der Umstellung von Xamarin.Forms auf .NET MAUI entfernt wurden:
Xamarin.Forms-API | .NET MAUI-App | Kommentare |
---|---|---|
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add |
Die Add Überladung, die 3 Argumente akzeptiert, ist in .NET MAUI nicht vorhanden. |
|
Xamarin.Forms.Grid.IGridList<T>.AddHorizontal |
Keine .NET MAUI-Entsprechung. | |
Xamarin.Forms.Grid.IGridList<T>.AddVertical |
Keine .NET MAUI-Entsprechung. | |
Xamarin.Forms.RelativeLayout |
Microsoft.Maui.Controls.Compatibility.RelativeLayout | In .NET MAUI existiert RelativeLayout nur als Kompatibilitätssteuerung für Benutzer, die von Xamarin.Forms migrieren. Verwenden Sie stattdessen Grid, oder fügen Sie xmlns für den Kompatibilitätsnamensraum hinzu. |
Darüber hinaus wird das Hinzufügen von untergeordneten Elementen zu einem Layout im Code in Xamarin.Forms durch Hinzufügen der untergeordneten Elementen zur Children
-Sammlung des Layouts erreicht:
Grid grid = new Grid();
grid.Children.Add(new Label { Text = "Hello world" });
In .NET MAUI ist die Children-Sammlung für die interne Verwendung durch .NET MAUI bestimmt und sollte nicht direkt manipuliert werden. Daher sollten untergeordnete Elemente im Code direkt zum Layout hinzugefügt werden:
Grid grid = new Grid();
grid.Add(new Label { Text = "Hello world" });
Wichtig
Alle Add
Layout-Erweiterungsmethoden, wie etwa GridExtensions.Add, werden auf das Layout und nicht auf die Children Sammlung von Layouts angewandt.
Möglicherweise stellen Sie fest, dass beim Ausführen der aktualisierten .NET MAUI-App das Layoutverhalten unterschiedlich ist. Weitere Informationen finden Sie unter Layout-Verhaltensänderungen ab Xamarin.Forms.
Benutzerdefinierte Layoutänderungen
Das Verfahren zur Erstellung eines benutzerdefinierten Layouts in Xamarin.Forms umfasst die Erstellung einer Klasse, die von Layout<View>
abgeleitet ist, und das Überschreiben der Methoden VisualElement.OnMeasure
und Layout.LayoutChildren
. Weitere Informationen finden Sie unter Erstellen eines benutzerdefinierten Layouts in Xamarin.Forms.
In .NET MAUI werden die Layoutklassen von der abstrakten Layout-Klasse abgeleitet. Diese Klasse delegiert plattformübergreifendes Layout und Messungen an eine Layout-Manager-Klasse. Jede Layout-Manager-Klasse implementiert die ILayoutManager-Schnittstelle, die angibt, dass Measure- und ArrangeChildren- Implementierungen bereitgestellt werden müssen:
- Die Measure-Implementierung ruft IView.Measure für jede Ansicht im Layout auf und gibt die Gesamtgröße des Layouts mit den entsprechenden Einschränkungen zurück.
- Die ArrangeChildren-Implementierung bestimmt, wo jede Ansicht innerhalb der Grenzen des Layouts platziert werden soll, und ruft für jede Ansicht Arrange mit den entsprechenden Grenzen auf. Der Rückgabewert ist die tatsächliche Größe des Layouts.
Weitere Informationen finden Sie unter Benutzerdefinierte Layouts.
Geräteänderungen
Xamarin.Forms hat eine Xamarin.Forms.Device
Klasse, die Ihnen hilft, mit dem Gerät und der Plattform, auf der die App läuft, zu interagieren. 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 Funktionen der Klasse Xamarin.Forms.Device
:
Xamarin.Forms-API | .NET MAUI-App | Kommentare |
---|---|---|
Xamarin.Forms.Device.Android |
Microsoft.Maui.Devices.DevicePlatform.Android | |
Xamarin.Forms.Device.iOS |
Microsoft.Maui.Devices.DevicePlatform.iOS | |
Xamarin.Forms.Device.GTK |
Keine .NET MAUI-Entsprechung. | |
Xamarin.Forms.Device.macOS |
Keine .NET MAUI-Entsprechung. Verwenden Sie stattdessen 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 |
Keine .NET MAUI-Entsprechung. | |
Xamarin.Forms.Device.Flags |
Keine .NET MAUI-Entsprechung. | |
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 |
Keine .NET MAUI-Entsprechung. | |
Xamarin.Forms.Device.GetNamedSize |
Keine .NET MAUI-Entsprechung. | |
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 |
Keine .NET MAUI-Entsprechung. | |
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 das Map
-Steuerelement und die zugehörigen Typen im Xamarin.Forms.Maps
-Namespace. In .NET MAUI wurde diese Funktionalität in die Namespaces Microsoft.Maui.Controls.Maps und Microsoft.Maui.Maps verlagert. 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 Funktionen im Xamarin.Forms.Maps
-Namenspace:
Xamarin.Forms-API | .NET MAUI-App | 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 |
Keine .NET MAUI-Entsprechung. | |
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 haben sich in den Typ Microsoft.Maui.Devices.Sensors.Location geändert. |
Xamarin.Forms.Maps.Geocoder |
Microsoft.Maui.Devices.Sensors.Geocoding | Mitglieder des Typs Xamarin.Forms.Maps.Geocoder haben sich in den Typ Microsoft.Maui.Devices.Sensors.Geocoding geändert. |
.NET MAUI hat 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 bei der Verwendung des Microsoft.Maui.Controls.Maps.Map-Steuerelements im Code die Map
-Verwendung vollständig qualifizieren oder einen Alias verwenden.
In XAML sollte eine xmlns
-Namespace-Definition für das Map-Steuerelement hinzugefügt werden. Dies ist zwar nicht erforderlich, verhindert aber eine Kollision zwischen den Typen Polygon
und Polyline
, die sowohl in den Namespaces Microsoft.Maui.Controls.Maps als auch Microsoft.Maui.Controls.Shapes existieren. Weitere Informationen finden Sie unter Anzeigen einer Karte.
Weitere Änderungen
Bei der Umstellung von Xamarin.Forms auf .NET MAUI wurde eine kleine Anzahl anderer APIs konsolidiert. Im folgenden Code sind diese Änderungen dargestellt.
Xamarin.Forms-API | .NET MAUI-App | 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 nimmt die ApplyQueryAttributes -Methode ein IDictionary<string, string> -Argument an. In .NET MAUI akzeptiert die Methode ApplyQueryAttributes ein Argument IDictionary<string, object> . |
Xamarin.Forms.MenuItem.Icon |
Microsoft.Maui.Controls.MenuItem.IconImageSource | Xamarin.Forms.MenuItem.Icon ist die Basisklasse für Xamarin.Forms.ToolbarItem , und so wird ToolbarItem.Icon zu ToolbarItem.IconImageSource . |
Xamarin.Forms.OrientationStateTrigger.Orientation |
Microsoft.Maui.Controls.OrientationStateTrigger.Orientation | In Xamarin.Forms ist die Eigenschaft OrientationStateTrigger.Orientation vom Typ Xamarin.Forms.Internals.DeviceOrientation . In .NET MAUI ist die Eigenschaft OrientationStateTrigger.Orientation 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 so wird ToolbarItem.Name zu ToolbarItem.Text . |
Außerdem wird die Außerkraftsetzung von Page.OnAppearing
in Xamarin.Forms auf Android aufgerufen, wenn eine App im Hintergrund und dann im Vordergrund ausgeführt wird. Diese Außerkraftsetzung wird bei iOS und Windows jedoch nicht im selben Szenario aufgerufen. In .NET MAUI wird die OnAppearing()-Außerkraftsetzung nicht auf Plattformen aufgerufen, wenn eine App zunächst im Hintergrund und dann im Vordergrund ausgeführt wird. Stattdessen sollten Sie unter Window auf Lebenszyklusereignissen lauschen, um benachrichtigt zu werden, wenn eine App wieder im Vordergrund ausgeführt wird. Weitere Informationen finden Sie unter .NET MAUI – Window-Klasse.
Änderungen an nativen Formularen
Native Formulare in Xamarin.Forms ist zu einer nativen Einbettung in .NET MAUI geworden und verwendet einen anderen Initialisierungsansatz und andere Erweiterungsmethoden, um plattformübergreifende Steuerelemente in ihre nativen Typen zu konvertieren. Für weitere Informationen siehe Native Einbettung.
Bootstrappen Ihrer migrierten 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. Legen Sie hierzu die $(UseMaui)
-Buildeigenschaft in jedem Plattformprojekt auf true
fest:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<UseMaui>true</UseMaui>
</PropertyGroup>
</Project>
Wichtig
Sie müssen Ihrer Projektdatei <UseMaui>true</UseMaui>
hinzufügen, um die .NET MAUI-Unterstützung zu aktivieren. Stellen Sie außerdem sicher, dass Sie Ihrer WinUI-Projektdatei <EnableDefaultMauiItems>false</EnableDefaultMauiItems>
hinzugefügt haben. Dadurch wird verhindert, dass Sie Build-Fehler erhalten, weil die Methode InitializeComponent
bereits definiert ist.
Hinzufügen von Paketverweisen
In .NET 8 wird .NET MAUI als .NET-Workload und als mehrere NuGet-Pakete ausgeliefert. Der Vorteil dieses Ansatzes besteht darin, dass Sie Ihre Projekte einfach an bestimmte Versionen anheften können, während Sie gleichzeitig eine Vorschau auf unveröffentlichte oder experimentelle Builds erhalten.
Sie sollten die folgenden expliziten Paketverweise zu <ItemGroup>
in jeder Projektdatei hinzufügen:
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
Die Variable $(MauiVersion)
wird von der Version von .NET MAUI referenziert, die Sie installiert haben. Sie können dies überschreiben, indem Sie die $(MauiVersion)
-Buildeigenschaft 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 Klasse MainApplication
so, dass sie dem unten stehenden 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 auch die Klasse MainActivity
, damit sie von MauiAppCompatActivity
erbt:
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 minSdKVersion
21 ist, was die minimale Android SDK-Version ist, die von .NET MAUI benötigt wird. Dies kann durch Änderung des Knotens <uses-sdk />
erreicht werden, der ein untergeordnetes Element des Knotens <manifest>
ist:
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="32" />
iOS-Projektkonfiguration
Aktualisieren Sie in Ihrem .NET MAUI iOS-Projekt die Klasse AppDelegate
so, dass sie von MauiUIApplicationDelegate
erbt:
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, sodass MinimumOSVersion
11.0 ist, was die minimale iOS-Version ist, die von .NET MAUI benötigt wird.
UWP-Projektkonfiguration
Passen Sie in Ihrem .NET MAUI-Projekt für WinUI 3 die Datei App.xaml an den folgenden Code an:
<?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 Ihrer vorhandenen App.xaml-Datei enthalten hat, sollten Sie sie zur neuen Version der Datei migrieren.
Passen Sie außerdem App.xaml.cs an den folgenden Code an:
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 enthalten hat, sollten Sie diese Logik zur neuen Version der Datei migrieren.
Fügen Sie dann dem Ordner Properties 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
}
}
}
Anwendungseinstiegspunkt
.NET MAUI-Apps verfügen über einen einzigen plattformübergreifenden App-Einstiegspunkt. Jeder Plattform-Einstiegspunkt ruft eine CreateMauiApp
-Methode der statischen MauiProgram
-Klasse auf und gibt ein MauiApp zurück.
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 finden Sie in der Datei MainPage.xaml.cs den App
-Verweis in builder.UseMauiApp<App>()
.
Wenn plattformspezifische Dienste vorhanden sind, die zu .NET MAUI migriert werden müssen, verwenden Sie die AddTransient(IServiceCollection, Type)-Methode, um der angegebenen IServiceCollection-Schnittstelle einen vorübergehenden Dienst des angegebenen Typs hinzuzufügen.
Hinweis
Sie können Ihre Xamarin.Forms
-Namespaces schnell auf Microsoft.Maui
aktualisieren, indem Sie Schnelle Aktionen in Visual Studio verwenden, vorausgesetzt, Sie haben Upgrade-Assistent installiert.
AssemblyInfo-Änderungen
Eigenschaften, die normalerweise in einer AssemblyInfo.cs-Datei festgelegt werden, sind jetzt in Ihrem SDK-Projekt verfügbar. Wir empfehlen, sie in jedem Projekt von AssemblyInfo.cs in Ihre Projektdatei zu migrieren und die Datei AssemblyInfo.cs zu entfernen.
Optional können Sie die Datei AssemblyInfo.cs behalten und die Eigenschaft GenerateAssemblyInfo
in Ihrer Projektdatei auf false
setzen:
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
Für weitere Informationen über die GenerateAssemblyInfo
-Eigenschaft, siehe GenerateAssemblyInfo.
Aktualisieren von App-Abhängigkeiten
Im Allgemeinen sind Xamarin.Forms NuGet-Pakete nicht mit .NET 8 kompatibel, es sei denn, sie wurden unter Verwendung von .NET-Ziel-Framework-Monikern (TFMs) neu kompiliert. Android-Apps können jedoch NuGet-Pakete verwenden, die auf die monoandroid
- und monoandroidXX.X
-Frameworks abzielen.
Sie können sich vergewissern, dass ein Paket mit .NET 8 kompatibel ist, indem Sie auf der Registerkarte Frameworks in NuGet nachsehen, ob eines der in der folgenden Tabelle aufgeführten kompatiblen Frameworks vorhanden ist:
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
.NET Standardbibliotheken, die keine Abhängigkeiten von den oben aufgeführten inkompatiblen Frameworks haben, sind weiterhin mit .NET 8 kompatibel.
Wenn ein Paket auf NuGet die Kompatibilität mit einem der oben aufgeführten kompatiblen Frameworks angibt, unabhängig davon, ob es auch inkompatible Frameworks enthält, ist das Paket kompatibel. Kompatible NuGet-Pakete können mithilfe des NuGet-Paketmanagers in Visual Studio zu Ihrem .NET MAUI-Bibliotheksprojekt hinzugefügt werden.
Wenn Sie eine .NET 8-kompatible Version eines NuGet-Pakets nicht finden können, sollten Sie:
- Kompilieren Sie das Paket mit .NET TFMs, wenn Sie den Code besitzen.
- Suchen Sie nach einer Vorschauversion einer .NET 8-Version des Pakets.
- Ersetzen Sie die Abhängigkeit durch eine .NET 8-kompatible Alternative.
Kompilieren und Problembehandlung
Sobald die Abhängigkeiten aufgelöst sind, sollten Sie Ihr Projekt erstellen. Alle Fehler führen Sie zu den nächsten Schritten.
Tipp
- Löschen Sie alle bin- und obj-Ordner aus allen Projekten, bevor Sie Projekte in Visual Studio öffnen und erstellen, insbesondere beim Wechsel der .NET-Version.
- Löschen Sie die generierte Datei Resource.designer.cs aus dem Android-Projekt.
Die folgende Tabelle enthält Anleitungen zur Behebung häufiger Build- oder Laufzeitprobleme:
Abgang | Tipp |
---|---|
Xamarin.* Namespace ist nicht vorhanden. |
Aktualisieren Sie den Namespace auf das .NET MAUI-Äquivalent. Weitere Informationen finden Sie unter Namespace-Änderungen. |
API ist nicht vorhanden. | Aktualisieren Sie die API-Verwendung auf das .NET MAUI-Äquivalent. Weitere Informationen finden Sie unter API-Änderungen. |
Die App wird nicht bereitgestellt. | Stellen Sie sicher, dass das erforderliche Plattformprojekt für die Bereitstellung im Configuration Manager von Visual Studio festgelegt ist. |
Die App wird nicht gestartet. | Aktualisieren Sie die Einstiegspunktklasse jedes Plattformprojekts und den App-Einstiegspunkt. Weitere Informationen finden Sie unter Bootstrappen Ihrer migrierten App. |
CollectionView führt keinen Bildlauf durch. | Überprüfen Sie das Layout des Containers und die gemessene Größe des CollectionView. Standardmäßig nimmt das Steuerelement so viel Platz ein, wie der Container zulässt. Ein Grid schränkt ungeordnete Elemente auf seine eigene Größe ein. Ein StackLayout ermöglicht es ungeordneten Elementen jedoch, über seine Grenzen hinaus Raum einzunehmen. |
Popup wird unter der Seite unter iOS angezeigt. | In Xamarin.Forms sind alle Pop-ups auf iOS UIWindow -Instanzen, aber in .NET werden MAUI-Pop-ups angezeigt, indem die aktuelle Darstellung ViewController gefunden und das Pop-up mit PresentViewControllerAsync angezeigt wird. In Plugins wie Mopups sollten Sie DisplayAlert, DisplayActionSheet oder DisplayPromptAsync aus dem ContentPage aufrufen, das innerhalb des Mopup -Popups verwendet wird, um sicherzustellen, dass Ihre Pop-ups korrekt angezeigt werden. |
BoxView nicht angezeigt. | Die Standardgröße eines BoxView in Xamarin.Forms ist 40x40. Die Standardgröße einer BoxView in .NET MAUI ist 0x0. Setzen Sie WidthRequest und HeightRequest auf 40. |
Beim Layout fehlen Padding, Margin oder Abstand. | Fügen Sie Ihrem Projekt Standardwerte auf der Grundlage der .NET MAUI-Stilressource hinzu. Weitere Informationen finden Sie unter Standardwertänderungen von Xamarin.Forms. |
Benutzerdefiniertes Layout funktioniert nicht. | Benutzerdefinierter Layoutcode muss aktualisiert werden, um in .NET MAUI zu funktionieren. Weitere Informationen finden Sie unter Benutzerdefinierte Layoutänderungen. |
Benutzerdefinierter Renderer funktioniert nicht. | Der Renderer-Code muss aktualisiert werden, damit er in .NET MAUI funktioniert. Weitere Informationen finden Sie unter Verwenden von benutzerdefinierten Renderern in .NET MAUI. |
Effekt funktioniert nicht. | Effektcode muss aktualisiert werden, um in .NET MAUI zu funktionieren. Weitere Informationen finden Sie unter Verwenden von Effekten in .NET MAUI. |
SkiaSharp-Code funktioniert nicht. | SkiaSharp-Code benötigt kleinere Updates, um in .NET MAUI zu funktionieren. Weitere Informationen finden Sie unter Wiederverwenden von SkiaSharp-Code in .NET MAUI. |
Auf zuvor erstellte App-Eigenschaftendaten kann nicht zugegriffen werden. | Migrieren Sie die Daten der Appseigenschaften in die .NET MAUI-Einstellungen. Weitere Informationen finden Sie unter Migrieren von Daten aus dem Xamarin.Forms App-Eigenschaften-Wörterbuch in .NET MAUI-Einstellungen. |
Der Zugriff auf zuvor erstellte sichere Speicherdaten ist nicht möglich. | Migrieren Sie die Daten des sicheren Speichers nach .NET MAUI. Weitere Informationen finden Sie unter Migrieren von Xamarin.Essentials sicherem Speicher zu .NET MAUI secure storage. |
Auf zuvor erstellte Versionsverfolgungsdaten kann nicht zugegriffen werden. | Migrieren Sie die Versionsverfolgungsdaten zu .NET MAUI. Weitere Informationen finden Sie unter Migrieren von Versionsverfolgungsdaten von einer Xamarin.Forms App zu einer .NET MAUI App. |