Spoiler
Alla fine dell’articolo l’applicazione sarà funzionante con View differenti in base al tipo di dispositivo e la sua compilazione includerà solo le View necessarie.
Prerequisiti
Questo articolo segue e amplia questo articolo.
PizzaLab.MAUI.Views
Aggiungiamo due cartelle (Folder) una la chiamiamo Desktop
e l’altra Mobile
.
Creiamo in tutte e due le cartelle una .NET MAUI Content Page (XAML)
che chiameremo in entrambi i casi ChildView
.
Una delle due la impostiamo con lo sfondo rosso:
Background="Red"
L’altra con lo sfonfo blu:
Background="Blue"
PizzaLab.MAUI
Modifichiamo MauiProgram.cs
in modo da specificare quale View deve essere usata in base al sistema operativo che sta eseguendo la nostra applicazione:
.RegisterTypes(containerRegistry =>
{
containerRegistry.RegisterForNavigation<MainView, MainViewModel>("MainView");
#if WINDOWS || MACCATALYST
containerRegistry.RegisterForNavigation<Views.Desktop.ChildView, ChildViewModel>("ChildView");
#elif ANDROID || IOS
containerRegistry.RegisterForNavigation<Views.Mobile.ChildView, ChildViewModel>("ChildView");
#else
containerRegistry.RegisterForNavigation<ChildView, ChildViewModel>("ChildView");
#endif
})
Come si può vedere la ChildView che viene aperta varia in base al dispositivo ma il suo ViewModel non cambia rispetto e la dimostrazione la possiamo avere aggiungendo in entrambe le View create il campo per la visualizzazione dell’id:
<Label Text="{Binding Id}"
/>
Il risultato sarà questo:


Ora aggiungiamo una configurazione al progetto che vada a filtrare, in fase di compilazione, quali View deve portarsi dietro e quali no. Tutte le View presenti nella cartella Desktop
verrano escluse quando il TargetFramework
è diverso da Windows e MacOS (quindi solo Android e iOS) mentre nel secondo caso verranno escluse tutte quelle presenti nella cartella Mobile
quando il TargetFramework
è Windows o MacOS.
<ItemGroup Condition="$(TargetFramework.Contains('-windows')) != true AND $(TargetFramework.StartsWith('net8.0-maccatalyst')) != true">
<Compile Remove="**\Desktop\**\*.cs" />
<None Include="**\Desktop\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
<Compile Remove="**\Desktop\**\*.xaml" />
<None Include="**\Desktop\**\*.xaml" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>
<ItemGroup Condition="$(TargetFramework.Contains('-windows')) == true OR $(TargetFramework.StartsWith('net8.0-maccatalyst')) == true">
<Compile Remove="**\Mobile\**\*.cs" />
<None Include="**\Mobile\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
<Compile Remove="**\Mobile\**\*.xaml" />
<None Include="**\Mobile\**\*.xaml" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>
Compilazione
Per compilare il codice qui sopra (Windows e Android), da riga di comando, possiamo utilizzare queste due stringhe:
dotnet publish -c Release -r win-x64 --self-contained true
dotnet publish -c Release -r android-arm64 -p:PackageFormat=Apk -f net8.0-android --sc true
Qui trovate i sorgenti del codice visto sopra: