[VS 2008 SP1] Background compiler in C#


Strano ma vero, col SP1 anche C# eredita una peculiarità unica di VB: il background compiler, ovvero l'indicazione immediata di eventuali errori sintattici "as-you type", quindi senza compilare.

Col nuovo SP1 questo snippet C#:


image

mostra immediatamente che qualcosa non va senza lanciare il Build del progetto.
Ovviamente l'opzione è disabilitabile via: Tools->Options->Text Editor->C#->Advanced->Show live semantic errors

image 

author: Corrado Cavalli | posted @ lunedì 12 maggio 2008 23.10 | Feedback (3)

Visual Studio 2008 e .NET Framework SP1: Overview per lo sviluppatore WPF


Il recente rilascio del service pack 1 di Visual Studio 2008 e del .NET Framework 3.5 introduce parecchie novità per lo sviluppatore WPF, ecco le principali partendo da quelle più evidenti, ovvero quelle inerenti il WPF designer integrato in VS 2008 (a.k.a Cider).

Gestione degli eventi
image

Le novità più evidenti sono visibili nella finestra delle proprietà (fig.1) dove finalmente è stata introdotta la possibilità di gestire gli eventi dei controlli secondo la stessa modalità delle applicazioni Winform (fig.2)

La vecchia modalità che fa uso di "Navigate to event Handler" è comunque ancora attiva.
Oltre alla migliore gestione degli eventi in fig.1 potete notare la presenza dei pulsanti di ordinamento per categoria e alfabetico.
Purtroppo Cider SP1 continua ad utilizzare la brutta abitudine di associare automaticamente un nome al controllo anche quando non siamo interessati ad interagirci e lo fa utilizzando Name anziche x:Name ignorando completamente l' uniformità con il "cugino" Expression Blend. 

 

 

 

 fig.1

image

  

 

  

fig.2


In compenso è stato aggiunto il supporto del designer agli stili:

image fig.2a


Refactoring!
imageFinalmente è possibile rinominare i controlli e i gestori evento mantenendo sincronizzato codice e XAML cosi comè è possibile usare l'opzione "Go to definition" su una variabile legata a un controllo  per navigare direttamente alla parte di XAML che lo descrive.


Attualmente la preview del comando Rename chiede la conferma del field automaticamente generato nel file .g.cs (fig.3) ma presumo che nella versione finale questo verrà automaticamente escluso.

 

 
fig.3


Drag dei controlli nella XAML view
Se usate Silverlight questa feature la conoscete già: si tratta della possibilità di draggare i controlli dalla toolbox direttamente nella XAML View, in Silverlight questa possibilità è comoda perchè vengono automaticamente importati i namespaces necessari mentre in WPF, non solo tutt'ora eventuali UserControls interni o definiti in assembies esterne non vengono aggiunti automaticamente alla toolbox, ma trascinando nello XAML un nuovo usercontrol Cider SP1 non aggiunge in namespaces: Peccato smile_sad

Segnalazione del punto di errore direttamente nello XAML!
Quante volte a causa di un banale errore di battitura vi siete ritrovati con una bella XAMLParseException e il debugger fermo su InitializeComponent? (fig.4)

image fig.4

finalmente le cose sono cambiate e scoprire il problema diventa decisamente più facile. (fig.5) smile_teeth

image fig.5

Snaplines associate ai margini dei controlli

image Personalmente continuo a preferire quelle di Expression Blend e il designer dei Windows Forms... (fig.6)

 

 

 

fig.6

TabControl e Expander
imageCome già accade da sempre in Blend, anche in Cider SP1 il controllo TabControl mostra il contenuto di ogni singola Tab cliccando la relativa Tab a design time, prima del SP1 solo la Tab principale era visibile (fig.7).
In compenso selezionare l'intero controllo non è un operazione così banale... smile_regular

fig.7

 

imageAnche il controllo Expander è diventato più design-time friendly, in Fig.8 ecco come appare un Expander che ha la  proprietà IsExpanded=False, mentre in Fig.9 l'equivalente pre-SP1.

 

 

fig.8 
 image

fig.9

Client-only Framework subset
Questa non è una feature legata esclusivamente a WPF ma vale la pena citarla comunque: nelle proprietà del progetto alla voce Application appare una nuova voce Client-only Framework subset. (fig.10)

image

