Novidades no .NET MAUI para .NET 8
O foco do .NET MAUI no .NET 8 é a qualidade. No .NET 8, foram mesclados 1618 pull requests que encerraram 689 problemas. Isso inclui alterações da equipe do .NET MAUI, bem como da comunidade do .NET MAUI. Essas alterações devem resultar em um aumento significativo na qualidade no .NET 8.
Importante
Devido ao trabalho com dependências externas subjacentes, como Xcode ou Android SDK Tools, a política de suporte da .NET Multi-Platform App UI (.NET MAUI) difere da política de suporte do .NET e do .NET Core. Para obter mais informações, consulte a política de suporte do .NET MAUI.
No .NET 8, o .NET MAUI é fornecido como uma carga de trabalho .NET e vários pacotes NuGet. A vantagem dessa abordagem é que ela permite que fixar facilmente seus projetos em versões específicas, além de visualizar facilmente builds não lançados ou experimentais. Quando você cria um novo projeto .NET MAUI, os pacotes NuGet necessários são adicionados automaticamente ao projeto.
Este artigo lista os novos recursos do .NET MAUI para .NET 8 e fornece links para informações mais detalhadas sobre cada um deles.
Para obter informações sobre as novidades no .NET 8, confira Novidades no .NET 8.
Novas funcionalidades
Embora o foco desta versão do .NET MAUI seja a qualidade, há também algumas novas funcionalidades que permitem novos cenários em seus aplicativos.
Controls
- Controles que dão suporte a métodos de extensão de ganho de entrada de texto que dão suporte à ocultação e exibição do teclado de entrada reversível. Para obter mais informações, confira Ocultar e mostrar o teclado de entrada reversível.
- A classe ContentPage obtém uma propriedade HideSoftInputOnTapped, que indica se tocar em qualquer lugar na página fará com que o teclado de entrada reversível seja ocultado se estiver visível. Para obter mais informações, confira ContentPage.
- BlazorWebView obtém uma propriedade StartPath, um método TryDispatchAsync e recursos de log aprimorados. Para obter mais informações, confira Hospedar um aplicativo Web do Blazor em um aplicativo do .NET MAUI usando BlazorWebView.
- WebView obtém uma propriedade UserAgent. Para obter mais informações, confira WebView.
- A reprodução de mídia embutida do vídeo HTML5, incluindo reprodução automática e imagem na imagem, foi habilitada por padrão para o WebView no iOS. Para obter mais informações, confira Definir preferências de reprodução de mídia no iOS e no Mac Catalyst.
- A sobrecarga
Grid.Add
que aceita 5 argumentos foi adicionada novamente ao .NET MAUI. No entanto, este método foi preterido e só está presente para ajudar as migrações do Xamarin.Forms. - Grid obtém um método de extensão AddWithSpan que adiciona uma exibição ao Grid na linha e coluna especificadas com os intervalos de linha e coluna especificados.
Área de trabalho
- Itens da barra de menus e itens de menu de contexto podem ser invocados por meio de atalhos de teclado conhecidos como aceleradores de teclado. Para obter mais informações, confira Aceleradores de teclado.
- Os aplicativos do Windows podem ser publicados como aplicativos não empacotados. Para obter mais informações, confira Publicar um aplicativo do .NET MAUI não empacotado para Windows com a CLI.
Reconhecedores de gestos
- PointerGestureRecognizer ganha propriedades PointerPressedCommand, PointerPressedCommandParameter, PointerReleasedCommand e PointerReleasedCommandParameter e eventos PointerPressed e PointerReleased. Para obter mais informações, confira Reconhecer um gesto de ponteiro.
- O objeto PointerEventArgs que acompanha os eventos de ponteiro gerados pela classe PointerGestureRecognizer obtém uma propriedade PlatformArgs do tipo PlatformPointerEventArgs. Esta propriedade fornece acesso aos argumentos específicos da plataforma para um evento de gesto de ponteiro. Para obter mais informações, confira Reconhecer um gesto de ponteiro.
- Cada um dos objetos DragStartingEventArgs, DragEventArgs, DropEventArgs e DropCompletedEventArgs que acompanham eventos de gesto de arrastar e soltar ganha uma propriedade
PlatformArgs
. Esta propriedade fornece acesso aos argumentos específicos da plataforma para um evento de arrastar ou soltar. Para obter mais informações, confira Reconhecer um gesto de arrastar e soltar. - A posição na qual ocorreu um gesto de arrastar ou soltar pode ser obtida chamando o método GetPosition em um objeto DragEventArgs, DragStartingEventArgs ou DropEventArgs. Para obter mais informações, confira Reconhecer um gesto de arrastar e soltar.
- A classe TapGestureRecognizer obtém a capacidade de lidar com toques secundários no Android. Para obter mais informações, confira Reconhecer um gesto de toque.
Navegação
- A navegação do Shell obtém uma sobrecarga GoToAsync que permite passar dados de navegação de uso único, que são desmarcados após a navegação ter ocorrido, como um objeto ShellNavigationQueryParameters. Para obter mais informações, confira Passar dados de navegação baseados em objeto de uso único.
Integração de plataforma
- A classe Geolocation pode escutar alterações de localização quando os aplicativos estão em primeiro plano. Para obter mais informações, confira Escutar alterações de localização.
- Flashlight obtém um método IsSupportedAsync que determina se há uma lanterna disponível no dispositivo. Para obter mais informações, confira Lanterna.
- SensorSpeed intervalos foram unificados em todas as plataformas. Para obter mais informações, confira Acessar sensores de dispositivo.
- A classe Permissions obtém a permissão Permissions.Bluetooth, que é uma permissão Android 12 para procurar dispositivos Bluetooth, tornando o dispositivo atual detectável para outros dispositivos Bluetooth e comunicando-se com dispositivos Bluetooth já emparelhados. Para obter mais informações, consulte Permissões.
- A classe Permissions obtém a permissão Permissions.NearbyWifiDevices, que é uma permissão do Android 13 para acessar dispositivos WiFi próximos. Para obter mais informações, consulte Permissões.
XAML
- O atributo
x:ClassModifier
pode ser especificado em classes XAML para controlar o nível de acesso de uma classe gerada em um assembly. Para obter mais informações, confira Modificadores de classe. - Os recursos definidos em um ResourceDictionary também podem ser consumidos em um
AppThemeBinding
com a extensão de marcaçãoDynamicResource
. Para obter mais informações, confira Definir e consumir recursos de tema. - Color é o
ContentProperty
da classe SolidColorBrush e, portanto, não precisa ser definido explicitamente a partir de XAML.
Solução de problemas
- Para fins de solução de problemas, a geração de recursos pode ser desabilitada. Para obter mais informações, confira Desabilitar o empacotamento de imagem, Desabilitar o empacotamento de tela inicial, Desabilitar o empacotamento de fontes e Desabilitar o empacotamento de arquivo de ativo.
- Para fins de solução de problemas, uma tela inicial em branco pode ser gerada. Para obter mais informações, confira Gerar uma tela inicial em branco.
- O redimensionador verifica se há nomes de arquivo de imagem duplicados. Para obter mais informações, confira Erros de nome de arquivo de imagem duplicada.
Diversos
- O gerenciamento de janelas pode ser dissociado da classe
App
. Para obter mais informações, confira Desacoplar o gerenciamento de janelas da classe App. - Várias fontes do sistema podem ser facilmente consumidas em aplicativos Android. Para obter mais informações, confira Consumir fontes.
- No iOS,
MauiUIApplicationDelegate
obtém um métodoPerformFetch
que pode ser substituído ou consumido por meio do delegadoiOSLifecycle.PerformFetch
. Para obter mais informações, consulte os eventos de ciclo de vida da plataforma do iOS e Mac Catalyst.
Substituição e remoção de tipo
Os seguintes tipos ou membros foram preteridos:
- ClickGestureRecognizer foi preterido.
- As propriedades anexadas
AutomationProperties.Name
,AutomationProperties.HelpText
eAutomationProperties.LabeledBy
foram preteridas. - O FocusChangeRequested foi preterido. Em vez disso, use o método Focus() para tentar definir o foco na exibição.
Os seguintes tipos ou membros foram removidos:
- A propriedade
Application.Properties
e o métodoApplication.SavePropertiesAsync
foram removidos. Para migrar os dados das propriedades do aplicativo para o .NET MAUI, confira Migrar dados do dicionário de propriedades do aplicativo Xamarin.Forms para as preferências do .NET MAUI. - A propriedade
PhoneDialer.Current
foi removida. UsePhoneDialer.Default
em vez disso. OpenGLView
foi removido.
Alterações de comportamento
O seguinte comportamento foi alterado em relação à versão anterior:
- O uso do controle Map de XAML agora requer a seguinte declaração de namespace
xmlns
:xmlns:maps="http://schemas.microsoft.com/dotnet/2021/maui/maps"
. - O cache de imagem é desabilitado no Android ao carregar uma imagem de um fluxo com o método
ImageSource.FromStream
. Isso ocorre devido à falta de dados para usar para criar uma chave de cache razoável. - No iOS, as páginas rolam automaticamente quando o teclado de entrada reversível cobre um campo de entrada de texto, de modo que o campo permanece acima do teclado de entrada reversível. O método
KeyboardAutoManagerScroll.Disconnect
, no namespaceMicrosoft.Maui.Platform
, pode ser chamado para desabilitar esse comportamento padrão. O métodoKeyboardAutoManagerScroll.Connect
pode ser chamado para reabilitar o comportamento depois de desabilitado. - A forma como a cor de uma guia é definida em um aplicativo Shell foi alterada em algumas plataformas. Para saber mais, confira Aparência da guia.
- Não é necessário especificar um valor para a propriedade de build
$(ApplicationIdGuid)
no arquivo de projeto do aplicativo. Isso ocorre porque os aplicativos do Windows do .NET MAUI não exigem mais um GUID como uma ID de aplicativo e, em vez disso, usam o valor da propriedade de build$(ApplicationId)
como a ID do aplicativo. Portanto, a mesma ID do aplicativo de formato de domínio reverso agora é usada em todas as plataformas, como com.mycompany.myapp. - Os aplicativos Mac Catalyst do .NET MAUI não estão mais limitados a 50 itens de menu na barra de menus.
- O método
PlatformImage.FromStream
, no namespaceMicrosoft.Maui.Graphics
, agora pode ser usado para carregar imagens no Windows em vez de ter que usar a classeW2DImageLoadingService
. - No Android, as animações respeitam as configurações de animação do sistema. Para obter mais informações, confira Animação básica.
Desempenho
Há muitas alterações de desempenho no .NET MAUI 8. Essas alterações podem ser classificadas em cinco áreas:
- Novos recursos
- Desempenho de build e loop interno
- Melhorias no desempenho ou no tamanho do aplicativo
- Structs e
IEquatable
no .NET MAUI - Corrigir problema de desempenho em
{AppThemeBinding}
- Endereço
CA1307
eCA1309
para desempenho - Endereço
CA1311
para desempenho - Remover evento não utilizado
ViewAttachedToWindow
no Android - Remover
System.Reflection
desnecessário para{Binding}
- Usar
StringComparer.Ordinal
paraDictionary
eHashSet
- Reduzir a interoperabilidade Java no
MauiDrawable
no Android - Melhorar o desempenho do layout do
Label
no Android - Reduzir chamadas de interoperabilidade Java para controles no .NET MAUI
- Melhorar o desempenho do
Entry.MaxLength
no Android - Melhorar o uso de memória do
CollectionView
no Windows - Usar
UnmanagedCallersOnlyAttribute
em plataformas da Apple - Interoperabilidade Java mais rápida para cadeias de caracteres no Android
- Interoperabilidade Java mais rápida para eventos em C# no Android
- Usar ponteiros de função para JNI
Xamarin.AndroidX.Legacy.Support.V4
removido- Eliminação de duplicação de genéricos no iOS e no macOS
- Corrigir a implementação de
System.Linq.Expressions
em plataformas semelhantes ao iOS - Definir
DynamicCodeSupport=false
para iOS e Catalyst
- Structs e
- Vazamentos de memória
- Ferramentas e documentação
Para obter mais informações, confira Melhorias de desempenho do .NET 8 no .NET MAUI.
Atualizar do .NET 7 para o .NET 8
Para atualizar seus projetos do .NET 7 para o .NET 8, instale o .NET 8 e a carga de trabalho do .NET MAUI com o Visual Studio 17.8+ ou com o Instalador autônomo e o comando dotnet workload install maui
.
Em seguida, abra o arquivo .csproj e altere os Monikers da Estrutura de Destino (TFMs) de 7 para 8. Se você estiver usando um TFM, como net7.0-ios13.6
, não se esqueça de corresponder à versão da plataforma ou removê-la completamente. O exemplo a seguir mostra os TFMs para um projeto do .NET 7:
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst;net7.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
O exemplo a seguir mostra os TFMs para um projeto do .NET 8:
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst;net8.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
Referências de pacote explícitas também devem ser adicionadas ao arquivo .csproj para os seguintes pacotes NuGet do .NET MAUI:
<ItemGroup>
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
</ItemGroup>
A variável $(MauiVersion)
é referenciada a partir da versão do .NET MAUI que você instalou. Você pode substituir isso adicionando a propriedade de build $(MauiVersion)
ao arquivo .csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
<UseMaui>True</UseMaui>
<MauiVersion>8.0.3</MauiVersion>
</PropertyGroup>
</Project>
Isso pode ser útil ao usar builds ad hoc do feed noturno ou builds baixados de pull requests.
Além disso, a propriedade de build $(ApplicationIdGuid)
pode ser removida do arquivo .csproj no .NET 8. Para obter mais informações, confira Alterações de comportamento.
Antes de criar o seu aplicativo atualizado pela primeira vez, exclua as pastas bin
e obj
.
Observação
O modelo de projeto para um aplicativo do .NET MAUI no .NET 8 permite o contexto anulável para o projeto com a propriedade de build $(Nullable)
. Para obter mais informações, confira Anulável.