In un'app per Windows 8 che ho appena inviato allo Store per la certificazione mi sono imbattuto in un problema, al quale ho dovuto apportare una soluzione non proprio ortodossa per i miei gusti, ma che è stata la migliore possibile.
Si tratta di un problema che può capitare con i controlli GridView e ListView e sottolineo può, nel senso che non necessariamente capita ogni volta che si usano, anzi. Con molta probabilità dipende dal tipo di DataTemplate che usate. Solo che, se dovesse capitarvi, dovete sapere come tentare di risolverlo.
Nel mio scenario, su una pagina ho una GridView:
<GridView Name="MyView" ItemsSource="{Binding}" Margin="0,15,0,0" HorizontalAlignment="Left">
<GridView.ItemTemplate>
<DataTemplate>
<!-- custom DataTemplate -->
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
Da questa pagina in cui c'è quest'oggetto, effettuo la navigazione a una nuova pagina. Da quest'ultima, torno indietro alla pagina in cui c'è la GridView.
Risultato: invece di mostrarmi gli elementi orizzontalmente, come richiesto, il controllo me li mostra in verticale perdendo l'allineamento.
Faccio una ricerca su Internet e l'unico che parla di questo problema è un signore di Microsoft, che offre una soluzione nel suo blog a questo indirizzo. Sfortunatamente la soluzione proposta non ha risolto il mio problema, quindi quello che ho fatto è stato ridefinire il template del pannello di visualizzazione utilizzando uno StackPanel. Questo va bene per me perché ho pochi elementi da visualizzare, quindi non è necessario virtualizzare. In codice:
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
In questo modo il tutto è tornato a funzionare a dovere. Se doveste capitarvi, quindi, provate a intervenire sull'ItemsPanelTemplate.
Alessandro