Segmente várias plataformas a partir de um único projeto .NET MAUI

O projeto único .NET Multi-platform App UI (.NET MAUI) pega as experiências de desenvolvimento específicas da plataforma que você normalmente encontra ao desenvolver aplicativos e as abstrai em um único projeto compartilhado que pode ter como alvo Android, iOS, macOS e Windows.

O projeto único do .NET MAUI fornece uma experiência de desenvolvimento multiplataforma simplificada e consistente, independentemente das plataformas que estão sendo direcionadas. O projeto único do .NET MAUI fornece os seguintes recursos:

  • Um único projeto compartilhado que pode ter como alvo Android, iOS, macOS, Tizen e Windows.
  • Uma seleção de destino de depuração simplificada para executar seus aplicativos .NET MAUI.
  • Arquivos de recursos compartilhados dentro de um único projeto.
  • Um único manifesto de aplicativo que especifica o título, a ID e a versão do aplicativo.
  • Acesso a APIs e ferramentas específicas da plataforma quando necessário.
  • Um único ponto de entrada de aplicativo multiplataforma.

O projeto único do .NET MAUI é habilitado usando multidirecionamento e o uso de projetos no estilo SDK.

Arquivos de recurso

O gerenciamento de recursos para o desenvolvimento de aplicativos entre plataformas tem sido tradicionalmente problemático, porque cada plataforma tem sua própria abordagem para gerenciar recursos. Por exemplo, cada plataforma tem requisitos de imagem diferentes que normalmente envolvem a criação de várias versões de cada imagem em resoluções diferentes. Portanto, uma única imagem normalmente precisa ser duplicada várias vezes em resoluções diferentes, com as imagens resultantes tendo que usar diferentes convenções de nome de arquivo e pasta em cada plataforma.

O projeto único do .NET MAUI permite que os arquivos de recursos sejam armazenados em um único local enquanto são consumidos em cada plataforma. Isso inclui fontes, imagens, o ícone do aplicativo, a tela inicial, ativos brutos e arquivos CSS para estilizar aplicativos .NET MAUI. Cada arquivo de recurso de imagem é usado como uma imagem de origem, a partir da qual imagens das resoluções necessárias são geradas para cada plataforma em tempo de compilação.

Observação

Os Catálogos de Ativos do iOS não têm suporte no momento em projetos únicos do .NET MAUI.

Os arquivos de recursos normalmente devem ser colocados na pasta Recursos do seu projeto de aplicativo .NET MAUI ou em pastas filho da pasta Recursos e devem ter sua ação de compilação definida corretamente. A tabela a seguir mostra as ações de compilação para cada tipo de arquivo de recurso:

Recurso Ação de build
Ícone do aplicativo MauiIcon
Fontes MauiFont
Imagens MauiImage
Tela inicial MauiSplashScreen
Ativos brutos MauiAsset
Arquivos CSS MauiCss

Observação

Os arquivos XAML também são armazenados em seu projeto de aplicativo .NET MAUI e recebem automaticamente a ação de compilação MauiXaml quando criados por modelos de projeto e item. No entanto, apenas dicionários de recursos XAML normalmente serão colocados na pasta Recursos do projeto do aplicativo.

Quando um arquivo de recurso é adicionado a um projeto de aplicativo .NET MAUI, uma entrada correspondente para o recurso é criada no arquivo de projeto, com exceção dos arquivos CSS. A captura de tela a seguir mostra uma pasta Recursos típica contendo pastas filho para cada tipo de recurso:

Image and font resources screenshot.

A ação de compilação para um arquivo de recurso será definida corretamente, se o recurso tiver sido adicionado à pasta filho Recursos correta.

As pastas filho da pasta Recursos podem ser designadas para cada tipo de recurso editando o arquivo de projeto do seu aplicativo:

<ItemGroup>
    <!-- Images -->
    <MauiImage Include="Resources\Images\*" />

    <!-- Fonts -->
    <MauiFont Include="Resources\Fonts\*" />

    <!-- Raw assets -->
    <MauiAsset Include="Resources\Raw\*" />
</ItemGroup>

O caractere curinga (*) indica que todos os arquivos dentro da pasta serão tratados como sendo do tipo de recurso especificado. Além disso, é possível incluir todos os arquivos de pastas filhas:

<ItemGroup>
    <!-- Images -->
    <MauiImage Include="Resources\Images\**\*" />
</ItemGroup>

Neste exemplo, o caractere curinga duplo ('**') especifica que a pasta Imagens pode conter pastas filhas. Portanto, especifica que todos os arquivos na pasta Resources\Images, ou quaisquer pastas filhas da pasta Images, <MauiImage Include="Resources\Images\**\*" /> serão usados como imagens de origem a partir das quais imagens da resolução necessária são geradas para cada plataforma.

Os recursos específicos da plataforma substituirão suas contrapartes de recursos compartilhados. Por exemplo, se você tiver uma imagem específica do Android localizada em Platforms\Android\Resources\drawable-xhdpi\logo.png e também fornecer uma imagem compartilhada Resources\Images\logo.svg o arquivo SVG (Scalable Vector Graphics) será usado para gerar as imagens necessárias do Android, exceto para a imagem XHDPI que já existe como uma imagem específica da plataforma.

Ícones de aplicativos

Um ícone de aplicativo pode ser adicionado ao seu projeto de aplicativo arrastando uma imagem para a pasta Resources\AppIcon do projeto, onde sua ação de compilação será definida automaticamente como MauiIcon. Isso cria uma entrada correspondente no arquivo de projeto:

<MauiIcon Include="Resources\AppIcon\appicon.svg" />

No momento da compilação, o ícone do aplicativo será redimensionado para os tamanhos corretos para a plataforma e o dispositivo de destino. Os ícones de aplicativo redimensionados são adicionados ao pacote do aplicativo. Os ícones de aplicativos são redimensionados para várias resoluções porque têm vários usos, incluindo ser usados para representar o aplicativo no dispositivo e na loja de aplicativos.

Para obter mais informações, consulte Adicionar um ícone de aplicativo a um projeto de aplicativo .NET MAUI.

Imagens

Uma imagem pode ser adicionada ao seu projeto de aplicativo arrastando-a para a pasta Resources\Images do projeto, onde sua ação de compilação será definida automaticamente como MauiImage. Isso cria uma entrada correspondente no arquivo de projeto:

<MauiImage Include="Resources\Images\logo.svg" />

Em tempo de compilação, as imagens podem ser redimensionadas para as resoluções corretas para a plataforma e o dispositivo de destino. As imagens resultantes são adicionadas ao pacote do aplicativo.

Para obter mais informações, consulte Adicionar imagens a um projeto de aplicativo .NET MAUI.

Fontes

Uma fonte de formato de tipo verdadeiro (TTF) ou fonte de tipo aberto (OTF) pode ser adicionada ao seu projeto de aplicativo arrastando-a para a pasta Resources\Fonts do seu projeto, onde sua ação de compilação será definida automaticamente como MauiFont. Isso cria uma entrada correspondente por fonte no arquivo de projeto:

<MauiFont Include="Resources\Fonts\OpenSans-Regular.ttf" />

No momento da compilação, as fontes são copiadas para o pacote do aplicativo.

Para obter mais informações, consulte Fontes.

Tela inicial

Uma tela inicial pode ser adicionada ao seu projeto de aplicativo arrastando uma imagem para a pasta Resources\Splash do projeto, onde sua ação de compilação será definida automaticamente como MauiSplashScreen. Isso cria uma entrada correspondente no arquivo de projeto:

<ItemGroup>
  <MauiSplashScreen Include="Resources\Splash\splashscreen.svg" />
</ItemGroup>

Em tempo de compilação, a imagem da tela inicial é redimensionada para o tamanho correto para a plataforma e o dispositivo de destino. A tela inicial redimensionada é adicionada ao pacote do aplicativo.

Para obter mais informações, consulte Adicionar uma tela inicial a um projeto de aplicativo .NET MAUI.

Ativos brutos

Um arquivo de ativo bruto, como HTML, JSON e vídeo, pode ser adicionado ao seu projeto de aplicativo arrastando-o para a pasta Resources\Raw do seu projeto, onde sua ação de compilação será definida automaticamente como MauiAsset. Isso cria uma entrada correspondente por ativo no arquivo de projeto:

<MauiAsset Include="Resources\Raw\index.html" />

Os ativos brutos podem então ser consumidos pelos controles, conforme necessário:

<WebView Source="index.html" />

Em tempo de compilação, os ativos brutos são copiados para o pacote do aplicativo. Para obter informações sobre como desabilitar o empacotamento de ativos, consulte Desabilitar o empacotamento de arquivos de ativos.

Arquivos CSS

