Novità di .NET MAUI per .NET 11

L'obiettivo di .NET Multi-platform App UI (.NET MAUI) di .NET 11 è migliorare la qualità del prodotto. Per informazioni sulle novità di ogni .NET MAUI nella versione .NET 11, vedere le note sulla versione seguenti:

Importante

A causa dell'uso di dipendenze esterne, ad esempio Xcode o Android SDK Tools, i criteri di supporto .NET MAUI differiscono dai criteri di supporto .NET e .NET Core support. Per altre informazioni, vedere .NET MAUI criteri di supporto.

In .NET 11, .NET MAUI viene fornito come workload .NET e più pacchetti NuGet. Il vantaggio di questo approccio è che consente di aggiungere facilmente i progetti a versioni specifiche, consentendo allo stesso tempo di visualizzare facilmente l'anteprima di build non definitive o sperimentali.

CoreCLR è il runtime predefinito

A partire da .NET 11 Preview 4, CoreCLR è il runtime predefinito in tutte le piattaforme .NET MAUI per i progetti creati con e destinati a .NET 11. In questo modo il runtime viene unificato in .NET MAUI con vantaggi per il debug, la profilatura, la Ricaricamento rapido, le dimensioni delle app e le prestazioni dell'app. Per una panoramica dettagliata di questa transizione, vedere il post di blog dell'annuncio.

Controlli

.NET MAUI in .NET 11 include miglioramenti e deprecazioni dei controlli.

Invocazione da JavaScript a .NET in HybridWebView

A partire da .NET 11 Preview 6, HybridWebView è possibile usare i metadati JSON generati dall'origine quando JavaScript richiama .NET metodi. Chiamare SetInvokeJavaScriptTarget<T>(T target, JsonSerializerContext jsonSerializerContext) con un JsonSerializerContext generato dal codice sorgente per evitare la serializzazione basata sulla riflessione e rendere l'invocazione da JS a .NET compatibile con NativeAOT e il trim completo. Questo overload dipende dal generatore di codice sorgente di HybridWebView incluso in .NET MAUI; se gli analizzatori sono disabilitati o la chiamata diretta non viene intercettata, l'overload solleva un'eccezione. L'overload legacy rimane disponibile, ma è contrassegnato come richiedente codice non referenziato e codice dinamico. Per altre informazioni, vedi GitHub PR #35626.

Material 3 su Android

In .NET 11 Preview 4, gli handler Android per diversi controlli di base usano stili e comportamenti di Material 3 predefiniti, allineandoli al design moderno di Android e abilitando il sistema di temi di Material 3:

Esempi di controlli scuri e chiari per il sistema di design Material 3 in .NET MAUI.

In .NET 11 Preview 5, i tipi helper sottostanti di Material 3 (MauiMaterialEditText, MauiMaterialDatePicker, MauiMaterialPicker, MauiMaterialTimePicker, MauiMaterialTextView, MauiMaterialSearchBarTextInputLayout, MaterialActivityIndicator e MauiMaterialContextThemeWrapper) sono pubblici, così puoi derivarne delle sottoclassi nelle personalizzazioni del tuo gestore. Per ulteriori informazioni, vedi GitHub PR #35323 e Material 3.

proprietà Fill di BoxView

BoxView espone ora una Fill proprietà associabile di tipo Brush, consentendo di disegnare con qualsiasi pennello (incluso LinearGradientBrush e RadialGradientBrush) anziché solo un colore a tinta unita. Quando sono impostati sia Fill che Color, Fill ha la priorità; reimpostando Fill su null, BoxView viene nuovamente visualizzato usando Color. Per ulteriori informazioni, vedere Riempire un BoxView con un pennello e GitHub PR #31789.

<BoxView Opacity="0.5"
         WidthRequest="200"
         HeightRequest="100"
         HorizontalOptions="Center"
         VerticalOptions="Center">
    <BoxView.Fill>
        <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
            <GradientStop Color="Purple" Offset="0.0" />
            <GradientStop Color="Orange" Offset="0.5" />
            <GradientStop Color="Red" Offset="1.0" />
        </LinearGradientBrush>
    </BoxView.Fill>
</BoxView>

Schermata di un controllo BoxView disegnato con un pennello con sfumatura lineare.

Oppure un oggetto RadialGradientBrush:

<BoxView Opacity="0.5"
         WidthRequest="200"
         HeightRequest="100"
         HorizontalOptions="Center"
         VerticalOptions="Center">
    <BoxView.Fill>
        <RadialGradientBrush Center="0.5,0.5" Radius="0.5">
            <GradientStop Color="Yellow" Offset="0.0" />
            <GradientStop Color="Green" Offset="1.0" />
        </RadialGradientBrush>
    </BoxView.Fill>
</BoxView>

Schermata di un controllo BoxView dipinto con un pennello a gradiente radiale.

LongPressGestureRecognizer

.NET 11 aggiunge un LongPressGestureRecognizer predefinito per la gestione dei gesti di pressione prolungata. Supporta una durata della pressione configurabile, una soglia di movimento per annullare il movimento se il dito dell'utente si sposta troppo lontano, il rilevamento dello stato tramite GestureStatee l'associazione di comandi con Command e CommandParameter. Per altre informazioni, vedere GitHub PR #33432.

<Image Source="dotnet_bot.png">
    <Image.GestureRecognizers>
        <LongPressGestureRecognizer Duration="500"
                                    LongPressed="OnLongPressed" />
    </Image.GestureRecognizers>
</Image>
void OnLongPressed(object sender, LongPressGestureRecognizerEventArgs e)
{
    if (e.State == GestureState.Completed)
    {
        // Handle completed long press
    }
}

Mappa

Il controllo Map riceve un set significativo di miglioramenti in .NET 11 Preview 3:

Clustering dei pin

Abilitare il clustering dei pin per raggruppare quelli nelle vicinanze a livelli di zoom più bassi. Impostare IsClusteringEnabled sulla mappa e, facoltativamente, assegnare a ciascun ClusteringIdentifier ogni segnaposto. Gestire l'evento ClusterClicked per rispondere quando un utente tocca un cluster.

<maps:Map IsClusteringEnabled="True"
          ClusterClicked="OnClusterClicked" />

Icone del segnaposto personalizzate

I pin possono ora visualizzare un'immagine personalizzata anziché l'indicatore predefinito impostando la ImageSource proprietà :

var pin = new Pin
{
    Label = "Custom pin",
    Location = new Location(47.6062, -122.3321),
    ImageSource = ImageSource.FromFile("custom_pin.png")
};

Stile mappa JSON personalizzato (Android)

Applicare uno stile JSON personalizzato alla mappa in Android usando la MapStyle proprietà . In questo modo è possibile eseguire mappe in modalità scura, nascondere etichette o qualsiasi stile supportato dall'API di applicazione di stili di Google Maps.

Mappare gli eventi e le proprietà degli elementi

  • MapLongClicked — viene generato quando l'utente preme a lungo sulla mappa.
  • Circle, Polygon e Polyline ora generano eventi click (MapElementClick).
  • MapElement.IsVisible e MapElement.ZIndex — controllare la visibilità degli elementi e disegnare l'ordine.
  • Pin.ShowInfoWindow() / Pin.HideInfoWindow() : visualizzare o nascondere a livello di codice la finestra delle informazioni di un pin.
  • UserLocationChanged evento e LastUserLocation proprietà: tenere traccia della posizione dell'utente in tempo reale.

Animated MoveToRegion e MapSpan.FromLocations

MoveToRegion supporta ora transizioni animate e il nuovo MapSpan.FromLocations() metodo factory crea un intervallo che include una raccolta di posizioni.

Per ulteriori informazioni, vedere le richieste pull di GitHub #29101, #33831, #33950, #33982, #33985, #33792, #33799, #33991 e #33993.

In .NET 11 Preview 5 il Map controllo ottiene un'implementazione Windows supportata da Mappe di Azure. Per usarlo, chiamare UseMapServiceToken(...) in MauiProgram.cs specificando una chiave di sottoscrizione di Mappe di Azure. L'implementazione Windows supporta MoveToRegion, i tipi di mappa, il traffico, lo scorrimento, lo zoom e i pin standard. Alcune funzionalità solo piattaforma, ad esempio la posizione utente, le informazioni personalizzate sui pin windows e gli elementi o le forme della mappa non sono supportate in Windows. Per ulteriori informazioni, vedi GitHub PR #34138.

Riempimento di BoxView

A partire da .NET 11 Preview 5, BoxView espone una proprietà Fill di tipo Brush. Questo allinea BoxView alle altre primitive di forma e significa che i gradienti e altri pennelli possono disegnare un BoxView senza un handler personalizzato. BackgroundColor funziona ancora come prima. Per ulteriori informazioni, consulta GitHub PR #31789.

<BoxView HeightRequest="120" CornerRadius="12">
    <BoxView.Fill>
        <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
            <GradientStop Color="#512BD4" Offset="0.0" />
            <GradientStop Color="#0099CC" Offset="1.0" />
        </LinearGradientBrush>
    </BoxView.Fill>
</BoxView>

gestore di Windows CollectionView2

A partire da .NET 11 Preview 6, Windows usa il gestore CollectionView2 per impostazione predefinita per CollectionView. Se è necessario usare temporaneamente il gestore Windows precedente mentre si convalida un'app, impostare UseWindowsCollectionView2Handler su false nel file di progetto. Per ulteriori informazioni, vedi GitHub PR #34600.

<PropertyGroup>
  <UseWindowsCollectionView2Handler>false</UseWindowsCollectionView2Handler>
</PropertyGroup>

Gestore di Android Shell

A partire da .NET 11 Preview 6, le app Android Shell usano per impostazione predefinita l'architettura Shell basata su handler. La nuova architettura riutilizza gli stessi componenti di base del handler usati da altre funzionalità di navigazione di .NET MAUI, mentre il percorso legacy ShellRenderer rimane disponibile se lo si registra esplicitamente. Per ulteriori informazioni, vedi GitHub PR #34758.

Rimozione del pacchetto di compatibilità

A partire da .NET 11 Preview 6, il pacchetto NuGet facoltativo Microsoft.Maui.Controls.Compatibility non è più compilato o spedito. I progetti che facevano esplicito riferimento a questo pacchetto per garantire la compatibilità con la migrazione da Xamarin.Forms dovrebbero smettere di usarlo prima di passare a .NET 11. Le app che fanno riferimento solo a Microsoft.Maui.Controls non sono interessate. Per ulteriori informazioni, vedi GitHub pull request n. 35870.

Gestori iOS e Mac Catalyst NavigationPage e TabbedPage

A partire da .NET 11 Preview 7 NavigationPage e usare NavigationViewHandler e TabbedViewHandlerTabbedPage per impostazione predefinita in iOS e Mac Catalyst, anziché i NavigationRenderer renderer di compatibilità e TabbedRenderer . In questo modo le piattaforme Apple sono allineate a Android, Windows e Tizen, che già usavano i gestori. Nessuna delle modifiche viene controllata dietro un commutatore di funzionalità, quindi le app che usano renderer personalizzati o le personalizzazioni estese di spostamento devono essere testate in questa anteprima. Entrambi i renderer rimangono disponibili nel livello di compatibilità come fallback manuale.

Per NavigationPage, il gestore allinea anche la tempistica degli eventi iOS e Mac Catalyst alle altre piattaforme. L'evento Appearing si verifica ora prima del push della pagina, anziché dopo che la pagina diventa visibile e il push di una pagina precedentemente estratta crea un nuovo controller di visualizzazione invece di riutilizzare quello precedente. Usare l'evento NavigatedTo anziché Appearing per il lavoro che presuppone che la pagina sia visualizzata sullo schermo. ToolbarItem oggetti la cui Order proprietà viene Secondary spostata anche in un menu di overflow nella barra di spostamento, anziché in una barra degli strumenti nella parte inferiore della pagina. Per altre informazioni, vedere NavigationPage in iOS e Mac Catalyst, Migrate iOS NavigationPage renderer e GitHub PR #36109.

Per TabbedPage, le funzionalità esistenti vengono mantenute, inclusi i titoli delle schede, le icone e la selezione, le proprietà del colore della barra e della scheda, la scheda Altro e le specifiche della TranslucencyMode piattaforma. Per altre informazioni, vedere TabbedPage in iOS e Mac Catalyst, Migrate iOS TabbedPage renderer e GitHub PR #36507.

Modelli di route della shell

A partire da .NET 11 Preview 7, una route registrata con il Routing.RegisterRoute metodo può includere parametri di percorso, ispirati a ASP.NET Core e al routing Blazor. Una route che contiene uno o più parametri di percorso è nota come modello di route e i valori acquisiti vengono recapitati alla pagina di destinazione tramite i meccanismi e IQueryAttributable esistentiQueryProperty, senza codificare ogni valore come stringa di query.

Routing.RegisterRoute("trip/{tripId}", typeof(TripDetailPage));
await Shell.Current.GoToAsync("//routes/trip/SEA-204");

I modelli supportano segmenti obbligatori, facoltativi, predefiniti, vincolati, catch-all e misti. I modelli di route sono additivi, quindi le route che non contengono un parametro di percorso non sono interessate. I modelli di route richiedono attualmente una navigazione assoluta. Per altre informazioni, vedere Modelli di route, l'esempio di modelli di route shell e GitHub richiesta pull #35110.

Animazione

Annullare animazioni con CancellationToken

A partire da .NET 11 Preview 5, i ViewExtensions metodi di animazione (FadeToAsync, RotateToAsync, ScaleToAsyncTranslateToAsync, e le varianti relative) accettano un oggetto facoltativoCancellationToken. Il passaggio di un token consente di annullare un'animazione attesa specifica senza chiamare CancelAnimations, che annulla ogni animazione sull'elemento. Le varianti nonAsync (FadeTo, RotateToe così via) sono ora contrassegnate [Obsolete] a favore degli Asyncequivalenti con suffisso . Per ulteriori informazioni, consultare GitHub PR #33372 e animazione di base.

Accessibility

Elementi equivalenti per l'automazione del layout di Windows

A partire da .NET 11 Preview 6, i pannelli di layout di Windows creano istanze di MauiLayoutAutomationPeer e partecipano a Automazione interfaccia utente quando espongono informazioni di automazione, ad esempio AutomationId, AutomationProperties.IsInAccessibleTree, SemanticProperties.Description o SemanticProperties.Hint. In questo modo, i layout puramente strutturali vengono mantenuti fuori dall'albero del lettore di schermo, mentre i layout resi intenzionalmente accessibili risultano individuabili. Per ulteriori informazioni, vedi pull request GitHub #35597.

Etichetta di accessibilità del pulsante Indietro

A partire da .NET 11 Preview 5, è possibile impostare l'etichetta di accessibilità annunciata dalle utilità per la lettura dello schermo (TalkBack, VoiceOver, Assistente vocale) per il pulsante Indietro della barra degli strumenti. NavigationPage definisce una BackButtonAccessibilityLabel proprietà associata e BackButtonBehavior definisce una AccessibilityLabel proprietà per le app shell. Entrambi sono indipendenti dal titolo visibile del pulsante Indietro, quindi puoi mantenere breve l'etichetta visibile e fornire comunque un'etichetta vocale descrittiva. Per ulteriori informazioni, consulta GitHub PR #35011, NavigationPage e comportamento del pulsante Indietro.

Funzionalità della piattaforma

le funzionalità della piattaforma di .NET MAUI hanno ricevuto alcuni aggiornamenti in .NET 11.

Chiavi di accesso

A partire da .NET 11 Preview 7, la Passkeys classe nello Microsoft.Maui.Authentication spazio dei nomi guida la cerimonia nativa WebAuthn/FIDO2 tramite l'autenticatore della piattaforma, ad esempio Face ID, Touch ID, Windows Hello o un prompt biometrico Android. Selezionare Passkeys.IsSupported, quindi chiamare Passkeys.CreateAsync per registrare una credenziale o Passkeys.AssertAsync per accedere con credenziali esistenti. Il contratto è opzioni WebAuthn standard JSON in e json della risposta WebAuthn standard, quindi interagisce con le librerie del server relying party esistenti, incluso il supporto passkey in ASP.NET Core Identity.

I passkey sono supportati in Android 14 (API 34), iOS 16, Mac Catalyst 16 e Windows 10 versione 1903 o successiva. La destinazione di distribuzione minima di Mac Catalyst di .NET 11 toolchain è 17, che rappresenta il piano effettivo per .NET 11 app. Il client non esegue alcuna verifica del proprio. La generazione delle richieste e l'ID della relying party, l'origine, l'attestazione e la convalida dell'asserzione rimangono responsabilità del server. Per la corretta registrazione è necessaria anche la configurazione dell'attendibilità della piattaforma, ad esempio i collegamenti di asset digitali in Android e i domini associati nelle piattaforme Apple. Per altre informazioni, vedere Passkeys, l'esempio Passkeys e GitHub richiesta pull #36837.

A partire da .NET 11 Preview 7, la MediaPickerOptions.SaveToGallery proprietà salva una foto o un video acquisiti nella raccolta del dispositivo. Per impostazione predefinita false, la proprietà è e si applica solo ai CapturePhotoAsync metodi e CaptureVideoAsync . È supportato in Android, iOS e Mac Catalyst e viene ignorato in Windows e Tizen. Per altre informazioni, vedere Salvare i supporti acquisiti nella raccolta e GitHub richiesta pull #34641.

Tema barra di stato

A partire da .NET 11 Preview 7, la Window.StatusBarTheme proprietà controlla l'aspetto delle icone delle barre di stato disegnate dal sistema operativo in Android 6.0 (API 23) o versioni successive e iOS, indipendentemente dal tema dell'app. Ciò è utile quando il contenuto da bordo a bordo posiziona una superficie chiara o scura dietro la barra di stato. StatusBarTheme.Light indica una superficie chiara e visualizza icone scure, StatusBarTheme.Dark indica una superficie scura e visualizza icone chiare e il valore predefinito di StatusBarTheme.Default segue il tema dell'app corrente. Per altre informazioni, vedere Impostare il tema della barra di stato e GitHub richiesta pull #34903.

Windows l'attivazione di AppInstance

A partire da .NET 11 Preview 7, Windows le app possono gestire AppInstance le attivazioni con l'hook del ciclo di vita, che riceve l'attivazione OnAppInstanceActivated iniziale, nonché i file, il protocollo e le attivazioni reindirizzate. In combinazione con AppInstance.FindOrRegisterForKey, questo consente di rendere l'app a istanza singola reindirizzando le attivazioni da altre istanze all'istanza in esecuzione, che abilita WebAuthenticator anche i callback nelle app a istanza singola. Per altre informazioni, vedere Gestire l'attivazione di AppInstance e GitHub richiesta pull #36640.

Ripristino dei risultati di Android MediaPicker

A partire da .NET 11 Preview 6, le operazioni Android MediaPicker possono recuperare i risultati dopo la ricreazione del processo dell'app da parte del selettore di sistema o della fotocamera. Usare GetRecoveredMediaPickerResultsAsync, WaitForRecoveredMediaPickerResultsAsync, ClearRecoveredMediaPickerResultAsynce DiscardPendingMediaPickerOperationAsync per esaminare, attendere, cancellare o rimuovere i risultati recuperati. Le app devono mantenere il proprio stato del flusso di lavoro prima di avviare un'operazione di selezione o acquisizione in modo che i supporti ripristinati possano essere confrontati con l'azione dell'utente corretta. Per ulteriori informazioni, vedi pull request di GitHub #35455.

Aggiornamenti della georilevazione

A partire da .NET 11 Preview 6, GeolocationListeningRequest.MinimumDistance consente ai listener di posizione continui di filtrare gli aggiornamenti in base alla distanza di spostamento. Su Android API 34 e versioni successive, i risultati della geolocalizzazione privilegiano l'altitudine riferita al livello medio del mare (MSL), quando disponibile, riportano AltitudeReferenceSystem.Geoid e utilizzano la corrispondente accuratezza verticale MSL. Per ulteriori informazioni, consultare GitHub PR #35784 e GitHub PR #35097.

MonochromeFile per le icone adattive di Android

A partire da .NET 11 Preview 4, le icone dell'app a progetto singolo possono dichiarare un livello monocromatico dedicato per le icone con tema Android tramite un nuovo attributo MonochromeFile in MauiIcon. Questo consente all'icona con tema di usare un glifo diverso rispetto al livello di primo piano, invece di esserne una versione riutilizzata e colorata. Per altre informazioni, vedere GitHub PR #34569.

Autorizzazione PostNotifications per iOS

Permissions.PostNotifications è ora implementato in iOS, fornendo un'API multipiattaforma per richiedere l'autorizzazione di notifica. In precedenza questa autorizzazione era funzionale solo in Android. Usarlo per richiedere l'autorizzazione prima di pianificare le notifiche locali in iOS. Per altre informazioni, vedere GitHub PR #30132.

var status = await Permissions.RequestAsync<Permissions.PostNotifications>();
if (status == PermissionStatus.Granted)
{
    // Schedule notifications
}

A partire da .NET 11 Preview 6, l'API delle autorizzazioni espone anche un'astrazione IPermissions tramite Permissions.Current, che migliora la testabilità e l'estendibilità per il codice che esegue il wrapping dei controlli delle autorizzazioni. Per ulteriori informazioni, vedi GitHub PR #35987.

CSS tagliabile

.NET MAUI supporto CSS è ora completamente trimmabile. Se l'app non usa fogli di stile CSS, l'infrastruttura CSS viene rimossa durante la pubblicazione, riducendo le dimensioni dell'app. Non sono necessarie modifiche al codice. Il linker rimuove automaticamente i tipi CSS inutilizzati. Per altre informazioni, vedere GitHub PR #33160.

Gestore dello stato visivo

InvalidateStyle e InvalidateVisualStates

Due nuove API semplificano la riapplicazione degli stili e degli stati di visualizzazione che sono stati modificati sul posto:

  • VisualElement.InvalidateStyle() — forza un controllo a riapplicare l'oggetto corrente Style, rilevando le eventuali modifiche apportate direttamente all'oggetto di stile.
  • VisualStateManager.InvalidateVisualStates(VisualElement) — riapplica i setter del gruppo di stati di visualizzazione corrente, utili quando i valori delle proprietà dello stato di visualizzazione cambiano in fase di esecuzione.

Questi metodi sono particolarmente utili per gli scenari di Ricaricamento rapido e gli aggiornamenti dinamici dell'interfaccia utente in cui gli stili o gli stati di visualizzazione vengono modificati senza sostituire l'intero oggetto di stile. Per altre informazioni, vedere GitHub PR #34723.

// Mutate a style in place and force the control to pick up the change
var style = myButton.Style;
style.Setters.Add(new Setter { Property = Button.BackgroundColorProperty, Value = Colors.Red });
myButton.InvalidateStyle();

// Reapply visual states after changing a setter value
VisualStateManager.InvalidateVisualStates(myButton);

XAML

x:Code direttiva per C# inline in XAML

A partire da .NET 11 Preview 4, il generatore di origine XAML supporta una direttiva x:Code che consente di inline un piccolo blocco di C# direttamente all'interno di un file XAML. In questo modo è più semplice mantenere il codice glue locale di visualizzazione accanto al markup usato senza creare un code-behind parziale solo per un singolo helper. Il EnablePreviewFeatures flag è obbligatorio per questo. Per altre informazioni, vedere GitHub PR #34715.

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.MainPage">
    <x:Code><![CDATA[
        void OnButtonClicked(object sender, EventArgs e)
        {
            // inline C# method
        }
    ]]></x:Code>
    <Button Clicked="OnButtonClicked" Text="Click me" />
</ContentPage>

Associazioni compilate all'interno di DataTemplates

A partire da .NET 11 Preview 4, i binding compilati con origine esplicita definiti all'interno di un DataTemplate vengono ora risolti correttamente, correggendo una regressione che in .NET 10 comprometteva i binding TapGestureRecognizer negli elementi CollectionView. Per altre informazioni, vedere GitHub PR #34447.

Il generatore di codice sorgente XAML ora anche:

  • Genera dati diagnostici quando un elemento x:DataType o un'associazione non è valida. Per altre informazioni, vedere GitHub PR #34078.
  • Distingue correttamente le classi di estensioni statiche dai enum tipi durante la risoluzione del markup XAML. Per altre informazioni, vedere GitHub PR #34446.

Dichiarazioni dello spazio dei nomi XAML implicite

A partire da .NET 11, le dichiarazioni dello spazio dei nomi XAML implicite sono abilitate per impostazione predefinita. I file XAML non richiedono più dichiarazioni standard xmlns e xmlns:x nell'elemento radice: il compilatore le inserisce automaticamente. Le dichiarazioni esplicite esistenti continuano a essere compilate e possono essere usate per disambiguare i nomi di tipo duplicati. Per altre informazioni, vedere GitHub PR #33834.

ResourceDictionary differita

La generazione di origine XAML registra ora le voci del dizionario risorse come factory, istanziando ogni risorsa su richiesta invece di caricarle anticipatamente all'avvio. Questo può produrre fino a un miglioramento di circa otto volte nel tempo di inizializzazione del dizionario delle risorse per le app con dizionari molto grandi. L'ottimizzazione è automatica quando la generazione dell'origine XAML è abilitata. Non sono necessarie modifiche al codice. Per altre informazioni, vedere GitHub PR #33826.

Ricaricamento rapido incrementale XAML

A partire da .NET 11 Preview 7, .NET MAUI include un motore di Ricaricamento rapido incrementale XAML. Usa un generatore di origine e un oggetto MetadataUpdateHandler per generare patch per le modifiche alle pagine e ai controlli XAML esistenti x:Classsupportati e li applica a ogni istanza dinamica del tipo interessato. Pertanto, le pagine di cui è già stata creata un'istanza possono essere aggiornate senza essere ricreate o spostate di nuovo in . Le modifiche supportate includono la modifica di proprietà e associazioni, la modifica delle risorse dichiarate in una pagina o un controllo e l'aggiunta, la rimozione o il riordinamento degli elementi figlio.

Il motore è abilitato per impostazione predefinita per Debug le compilazioni ed è disabilitato per impostazione predefinita per Release le compilazioni e la pubblicazione. Poiché applica gli aggiornamenti tramite , MetadataUpdateHandlerle modifiche XAML vengono applicate dagli host .NET Ricaricamento rapido, incluso dotnet watch. Per altre informazioni, vedere dotnet watch Per Android e dotnet watch per iOS.

Per rifiutare esplicitamente e continuare a usare il motore di Ricaricamento rapido XAML esistente, impostare la EnableMauiIncrementalHotReload proprietà MSBuild su false:

<PropertyGroup>
    <EnableMauiIncrementalHotReload>false</EnableMauiIncrementalHotReload>
</PropertyGroup>

Per altre informazioni, vedere Abilitare Ricaricamento rapido incrementali XAML e GitHub richieste pull #34338 e #37163.

Associazioni RelativeSource compilate sicure AOT

A partire da .NET 11 Preview 7, il generatore di origine XAML compila un'associazione che usa RelativeSource con un AncestorType binding compilato risolto in modo risolto, anziché un percorso di associazione basato su stringa che si basa sulla reflection e potrebbe perdere i membri associati durante il taglio nelle build NativeAOT e full-trimming.

<Button Command="{Binding Source={RelativeSource AncestorType={x:Type local:PeopleViewModel}},
                          Path=DeleteEmployeeCommand}" />

RelativeSource associazioni che usano Self o TemplatedParent continuano a usare il percorso di associazione di runtime. Per un'associazione x:Reference , il generatore di origine risolve il tipo dell'elemento a cui si fa riferimento e lo compila ed esegue il fallback al percorso di associazione di runtime solo quando il percorso di associazione non può essere compilato in base a quel tipo risolto. Un x:Reference nome che non può essere risolto in un ambito di nome, ad esempio un oggetto AncestorType che non può essere risolto, causa l'esito negativo della compilazione XAML. Per altre informazioni, vedere Compilare associazioni predecessori di origine relative e GitHub richieste pull #34408 e #36905.

.NET per Android

.NET per Android in .NET 11 rende CoreCLR il runtime predefinito per le build Release e include operazioni per migliorare le prestazioni. Per ulteriori informazioni su .NET per Android in .NET 11, vedere le seguenti note sulla versione:

Minima versione di API Android supportata

A partire da .NET 11 Preview 3, il livello minimo di API Android supportato è stato elevato da 21 (Lollipop) a 24 (Nougat). Ciò significa che .NET MAUI app in .NET 11 richiedono Android 7.0 o versione successiva.

Se il progetto imposta $(SupportedOSPlatformVersion) in modo esplicito un valore inferiore a 24, sarà necessario aggiornarlo:

<PropertyGroup>
  <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">24</SupportedOSPlatformVersion>
</PropertyGroup>

Per altre informazioni, vedere Piattaforme supportate.

Annotazioni

I livelli di API Android 21, 22 e 23 sono supportati solo quando si usa il runtime mono.

CoreCLR per impostazione predefinita

CoreCLR è ora il runtime predefinito per Release le compilazioni. Ciò dovrebbe migliorare la compatibilità con il resto del .NET e tempi di avvio più brevi, con un aumento ragionevole delle dimensioni dell'applicazione.

Siamo sempre al lavoro per migliorare le prestazioni e le dimensioni dell'app, ma, per favore, segnalate problemi di stabilità o altre preoccupazioni aprendo segnalazioni su GitHub.

dotnet run

L'interfaccia della riga di comando di .NET è stata migliorata con Spectre.Consoleprompt quando è necessaria una selezione per dotnet run.

Pertanto, per progetti multi-destinazione come .NET MAUI, potrà:

  • Richiesta di un $(TargetFramework)
  • Richiedere un dispositivo, un emulatore, un simulatore se sono presenti più di uno.

