Sunday, March 25, 2012 #

Convivenza tra Expression Blend 5 Preview e Visual Studio 2010

Se avete installato Visual Studio 11 in una macchina con Visual Studio 2010 o avete istallato Visual Studio 2010 successivamente se provate a creare un progetto da Blend, vedrete soltanto una soluzione vuota. D’altro canto se provate ad aprire una soluzione Metro creata da Visual Studio 11, potreste ricevere un messaggio di errore sul file "C:\Program Files (x86)\MSBuild\Microsoft\WindowsXaml\v10.0\Microsoft.Windows.UI.Xaml.CSharp.targets" che non viene trovato:

image

Questo perchè il file in questione è ovviamente nella cartella v11.0!

Blend cerca il file nella cartella v10.0 perchè nel file .csproj è contenuta la riga

<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />

In alcune circostanze, tra cui quella in cui ci sia installato Visual  Stiudio 2010, Blend 5 preview prende come default per VisualStudioVersion il valore 10.0

Il problema si risolve in pochi secondi (a saperlo) impostando una variabile di ambiente di Windows con il nome VisualStudioVersion e con in valore 11.0.

image

Fonte: social.msdn.microsoft.com

posted @ Sunday, March 25, 2012 6:40 PM | Feedback (0)

Metro UX con XAML: creare una GridView custom

Molti mi hanno chiesto come creare in XAML una griglia con gli elementi che possano spammare su più righe o su più colonne, più o meno come accade con la pagina Start di Windows 8 o come potete vedere in altre applicazioni Metro.

screenshot1

La soluzione è abbstanza semplice: basta ereditare il controllo GridView e fare un override del metodo PrepareContainerForItemOverride avendo cura di inserire nel oggetto bindato all’item (il model se usate MVVM) le proprietà che rappresentano i valori di RowSpan e ColumnSpan dell’oggetto contenitore, nel mio caso un VariableSizedWrapGrid in questo modo:

public class SpannableGridView : GridView
{
    protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
    {
        var dataItem = item as SampleDataItem;

        if (dataItem != null)
        {
            element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, dataItem.ColumnSpan);
            element.SetValue(VariableSizedWrapGrid.RowSpanProperty, dataItem.RowSpan);
        }

        base.PrepareContainerForItemOverride(element, item);
    }
}

Da notare che:

  • il DataTemplate associato all’item non deve essere a dimensione fissa perchè deve adattarsi alle varie dimensioni;
  • se usate un VariableSizedWrapGrid dovete impostare la dimensione di ItemHeight e ItemWidth alla dimensione che dovrà avere l’item con ColumnSpan  e RowSpan impostati a 1.

Detto questo potete scaricarvi l’esempio qua.

posted @ Sunday, March 25, 2012 5:20 PM | Feedback (0)