Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Não é necessário reescrever os aplicativos Xamarin.Forms para migra-los para o .NET MAUI. No entanto, será preciso fazer algumas alterações de código em cada aplicativo. Da mesma forma, é possível utilizar os recursos de projeto único sem mesclar todos os projetos do Xamarin.Forms em um projeto. Para iniciar a migração, siga os seguintes passos:

  • Passo 1
  • Passo 2
  • Passo 3
  • Passo 4

...

titleTeste

...

titleTeste2

Exibir filhos

...

Migrando XAML e Códigos Existentes

...

Image Removed

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.

Image Removed

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

...

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 objeto builder para configurar efeitos (linha 11):

    Bloco de código
    languagec#
    themeRDark
    titleCódigo
    linenumberstrue
    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: 

       Image Removed

Substitua as seguintes informações do Xamarin Community Toolkit pelo equivalente ao MAUI Community Toolkit: 

...

  • Em MauiProgram.cs, atualize seu construtor para usar o Maui Community Toolkit (linha 15).

    Bloco de código
    languagec#
    themeRDark
    titleCódigo
    linenumberstrue
    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: 

        Image Removed

  • Lista de pacotes após inseridos:

    Bloco de código
    languagexml
    themeRDark
    titleCó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
    languagec#
    themeRDark
    titleCó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 e google-services.json à pasta raiz do projeto e inclua-os no arquivo .csproj dessa forma:

    Bloco de código
    languagexml
    themeRDark
    titleCó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
    languagec#
    themeRDark
    titleCódigo
    linenumberstrue
    #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
    languagexml
    themeRDark
    titleCó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. 

Image Removed

  • Certifique-se de que a propriedade "Build Action" esteja definida como MauiFont:

Image Removed

  • Atualize o arquivo MauiProgram.cs para incluir as fontes migradas:

    Bloco de código
    languagec#
    themeRDark
    titleCó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.

Image Removed

  • Certifique-se de que a propriedade "Build Action" esteja definida como MauiImage:

Image Removed

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:

Image Removed

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
languagec#
themeRDark
titleExemplo
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:

Image Removed

  • Altere os namesapces correspondentes e remova o assembly ExportRenderer:

    Bloco de código
    languagec#
    themeRDark
    titleExemplo
    using Android.Content;
    using Microsoft.Maui.Controls.Compatibility.Platform.Android;
    using Microsoft.Maui.Controls.Platform;
    
    //[assembly: ExportRenderer(typeof(RMSCustomEntry), typeof(RMSCustomEntryRenderer))]
    namespace RMLib.Android.Renderers
    {
        public class RMSCustomEntryRenderer : EntryRenderer
        {
            public RMSCustomEntryRenderer(Context context) : base(context)
            {
            }
    
            protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
            {
                base.OnElementChanged(e);
                Control?.SetBackgroundColor(global::Android.Graphics.Color.Transparent);
            }
        }
    }

Inclua o trecho de código a seguir no arquivo MauiProgram.cs (linha 13-19): 

...

languagec#
themeRDark
titleCódigo
linenumberstrue

...