L'output della console dell'applicazione dovrebbe essere visualizzato direttamente nel terminale e CTRL+C terminerà l'applicazione.

GIF delle selezioni di dotnet run su Windows per Android

GIF delle selezioni di esecuzione 'dotnet run' su macOS per iOS

dotnet watch per Android

A partire da .NET 11 Preview 4, dotnet watch funziona per dispositivi e emulatori Android. Dopo aver selezionato un framework e un dispositivo di destinazione, dotnet watch distribuisce l'app e applica le modifiche Ricaricamento rapido durante la modifica, senza ricompilare manualmente.

GIF di dotnet watch su Windows per Android.

dotnet watch per iOS

A partire da .NET 11 Preview 4, sono stati risolti diversi problemi di vecchia data per rendere dotnet watch utilizzabile end-to-end in un progetto dotnet new maui in esecuzione nell'iOS Simulator:

  • Il selettore TFM di Spectre.Console non sembra più bloccato perché due reader stavano entrambi chiamando Console.ReadKey(). Le chiavi ora transitano tramite un singolo evento PhysicalConsole.KeyPressed. Per altre informazioni, vedere dotnet/sdk #53675.
  • Ctrl+C e Ctrl+R non mostrano più uno WebSocketException/ObjectDisposedException spurio quando il trasporto WebSocket si interrompe. Per altre informazioni, vedere dotnet/sdk #53648.
  • Ricaricamento rapido non causa più deadlock su iOS quando UIKitSynchronizationContext è installato prima dell'esecuzione dell'hook di avvio. Per altre informazioni, vedere dotnet/sdk #54023.

GIF dell'orologio dotnet in macOS per iOS.

Importante

dotnet watch non funziona per i progetti iOS, a meno che <MtouchLink>None</MtouchLink> non sia impostato nel .csproj file. Per altre informazioni, vedere dotnet/macios #25295.

Aggiungere quanto segue al file di progetto:

<PropertyGroup>
  <MtouchLink>None</MtouchLink>
</PropertyGroup>

.NET per iOS

.NET 11 in iOS, tvOS, Mac Catalyst e macOS supporta le versioni della piattaforma seguenti:

  • iOS: 18.2
  • tvOS: 18.2
  • Mac Catalyst: 18.2
  • macOS: 15.2

Per altre informazioni su .NET 11 in iOS, tvOS, Mac Catalyst e macOS, vedere le note sulla versione seguenti:

Per informazioni sui problemi noti, vedere Problemi noti in .NET 11.

Xcode 26.4

A partire da .NET 11 Preview 4, Xcode 26.4 Stable è la versione Xcode supportata, con associazioni aggiornate in UIKit, AVFoundation, WebKit, Metal, Photos, PassKit, CarPlay, AuthenticationServices e altro ancora. Per altre informazioni, vedere dotnet/macios #25005.

Una modifica di rilievo sul lato Apple: HMError.QuotaExceeded è stata rimossa da Apple e non è più disponibile. Per altre informazioni, vedere dotnet/macios #25024.

Autenticazione del digest HTTP

A partire da .NET 11 Preview 4, l'autenticazione del digest HTTP è supportata in NSUrlSessionHandler. Per altre informazioni, vedere dotnet/macios #25180.

CoreCLR per le piattaforme Apple

A partire da .NET 11 Preview 4, CoreCLR è il runtime predefinito per .NET per iOS, Mac Catalyst, macOS e tvOS. Per altre informazioni, vedere CoreCLR è il runtime predefinito e dotnet/macios #25050.

L'anteprima 4 include anche un ampio intervento di miglioramento dell'affidabilità e del packaging in NSUrlSessionHandler, MSBuild, il linker e i componenti interni del runtime. Per l'elenco completo delle modifiche, vedere il log delle modifiche dell'anteprima 4.

API di Apple Intelligence

A partire da .NET 11 Preview 5, le API di Apple Intelligence sono disponibili da .NET per iOS, Mac Catalyst, macOS e tvOS. Questi includono il framework Foundation Models per l'intelligenza artificiale generativa su dispositivo, Image Playground per la generazione di immagini fornita dal sistema, i diritti degli strumenti di scrittura e il framework di traduzione. Per ulteriori informazioni, vedere dotnet/macios #25457 e il registro delle modifiche dell'Anteprima 5.

Vedere anche