Xamarin Forms: Pagina Master-Details – Perchè non si chiude la Master ?

Programmare con Xamarin Forms è oggettivamente una figata: scrivere un solo codice che che viene condiviso tra più piattaforme…..

Come spesso accade non è tutto perfetto però: ogni tanto saltano fuori dei misteri difficilmente comprensibili.

Questa volta la cosa è molto misteriosa, e Ve la propongo così come l’ho trovata e come supergiù l’ho risolta (senza comprenderne i motivi).

La storia parte da una normalissima pagina Master-Details usata come menù di una appicazione: la master “tiene” il menù, e la details la pagine selezionata. Nulla di strano: una cosa classica…….

Ebbene dopo un poco di utilizzo ci accorgiamo che il menù non si chiude sempre: un pò di verifiche evidenziano senza ombra di smentita che anche dopo che da codice si fornisce correttamente la riga IsPresented = True (il cui compito è appunto di far chiudere la pagina master), la relativa pagina ogni tanto non ne vuole sapere di chiudersi e rimane aperta a coprire parzialmente il contenuto della Details.

Solo dopo aver scrollato il menù (e magari dopo 2 imprecazioni ben piazzate….) allora si riesce a far scomparire la maledetta pagina. Il difetto si presenta sopratutto quando la app si trova in “LandScape mode”.

Come è capitato spesso una rapida ricerca sulla rete evidenzia il solito manipolo di disperati che come te alla ricerca dela soluzione: ma sembra che ad oggi non ne esista nessuna univoca e sicura.

Dopo svariate prove ho riassunto un paio di metodi che dovrebbero risolvere quasi totalmente il problema.

Soluzione 1

Porre nel costruttore della pagina il seguente.

MasterBehavior = MasterBehavior.Popover

Soluzione 2

Come detto normalmente la pagina Master si usa come menù: nel codice dopo aver dato aperto la nuova pagina far precedere la modifica del parametro IsPresented con un Task.Delay di almeno mezzo secondo.

Curiosamente questo semplice stratagemma mitiga quasi totalmente il problema.

await Task.Delay(500);
this.IsPresented = true;