Histórico da Página
Criando uma Nova Solução
Visão geral
Para migrar o aplicativo Xamarin.Forms, crie uma nova solução MAUI.
Informações |
---|
Você deve certificar-se de que o novo nome da solução corresponda ao namespace raiz do aplicativo existente. Isso garantirá o mínimo de conflito possível ao importar os componentes existentes. |
Linha de Comando
Em um terminal, execute o seguinte comando para gerar um novo MAUI App:
dotnet new maui -n TotvsApp
Visual Studio 2022
Criar um novo projeto com o modelo padrão .NET MAUI App.
Navegando na Solução
A nova solução será criada e conterá um arquivo TotvsApp
.sln
que pode ser aberto com o Visual Studio 2022 no Windows ou Mac.
A solução recém-gerada conterá um aplicativo MAUI simples. Os projetos MAUI têm uma nova estrutura, consolidando todos os projetos específicos de plataforma em um único projeto. Eles foram movidos para a pasta Platforms
. Ainda é possível escrever código iOS, Android ou Windows e configurações específicas para cada plataforma nesta pasta. Em Resources
conterá outros arquivos necessários para o aplicativo, como imagens, fontes, arquivos de banco de dados etc.
Compatibilidade entre Plataformas
Para evitar erros de compilação, remova as plataformas que não são compatíveis com os pacotes do seu Aplicativo no arquivo de projeto (.csproj):
Informações |
---|
<TargetFrameworks>net6.0-android;net6.0-ios;
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">14.2</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
|
Migrando XAML e Códigos Existentes
O primeiro passo é trazer o XAML e o código-fonte do aplicativo existente no Xamarin.Forms.Abaixo está uma lista de todos os arquivos e pastas que foram migrados.
Informações |
---|
Seria uma boa ideia adicionar o projeto MAUI a um provedor de controle de versão e verificar regularmente as alterações ao longo da migração. Isso facilitará a reversão para alterações anteriores ou a execução de algumas tentativas e erros. |
Usando o explorador de arquivos, arraste e solte o conteúdo necessário do projeto existente para a pasta raiz do seu novo projeto MAUI. O conteúdo ficará semelhante à figura abaixo.
Etapas Principais de Migração de Código do Xamarin.Forms
Substitua as seguintes informações do Xamarin.Forms pelo equivalente Microsoft MAUI:
Valor Antigo
Valor Novo
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
using Xamarin.Forms
using Microsoft.Maui / using Microsoft.Maui.Controls
using Xamarin.Forms.Xaml
using Microsoft.Maui.Controls.Xaml
Rg.Plugins.Popup
Mopups
Plugin.*
Microsoft.Maui.Devices.*
Xamarin.Forms.Device.RuntimePlatform
Microsoft.Maui.Devices.DeviceInfo.Platform
Xamarin.Forms.Device.Platform
Microsoft.Maui.Devices.DevicePlatform
CarouselView.FormsPlugin.Abstractions
Microsoft.Maui.Controls.CarouselView
MasterDetailPage
FlayoutPage
Device.BeginInvokeOnMainThread()
Dispatcher.Dispatch()
Xamarin.Forms.Color
Microsoft.Maui.Graphics.Colors
new Rectangle new Rect Grid.Children.Add(view, 0, 0)
Grid.SetRow((IView)view, 0)
Grid.SetColumn((IView)view, 0)
- Exclua ou comente o conteúdo do arquivo
AssemblyInfo.cs
. As propriedades poderão ser reativadas quando o aplicativo compilar e executar sem erros. A maioria dessas propriedades foram incorporadas como parte do novo .NET MAUI csproj, portanto, verifique quais realmente são necessárias.
Em
MauiProgram.cs
, atualize o objetobuilder
para configurar efeitos (linha 11):Bloco de código language c# theme RDark title Código linenumbers true using CommunityToolkit.Maui; namespace MinhaQualidade; public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder.UseMauiApp<App>() .ConfigureEffects( effects => { }) .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }) return builder.Build(); } }
Etapas de Migração do Xamarin Community Toolkit
- Adicione o pacote
Maui Community Toolkit
no nuget:
Substitua as seguintes informações do Xamarin Community Toolkit pelo equivalente ao MAUI Community Toolkit:
Valor Antigo Valor Novo xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
xmlns:mct="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xct:
mct:
using Xamarin.CommunityToolkit.UI.Views;
using CommunityToolkit.Maui.Views;
using Xamarin.CommunityToolkit.Extensions;
Substituir por uma string vazia Navigation.ShowPopup
this.ShowPopup
xct:IsNullOrEmptyConverter
mct:IsStringNullOrEmptyConverter
xct:ListIsNullOrEmptyConverter
mct:IsListNullOrEmptyConverter
xct:ListIsNotNullOrEmptyConverter
mct:IsListNotNullOrEmptyConverter
Em
MauiProgram.cs
, atualize seu construtor para usar oMaui Community Toolkit (linha 15)
.Bloco de código language c# theme RDark title Código linenumbers true using CommunityToolkit.Maui; namespace MinhaQualidade; public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder.UseMauiApp<App>() .ConfigureEffects( effects => { }) .UseMauiCommunityToolkit() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }) return builder.Build(); } }
Adicionando o Pacote do SQLite
- Adicione o pacote
sqlite-net-pcl
e suas dependências:
Lista de pacotes após inseridos:
Bloco de código language xml theme RDark title Código <PackageReference Include="sqlite-net-pcl" Version="1.8.116" /> <PackageReference Include="SQLitePCLRaw.bundle_green" Version="2.1.2" /> <PackageReference Include="SQLitePCLRaw.core" Version="2.1.2" /> <PackageReference Include="SQLitePCLRaw.provider.dynamic_cdecl" Version="2.1.2" /> <PackageReference Include="SQLitePCLRaw.provider.sqlite3" Version="2.1.2" />
No iOS é necessário definir o provedor do SQLite no arquivo
AppDelegate.cs:
Bloco de código language c# theme RDark title Código protected override MauiApp CreateMauiApp() { raw.SetProvider(new SQLite3Provider_sqlite3()); return MauiProgram.CreateMauiApp(); }
Adicionando o Pacote do Firebase
Adicione o pacote Plugin.Firebase ( >= 1.2.0) no nuget. Depois os arquivos
GoogleService-Info.plist
egoogle-services.json
à pasta raiz do projeto e inclua-os no arquivo .csproj dessa forma:Bloco de código language xml theme RDark title Código <ItemGroup Condition="'$(TargetFramework)' == 'net6.0-android'"> <GoogleServicesJson Include="google-services.json" /> </ItemGroup> <ItemGroup Condition="'$(TargetFramework)' == 'net6.0-ios'"> <BundleResource Include="GoogleService-Info.plist" /> </ItemGroup>
Coloque a chamada de inicialização no arquivo
MauiProgram.cs (linha 15)
:Bloco de código language c# theme RDark title Código linenumbers true #if IOS using Plugin.Firebase.iOS; #else using Plugin.Firebase.Android; #endif public static class MauiProgram { public static MauiApp CreateMauiApp() { return MauiApp .CreateBuilder() .UseMauiApp<App>() ... .RegisterFirebaseServices() .Build(); } private static MauiAppBuilder RegisterFirebaseServices(this MauiAppBuilder builder) { builder.ConfigureLifecycleEvents(events => { #if IOS events.AddiOS(iOS => iOS.FinishedLaunching((app, launchOptions) => { CrossFirebase.Initialize(app, launchOptions, CreateCrossFirebaseSettings()); return false; })); #else events.AddAndroid(android => android.OnCreate((activity, state) => CrossFirebase.Initialize(activity, state, CreateCrossFirebaseSettings()))); #endif }); builder.Services.AddSingleton(_ => CrossFirebaseAuth.Current); return builder; } private static CrossFirebaseSettings CreateCrossFirebaseSettings() { return new CrossFirebaseSettings(isAuthEnabled: true); } }
Adicione o seguinte
ItemGroup
ao arquivo.csproj
para evitar erros de compilação:Bloco de código language xml theme RDark title Código <ItemGroup Condition="'$(TargetFramework)' == 'net6.0-android'"> <PackageReference Include="Xamarin.Kotlin.StdLib.Jdk7" Version="1.7.10" ExcludeAssets="build;buildTransitive" /> <PackageReference Include="Xamarin.Kotlin.StdLib.Jdk8" Version="1.7.10" ExcludeAssets="build;buildTransitive" /> </ItemGroup>
Migrando Arquivos de Fonte
O registro de fontes foi simplificado no Microsoft MAUI.
- Copie as fontes do aplicativo Xamarin.Forms existente para a pasta
Resources\Fonts
em seu projeto MAUI.
- Certifique-se de que a propriedade "Build Action" esteja definida como MauiFont:
Atualize o arquivo
MauiProgram.cs
para incluir as fontes migradas:Bloco de código language c# theme RDark title Código public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder.UseMauiApp<App>() .ConfigureEffects( effects => { }) .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); fonts.AddFont("NunitoSans-Bold.ttf", "NunitoSansBold"); fonts.AddFont("NunitoSans-ExtraLight.ttf", "NunitoSansExtraLight"); fonts.AddFont("NunitoSans-Regular.ttf", "NunitoSansRegular"); fonts.AddFont("Nunito-SemiBold.ttf", "NunitoSemiBold"); }) .UseMauiCommunityToolkit(); return builder.Build(); } }
Migrando Imagens
O registro de fontes foi simplificado no Microsoft MAUI.
- Copie as fontes do aplicativo Xamarin.Forms existente para a pasta
Resources\Images
em seu projeto MAUI.
- Certifique-se de que a propriedade "Build Action" esteja definida como MauiImage:
Controles Personalizados
O .NET MAUI Entry é um controle de entrada de texto, que implementa a interface IEntry. No iOS, o EntryHandler mapeia o Entry para o controle nativo UITextField. No Android, o Entry é mapeado para um AppCompatEditText, e no Windows o Entry é mapeado para um TextBox, como é mostrado na figura abaixo:
O mapeador de propriedades do Entry, na classe EntryHandler, mapeia as propriedades de controle multiplataforma para a API de visualização nativa. Isso garante que, quando uma propriedade for definida em um Entry, a exibição nativa seja atualizada conforme necessário.
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
void ModifyEntry() { Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("MyCustomization", (handler, view) => { #if ANDROID handler.PlatformView.SetBackgroundColor(Colors.Transparent.ToPlatform()); #elif IOS handler.PlatformView.BorderStyle = UIKit.UITextBorderStyle.None; #elif WINDOWS handler.PlatformView.FontWeight = Microsoft.UI.Text.FontWeights.Thin; #endif }); } |
Reutilizando um Controle Customizado do Xamarin.Forms
- Crie um arquivo correspondente ao controle na pasta de sua plataforma:
Altere os namesapces correspondentes e remova o assembly ExportRenderer:
Bloco de código language c# theme RDark title Exemplo using Android.Content; using Microsoft.Maui.Controls.Handlers.Compatibility; using Microsoft.Maui.Controls.Platform.Compatibility; //[assembly: ExportRenderer(typeof(Shell), typeof(RMSBadgeShellRenderer))] namespace MinhaQualidade.Android.Renderers { public class RMSBadgeShellRenderer : ShellRenderer { public RMSBadgeShellRenderer(Context context) : base(context) { } protected override IShellItemRenderer CreateShellItemRenderer(ShellItem shellItem) => new RMSBadgeShellItemRenderer(this); } }
Inclua o trecho de código a seguir no arquivo MauiProgram.cs (linha 13):
Bloco de código language c# theme RDark title Código linenumbers true using CommunityToolkit.Maui; using Microsoft.Maui.Controls.Compatibility.Hosting; using MinhaQualidade.Android.Renderers; namespace MinhaQualidade; public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder.UseMauiApp<App>() .ConfigureMauiHandlers(handlers => { handlers.AddCompatibilityRenderer(typeof(Shell), typeof(RMSBadgeShellRenderer)); }) .ConfigureEffects(effects => { }) .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); fonts.AddFont("NunitoSans-Bold.ttf", "NunitoSansBold"); fonts.AddFont("NunitoSans-ExtraLight.ttf", "NunitoSansExtraLight"); fonts.AddFont("NunitoSans-Regular.ttf", "NunitoSansRegular"); fonts.AddFont("Nunito-SemiBold.ttf", "NunitoSemiBold"); }) .UseMauiCommunityToolkit(); return builder.Build(); } }