Os aplicativos .NET MAUI podem ser parcialmente estilizados com arquivos CSS (Folha de Estilos em Cascata). Os arquivos CSS podem ser adicionados ao seu projeto de aplicativo arrastando-os para qualquer pasta do projeto e definindo sua ação de compilação na MauiCssjanela Propriedades .

Os arquivos CSS devem ser carregados pela StyleSheet classe antes de serem adicionados a um ResourceDictionary:

<Application ...>
    <Application.Resources>
        <StyleSheet Source="/Resources/styles.css" />
    </Application.Resources>
</Application>

Para obter mais informações, consulte Estilizar aplicativos com CSS.

Manifesto de aplicativo

Cada plataforma usa seu próprio arquivo de manifesto de aplicativo nativo para especificar informações como o título do aplicativo, ID, versão e muito mais. O projeto único do .NET MAUI permite que você especifique esses dados comuns do aplicativo em um único local no arquivo de projeto.

Para especificar os dados de manifesto do aplicativo compartilhado para um projeto, abra o menu de atalho do projeto no Gerenciador de Soluções e escolha Propriedades. O título, a ID e a versão do aplicativo podem ser especificados no MAUI Shared > General:

.NET MAUI app manifest screenshot.

No momento da compilação, os dados de manifesto do aplicativo compartilhado são mesclados com dados específicos da plataforma no arquivo de manifesto do aplicativo nativo para produzir o arquivo de manifesto para o pacote do aplicativo. Para obter mais informações, consulte Configuração do projeto no .NET MAUI - MAUI Shared.

Código específico da plataforma

Um projeto de aplicativo .NET MAUI contém uma pasta Plataformas, com cada pasta filho representando uma plataforma que o .NET MAUI pode segmentar:

Platform folders screenshot.

As pastas de cada plataforma contêm recursos específicos da plataforma e o código que inicia o aplicativo em cada plataforma:

Platform-specific code screenshot.

No momento da compilação, o sistema de compilação inclui apenas o código de cada pasta ao compilar para essa plataforma específica. Por exemplo, quando você cria para Android, os arquivos na pasta Platforms\Android serão incorporados ao pacote do aplicativo, mas os arquivos nas outras pastas Platforms não serão. Essa abordagem usa multidirecionamento para segmentar várias plataformas de um único projeto. A multisegmentação pode ser combinada com classes parciais e métodos parciais para invocar a funcionalidade de plataforma nativa a partir de código de plataforma cruzada. Para obter mais informações, consulte Invocar código de plataforma.

Além dessa abordagem padrão de multisegmentação, os aplicativos .NET MAUI também podem ser multisegmentados com base em seus próprios critérios de nome de arquivo e pasta. Isso permite que você estruture seu projeto de aplicativo .NET MAUI para que você não precise colocar o código da plataforma em pastas filho da pasta Plataformas . Para obter mais informações, consulte Configurar multisegmentação.

A multisegmentação também pode ser combinada com a compilação condicional para que o código seja direcionado para plataformas específicas:

#if ANDROID
                  handler.NativeView.SetBackgroundColor(Colors.Red.ToNative());
#elif IOS
                  handler.NativeView.BackgroundColor = Colors.Red.ToNative();
                  handler.NativeView.BorderStyle = UIKit.UITextBorderStyle.Line;
#elif WINDOWS
                  handler.NativeView.Background = Colors.Red.ToNative();
#endif

Para obter mais informações sobre compilação condicional, consulte Compilação condicional.

Ponto de entrada do aplicativo

Enquanto as pastas Plataformas contêm código específico da plataforma que inicia o aplicativo em cada plataforma, os aplicativos .NET MAUI têm um único ponto de entrada de aplicativo entre plataformas. Cada ponto de entrada de plataforma chama um método na classe estática MauiProgram em seu projeto de aplicativo e retorna um CreateMauiAppMauiApp, que é o ponto de entrada para seu aplicativo.

A MauiProgram classe deve, no mínimo, fornecer um aplicativo para executar:

namespace MyMauiApp;

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

        return builder.Build();
    }
}  

A App classe deriva da Application classe:

namespace MyMauiApp;

public class App : Application
{
    public App()
    {
        InitializeComponent();

        MainPage = new AppShell();
    }
}

No exemplo anterior, a MainPage propriedade é definida como o AppShell objeto. AppShell é uma classe subclassificada Shell que descreve a hierarquia visual do aplicativo. Para obter mais informações, consulte Criar um aplicativo .NET MAUI Shell.