Tecnicamente la selezione modifica il file .config dell'applicazione aggiungendo un informazione relativa al tipo di pacchettizzazione del framework necessario al funzionamento.

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727" sku="Client"/></startup></configuration>

fig.10
Il concetto di base è: Visto che il framework 3.5 ha ormai delle dimensioni notevoli smile_teeth perchè installare tutta la parte legata al mondo ASP.NET se la mia applicazione non ne farà uso? ecco quindi la nascita di un pacchetto ridotto che conterrà la sola parte client.
Le novità legate a questa particolare versione sono parecchie:

  • Possibilità di brandizzare l'installazione
  • Banners durante il setup
  • Dimensione circa 27 MB
  • Installazione dell'applicazione al termine dell'installazione del Client Framework

Le novità di WPF 3.5 SP1
Ci sono ulteriori novità anche per quanto riguarda direttamente  la parte WPF, partiamo da VirtualizingStackPanel.VirtualizationMode:
La listbox per ottimizzare le risorse associate utilizza utilizza come ItemsPanel un VirtualizingStackPanel il quale "crea" solo gli items effettivamente visibili, in era pre-sp1 gli items generati e non più visibili vengono disposti e ricreati quando necessario mentre ora, attraverso un attached property VirtualizingStackPanel.VirtualizationMode, è possibile "riciclare" gli items creati in precedenza ottimizzando ulteriormente le risorse utilizzate.
Il tutto si ottiene attivando come nello snippet che segue:

<Grid>
 <ListBox VirtualizingStackPanel.VirtualizationMode="Recycling" 
          ItemsSource="{Binding}" Margin="26,28,54,71" Name="listBox1">            
 </ListBox>
</Grid>

sebbene l'esempio faccia riferimento alla listbox va detto che VirtualizingStackPanel si applica in generale a tutti gli ItemsControls che hanno un VirtualizingStackPanel associato come ad esempio il controllo Treeview.

<Grid>
 <TreeView VirtualizingStackPanel.IsVirtualizing="True" 
           ScrollViewer.IsDeferredScrollingEnabled="True"                  
           Height="96" Margin="26,0,60,23" Name="treeView1" VerticalAlignment="Bottom" />
</Grid>

ScrollViewer.IsDeferredScrollingEnabled
Lo snippet precedente fa uso di un altra novità legata agli ItemsControl: La possibilità mediante ScrollViewer.IsDeferredScrollingEnabled di evitare lo scrolling continuo degli items ma di posizionarsi alla posizione corrente al rilascio degli items, utile quando si ha a che fare con liste che contengono notevoli quantità di elementi.

Nuovo parametro StringFormat applicabile alla markup extension Binding
Permette di evitare la creazione di un custom formatter per formattare l'output di dati provenienti via Databinding
Esempio:

<Grid>        
  <TextBlock Text="{Binding ElementName=slider1, Path=Value, StringFormat='Amount: {0:0.000}'}" 
             Height="21" Margin="44,37,65,0" VerticalAlignment="Top" />
  <Slider Value="58" Margin="53,77,50,0" Name="slider1" Height="24" VerticalAlignment="Top" Maximum="100" />
</Grid>

Risultato
image fig.11

Datagrid?
Non ancora, attendere prego...

Non non ho citato la lunga serie di piccole ottimizzazioni, ma a quanto pare questa release dovrebbe velocizzare in maniera apprezzabile tutte le applicazioni WPF semplicemente installando il service pack sulla macchina.

Questa è solo una overview, avremo modo di approfondire i dettagli in seguito...

author: Corrado Cavalli | posted @ lunedì 12 maggio 2008 18.25 | Feedback (1)

Visual Studio 2008 SP1 e .NET Framework SP1 disponibili


WPF_Logo

Visual Studio 2008 SP1 (Beta)
.NET Framework Sp1 (Beta)
Visual Basic 2008 SP1 (Beta)
Visual Studio 2008 Team Foundation Server SP1 (Beta)

Tutti i dettagli qui

author: Corrado Cavalli | posted @ lunedì 12 maggio 2008 18.16 | Feedback (0)

[WCF] This collection already contains an address with scheme http...


Se avete pubblicato un servizio WCF vi sarete sicuramente imbattuti nel errore "This collection already contains an address with scheme http..." e cercando in rete avrete sicuramente trovato la soluzione andando ad aggiungere una custom service host factory come citato da più parti (es: qui)
Finalmente col framework 3.5 è disponibile un alternativa decisamente più pratica: filtrare gli schemi associati da IIS ad un determinato binding direttamente via file .config.
Se ad esempio pubblicate il servizio sul vostro sito web basta aggiungere:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="http://www.mysite.com" />
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    ...
</system.serviceModel>

... ed ecco il servizio nello splendore del suo WSDL. smile_regular

Technorati Tags: ,

author: Corrado Cavalli | posted @ venerdì 9 maggio 2008 18.38 | Feedback (0)

Silverlight Spy


Se vi interessa conoscere tutti i dettagli di pagine contenenti codice Silverlight allora scaricatevi Silverlight Spy grazie al quale potrete analizzarne il logical tree, le risorse, lo XAML e modificare le proprietà dei vari visuals.
Esempio: Partendo da questo XAML:

<UserControl x:Class="SilverlightApplication5.Page"
    xmlns="http://schemas.microsoft.com/client/2007" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <Button Content="Ok" Margin="40" />
    </Grid>
</UserControl>

Silverlight Spy ricostruisce:

image
Logical tree



image 

Per certi versi l'applicazione è ancora immatura (Non riesce a gestire applicazioni medio/grandi) ma è comunque un buon inizio.

author: Corrado Cavalli | posted @ mercoledì 7 maggio 2008 23.04 | Feedback (0)

Microsoft Health Common User Interface


image

"The Microsoft Health Common User Interface (MSCUI) Patient Journey Demonstrator is a vehicle for Microsoft thought leadership in state-of-the-art User Experience for Healthcare applications. It provides exemplar implementations of Microsoft Common User Interface guidance on a Microsoft platform."

Volete un esempio pratico di applicazione Silverlight 2.0 e contemporaneamente un anticipo di come saranno (o almeno mi auguro siano) le applicazioni web di domani? allora cliccate qui.

 

author: Corrado Cavalli | posted @ mercoledì 7 maggio 2008 22.23 | Feedback (0)

[OT] HTC Touch Diamond


HTC Touch Diamond (English, QWERTY, GPS) | Codice eXpansys: 166230



 Ma quanto bello è?

 

 

 

Technorati Tags:

author: Corrado Cavalli | posted @ martedì 6 maggio 2008 23.45 | Feedback (5)

XP Sp3 disponibile


La versione Inglese: http://www.microsoft.com/downloads/details.aspx?FamilyId=2FCDE6CE-B5FB-4488-8C50-FE22559D164E&displaylang=en
La versione Italiana: http://www.microsoft.com/downloads/details.aspx?FamilyId=2FCDE6CE-B5FB-4488-8C50-FE22559D164E&displaylang=it

Rimane da capire perchè la versione Italiana è circa 170 Mb più piccola... smile_regular

Technorati Tags:

author: Corrado Cavalli | posted @ martedì 6 maggio 2008 22.48 | Feedback (1)

EQATEC .NET CF Profiler


Se sviluppate applicazioni basate sul compact framework vi sarete sicuramente resi conto di come sia importante scrivere codice ottimizzato in quanto, a differenza del mondo PC, in ambiente mobile/embedded le risorse sono abbastanza limitate e quindi spesso ci si ritrova con del codice che non "gira" come dovrebbe.
A questo punto l'opera di ottimizzazione parte dall'utilizzare i PowerToys per il CF 3.5 i quali sicuramente aiutano (personalmente trovo molto utile in Remote Perfomance Monitor) ma quando si tratta di capire quale parte del vostro codice causa il cosidetto "collo di bottiglia" si comincia col rimpiangere tools tipo Ants Profiler, YourKit oppure lo stesso Visual Studio 2008 e relativo "Hot Path".
"Per voi che mi capite" segnalo questo interessantissimo tool per il CF: EQATEC Profiler.
Nato da un esigenza diretta degli sviluppatori Equatec, a prima vista è un pò macchinoso in quanto per funzionare bisogna prima iniettare le informazioni di profiling, copiare le assembly modificate sul device/emulatore, eseguire/chiudere il programma e analizzare il file di log generato, ma il risultato finale è decisamente interessante (in realtà è possibile automatizzare la procedura via post-build action)

Qui trovate un video che spiega brevemente come si usa e questa prima versione pubblica ha qualche limitazione (no generics yet) ma se considerate che il tutto è rigorosamente free, direi che ci si può anche accontentare. smile_teeth

author: Corrado Cavalli | posted @ martedì 6 maggio 2008 22.12 | Feedback (0)

WPF Transitionals


Su Codeplex è apparso un interessante progetto chiamato Transitionals.
Il progetto consiste in una libreria che permette di applicare degli effetti di transizione da uno usercontrol all'altro il tutto semplicemente modificando il valore della proprietà Content dell'oggetto contenitore TransitionElement.
Ecco un esempio di utilizzo:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
    xmlns:loc="clr-namespace:Transitions"
    xmlns:transc="clr-namespace:Transitionals.Controls;assembly=Transitionals"
    xmlns:transt="clr-namespace:Transitionals.Transitions;assembly=Transitionals"
    x:Class="Transitions.Window1"
    x:Name="Window"
    Title="Transitions"
    Width="640" Height="480">
    <Window.Resources>
        <loc:TransitionContent x:Key="uc1" ImageUri="giulia1.jpg" />
        <loc:TransitionContent x:Key="uc2" ImageUri="giulia2.jpg" />
    </Window.Resources>
    <Grid x:Name="LayoutRoot">
        <Button HorizontalAlignment="Left" Margin="22,0,0,21" x:Name="btnA" VerticalAlignment="Bottom" Width="101" Height="40" Content="A" Click="btnA_Click"/>
        <Button HorizontalAlignment="Left" Margin="154,0,0,21" VerticalAlignment="Bottom" Width="101" Height="40" Content="B" x:Name="btnB" Click="btnB_Click"/>
        <Border Margin="8,8,8,91" BorderBrush="#FF432BDF" BorderThickness="1,1,1,1">
            <transc:TransitionElement x:Name="tc">
                <transc:TransitionElement.Transition>
                    <transt:RotateTransition Angle="45" />
                </transc:TransitionElement.Transition>
            </transc:TransitionElement>
        </Border>
    </Grid>
</Window>


La finestra contiene nelle risorse due istanze di uno usecontrol chiamato TransitionContent composto da una semplice immagine e da una proprietà ImageUri

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Class="Transitions.TransitionContent"
    x:Name="UserControl"
    d:DesignWidth="78" d:DesignHeight="56">
    <Grid x:Name="LayoutRoot">
        <Border>
            <Image x:Name="img1"/>
        </Border>
    </Grid>
</UserControl>

 

namespace Transitions
{
    public partial class TransitionContent
    {
        public static readonly DependencyProperty ImageUriProperty =
                DependencyProperty.Register("ImageUri", typeof(string), typeof(TransitionContent),
                        new FrameworkPropertyMetadata(null,new PropertyChangedCallback(OnImageUriChanged)));

        public string ImageUri
        {
            get { return (string)GetValue(ImageUriProperty); }
            set { SetValue(ImageUriProperty, value); }
        }

        private static void OnImageUriChanged (DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Uri uri = new Uri((string)e.NewValue, UriKind.Relative);
            ((TransitionContent)d).img1.Source = new BitmapImage(uri);
        }      


        public TransitionContent()
        {
            this.InitializeComponent();
        }
    }
}

A questo punto i due pulsanti non fanno altro che assegnare alla proprietà Content di TransitionElement le diverse istanze dello UserControl

public partial class Window1 : Window
{
    public Window1()
    {
        this.InitializeComponent();            
    }

    private void btnA_Click (object sender, RoutedEventArgs e)
    {
        TransitionContent newContent = this.FindResource("uc1") as TransitionContent;
        tc.Content = newContent;
    }

    private void btnB_Click (object sender, RoutedEventArgs e)
    {
        TransitionContent newContent = this.FindResource("uc2") as TransitionContent;
        tc.Content = newContent;
    }
}


Premendo i pulsanti si ha il passaggio da un immagine all'altra con l'effetto rotazione, ma le possibilità offerte dalla libreria non si fermano qui, le transizioni sono parecchie e nella guida sono elencate tutte le varie alternative (es: Transizioni random)
Leggera, semplice da usare: mi piace! smile_regular

Technorati Tags: ,

author: Corrado Cavalli | posted @ mercoledì 30 aprile 2008 8.03 | Feedback (0)