Visualizzazione della View in base al sistema operativo e filtro sulla compilazione

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:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *