Technology Experience

.NET World

Programmazione, libri, snippet di codice, articoli tecnici

.NET World

Qualche info in più sul file WMAppManifest.xml

Ogni applicazione per Windows Phone 7 è corredata dal file WMAppManifest.xml, contenuto nel folder Properties della solution di Visual Studio 2010. Questo file è un normalissimo file XML, che contiene un po’ di informazioni inerenti la nostra applicazione.

Il nodo IconPath (all’incirca a riga 5) contiene il path dell’icona piccola della nostra applicazione – l’icona che viene utilizzata nel menù di Windows Phone 7.

Il nodo BackgroundImageURI (suppergiù riga 18) contiene il path dell’icona grande della nostra applicazione – l’icona che viene utilizzata nel menù Start. Questa icona viene utilizzata solamente nel momento in cui l’utente decide di voler metter la nostra applicazione sulla schermata principale di Windows Phone 7 – il menù Start appunto.

Il nodo App (riga 4) contiene diversi informazioni utili:

  • attributo Title (esempio: “Bank Finder”)
  • attributo Author (esempio: “Damiani Liborio Igor”)
  • attributo Description (esempio: “bla bla bla”, e non ho capito dove viene mostrato)
  • attributo Publisher (esempio: “VivendoByte.net”)
  • attributo Genre (esempio: “apps.normal”)

Quest’ultimo riveste un’importanza particolare quando sviluppate giochi – sia Silverlight che XNA. Secondo il documento delle specifiche Microsoft, i giochi devono apparire all’interno dell’hub XBOX Live. Se lasciate “apps.normal” – che è il valore di default, questo non accade.

E’ necessario impostare l’attributo Genre a “apps.games”.

Ho preferito dare un po’ di enfasi, perchè se googlate fate un po’ di difficoltà a trovare questa cosa. Troverete post che dicono di mettere “app.game”, “App.Games”, insomma, una variante infinita di maiuscole/minuscole/plulari/singolari, mentre l’icona della vostra applicazione rimane inchiodata lì dov’è. Fidatevi, mettete “apps.games” e siete a posto. Smile

L’ultimo appunto riguarda il tag Capabilities: all’interno di questo nodo dovete specificare quali funzionalità del telefono WP7 sono richieste dalla vostra applicazione. Quindi, aggiungete un nodo Capability con Name impostato a dovere. Avete bisogno del GPS? Aggiungete ID_CAP_LOCATION. Avete bisogno del microfono? Aggiungete ID_CAP_MICROPHONE. Accelerometro? ID_CAP_SENSORS. E così via. Maggiori informazioni direttamente su MSDN a questo indirizzo.

Questa cosa è importante, perchè una volta sul Marketplace, e prima di acquistare/scaricare l’applicazione, l’utente dovrà essere informato su cosa è richiesto dall’app per funzionare (c’è traffico dati per la rete? mi accende il gps e mi localizza? etc. etc.), e questa cosa – presumo – arriva direttamente dai metadati contenuti nel file WMAppManifest.xml.

Send to Kindle
.NET World

Silverlight ed il download di file

Allora, questo è un problema che mi attanaglia. Considerate la seguente schermata:

IeDownloadFile

E’ una applicazione Silverlight brutta e orribile, con 4 pulsanti. Non c’è uso di M-V-VM, ma il caro e buon vecchio code-behind. Tutti questi pulsanti effettuano il download di un normalissimo file pdf raggiungibile via http.

Cliccando sul pulsante PDF con code behind il codice eseguito è un semplice:

private void button1_Click(object sender, RoutedEventArgs e)
{
    HtmlPage.Window.Navigate(new Uri(URL, UriKind.Absolute));
}

 

Cliccando sul pulsante PDF con timer il codice è il seguente:

private void button2_Click(object sender, RoutedEventArgs e)
{
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(3);
    timer.Tick += (s2, e2) =>
        {
            timer.Stop();
            HtmlPage.Window.Navigate(new Uri(URL, UriKind.Absolute));
        };
    timer.Start();
}

 

Cliccando sul terzo pulsante PDF con javascript il codice è il seguente:

private void button3_Click(object sender, RoutedEventArgs e)
{
    object[] param = new object[1];
    param[0] = URL;
    System.Windows.Browser.HtmlPage.Window.Invoke("openPDF", param);
}

 

Con javascript, viene invocata una funzione ‘openDF’ definita nella pagina .aspx che hosta il plug-in di Silverlight.

Comunque sia, in tutti questi casi elencati sopra, il download del file PDF da parte di Internet Explorer viene inizialmente bloccato per motivi di sicurezza. IE fa apparire una toolbar gialla:

IeDownloadBlocked

Per effettuare il download, dovete dare l’autorizzazione e ripetere l’operazione. Nella mia applicazione scema di oggi non ci sono troppi problemi Smile, ma in un’applicazione reale viene effettuato il refresh della pagina .aspx, e quindi l’utente deve rifare tutto daccapo. Sad smile

L’unica soluzione che ho trovato è stata quella di usare un HyperlinkButton, “templizzato” in modo tale che sulla pagina della nostra applicazione possa apparire (quasi) come un normale Button. Cliccando sul bottone PDF con HyperlinkButton IE non blocca un bel nulla, e fa apparire il classico dialog Apri/Salva.

Ora, però, fate un passettino in avanti: supponiamo che l’url venga generato dinamicamente. Voi cliccate, richiamato un qualcosa-lato-server che genera il PDF, e restituisce al client l’indirizzo http completo. Il controllo HyperlinkButton diventa (quasi) inutile: nello XAML non impostate la proprietà NavigateUri – perchè non la conoscete – voi cliccate ed ovviamente non succede un bel nulla. Nemmeno l’evento Click serve a qualcosa, perchè semplicemente non viene invocato.

E quindi? Se avete consigli, aiuti o qualche dritta, sono tutt’orecchi.

Send to Kindle
.NET World

Video appena registrato della mia app “Prova del Cuoco” per Windows Phone 7

Qualche minuto fa ho registrato un piccolo video della mia applicazione per Windows Phone 7, “La Prova del Cuoco”, pubblicato ovviamente su YouTube.

Video su YouTube

 

E’ una piccola applicazione, sviluppata in un paio di serate, che è stata implementata con:

  1. emulatore Windows Phone 7 (all’inizio) ed un telefono Windows Phone 7 (alla fine)
  2. Visual Studio 2010 Professional + WP7 Developer Tools in RTM
  3. Un servizio WCF hostato sul mio hosting che viene consumato sul device e che mi dice giorno per giorno chi ha vinto
  4. Un backend sviluppato in 15 minuti con ASP.Net Dynamic Data Entities Web Application
  5. Il backend è stato tradotto in italiano per permettere a chi deve usarlo (in breve: mio padre) di inserire velocemente i dati, ogni giorno (in breve: l’ho schiavizzato Smile with tongue out)
Send to Kindle
.NET World

Entity Framework 4, campi NULL/NOT NULL e chiamate ai RIA Services

Questa sera voglio parlarvi di un “dietro le quinte” di Entity Framework, ovvero una particolare situazione che mi è capitata durante le settimane scorse. Per la lettura di questo post assumo che sappiate:

  • cosa sia un database
  • cosa sia Entity Framework
  • cosa sia un’applicazione Silverlight o giù di lì
  • cosa siano i RIA Services

Dunque, cerco di arrivare al sodo in poche linee. Supponiamo di aver disegnato il seguente db:

db_diagram

Questa immagine arriva così com’è dal database diagram di SQL Server Management Studio. Forse è un database di cui avevo già parlato in passato in altri post. Abbiamo una tabella “Teams” contenente un po’ di squadre di calcio, ed abbiamo una tabella “Players” che mantiene l’elenco dei giocatori squadra per squadra. Il campo “IdTeam” della tabella “Players” serve proprio per mantenere questa relazione.

Ora, immaginiamo due scenari perseguibili:

  • la tabella “Players” contiene solo giocatori che effettivamente appartengono ad una squadra
  • la tabella “Players” contiene anche giocatori che NON appartengono ad alcuna squadra

Voi come realizzereste questa cosa? Il modo più semplice è quello di sfruttare in modo opportuno il campo “IdTeam” citato prima. Se “IdTeam” contiene NULL, quel record contiene un giocatore libero (non appartenente a nessuno), altrimenti contiene un ID che fa riferimento ad un Team esistente. Dal punto di vista del database, non ci sono particolari accrocchi da fare: è sufficiente impostare NULL / NOT NULL sul campo “IdTeam” ed il gioco è fatto (ed eventualmente rimuovere il valore predefinito dal campo stesso).

Come si comporta invece Entity Framework in questi due scenari?
Beh, devo dire che si comporta piuttosto bene. Ecco come appare il designer in entrambi i casi:

idTeam_NOT_NULL In questo primo caso, la relazione che lega le due entity è uno a molti.

Se nel designer selezioniamo IdTeam, vediamo che la proprietà Nullable è False.

idTeam_NULL In questo secondo caso, la relazione è 0..1.

Se nel designer selezioniamo IdTeam, vediamo che la proprietà Nullable è (None).

 

Una piccola precisazione. Ci sono almeno due piccole imperfezioni nella funzionalità di Update model from Database del designer di EF:

  1. non si accorge se cancellate un campo da una tabella (per adesso non ci riguarda)
  2. non si accorge se un certo campo diventa NULL / NOT NULL (questo invece ci riguarda eccome!)

Morale: se andate nel Management Studio e cambiate la proprietà Allow Nulls del campo “IdTeam” della tabella “Players”, e poi andate in VS2010 per refreshare il data model di EF, questi rimarrà invariato. Avete due possibilità: o cancellate la tabella e la riaggiungete (fattibile se le cose sono davvero semplici), oppure cambiate semplicemente la proprietà Nullable del campo (quest’ultima strada non l’ho provata).

Comunque sia, alla fine vi ritrovate il data model che rispecchia esattamente la struttura del vostro database.

E con le classi POCO, come siamo messi?
Da quando ho cominciato a lavorare con Silverlight 4 & EF4, ho subito utilizzato la possibilità di persistere oggetti generati tramite il template di classi POCO. Come si comporta questo template nei due casi esaminati sopra? Beh, anche qui la cosa è abbastanza intelligente!

Se il campo “IdTeam” non ammette NULL, allora è la proprietà è un semplice int.
Se il campo “IdTeam” ammette NULL, allora la proprietà IdTeam della nostra classe è una Nullable<int>, ed appare come segue:

public virtual Nullable<int> IdTeam
{
    get { return _idTeam; }
    set
    {
        try
        {
            _settingFK = true;
            if (_idTeam != value)
            {
                if (Team != null && Team.Id != value)
                {
                    Team = null;
                }
                _idTeam = value;
            }
        }
        finally
        {
            _settingFK = false;
        }
    }
}
private Nullable<int> _idTeam;

 

Il codice qui sopra proviene dalla definizione della classe Player.

Caricare dati attraverso i RIA Services

Altro balzo in avanti. Supponiamo adesso di aver chiuso tutto il giro, e di aver implementato una piccola applicazione Silverlight che da qualche parte mostri una ListBox con l’elenco delle squadre: quando l’utente clicca su una squadra, viene eseguito un command che carica i giocatori di quella squadra, e li mostra in un’altra ListBox. Ora – non ci interessa sapere che il tutto è stato fatto con M-V-VM e tutto il resto.

Quello che conta è che da qualche parte il nostro codice sarà una cosa tipo questa:

void loadPlayersCommandExecute(object value)
{
    if (value == null) return;
 
    Team t = value as Team;
 
    TeamsDomainContext dc = new TeamsDomainContext();
    var query = dc.GetPlayersQuery().Where(pl => pl.IdTeam.Equals(t.Id));
    dc.Load<Player>(query, callbackPlayers, null);
}

 

Questo è l’execute del command che carica i giocatori. Arriva in input un object, che è il SelectedItem della ListBox delle squadre.

Domanda per voi: se abbiamo impostato che “IdTeam” ammette NULL (che alla fin fine è lo scenario che ho applicato), questa riga di codice a runtime funziona? Per compilare compila, ma in esecuzione si schianta. E si schianta sull’ultima linea, al momento della chiamata a Load().

Perchè? Notare la clausola Where: la proprietà IdTeam di pl è Nullable<int>, mentre t.Id ritorna int.

In questo caso ho chiamato il metodo Equals su un reference type (Nullable<int>, o int? che dir si voglia), passando come parametro un value type (int). E tutto ciò non va affatto bene. L’exception contiene il seguente messaggio:

Expression of type ‘System.Int32’ cannot be used for parameter of type ‘System.Object’ of method ‘Boolean Equals(System.Object)’

Come risolvere la cosa. Basta sostituire la chiamata a Equals con il più banale ==. Ecco come diventa la query:

var query = dc.GetPlayersQuery().Where(pl => (pl.IdTeam == t.Id));

Ed il gioco è fatto!

Send to Kindle
.NET World

Windows Phone 7 ed il mono-tasking

C’è molto rumore attorno a Windows Phone 7, il sistema operativo che Microsoft sta lustrando e sta promuovendo in lungo e in largo per – credo – il prossimo Natale. Dal punto di vista di noi developer, le cose sono molto interessanti, perchè cellulari con su WP7 possono essere tranquillamente programmati usando il nostro amato .NET Framework.

Scendendo più nel dettaglio, è sufficiente saper sviluppare applicazioni con Silverlight ed il gioco è fatto. Certo, ci sono dei piccoli dettagli da prendere in considerazione, perchè la nostra futura app non gira dentro un browser. Le applicazioni Windows Phone 7 sono applicazioni Silverlight 3 che girano in modalità out-of-browser. Poi bisogna pensare al fatto che – trattandosi di un device mobile – non ci sono tastiere, nè mouse, ma si interagisce con lo screen touch e così via. Le solite cose che per chi ho lavorato con dispositivi mobile non sono una novità.

Se volete scendere ancora più nel dettaglio, invece, vi consiglio di leggere questo post di Corrado, che evidenzia tra le altre cose un aspetto piuttosto importante di WP7: ovvero, questo sistema operativo non è multi-tasking.

Cosa comporta questo per un utente normale? Significa che può aprire una sola applicazione alla volta. Se apriamo l’applicazione “Pippo”, poi premiamo Home per tornare alla schermata iniziale, la nostra applicazione viene chiusa a tutti gli effetti (pare che tombstoned sia il termine ufficiale di Microsoft). Se l’utente riclicca sull’icona della nostra applicazione, dobbiamo fargli credere che in realtà non si sia mai chiusa, ripristinando lo stato esattamente com’era. lo spiega bene Corrado nel post linkato sopra.

Mi fa un po’ storcere il naso questo meccanismo. Ecco un po’ di punti deboli:

  1. bisogna prestare attenzione ad un eventuale splash screen della nostra applicazione: se è davvero un avvio a tutti gli effetti, questi deve apparire. Se l’avvio avviene dopo un tombstone, allora questi NON deve apparire
  2. impossibilità di scrivere applicazioni che girano davvero in background. Ad esempio: su Symbian posso tranquillamente lanciare l’esecuzione di un GPS tracking, che se ne sta lì buono buono a tracciare la posizione e a scrivere il suo file di log, e contemporanemente posso ricevere telefonate, navigare, scrivere un sms: tutto quello che il cellulare può fare
  3. questa decisione è stata presa per risparmiare batteria e limitare i consumi, per salvaguardare il punto di vista dell’utente. Avrei preferito – però – che dicessero che un’app in background può usare solo l’1% del processore, oppure solo 16Mb di RAM, oppure non può accedere allo storage SD, ad esempio. Così si possono scrivere un sacco di belle applicazioni, ma se ne taglia comunque una bella fetta.

Anche durante l’evento DotNetLombardia della settimana scorsa è saltata fuori questa questione. Si ragionava che evidentemente sarà un po’ più scomodo usare Tom Tom Navigator su WP7, perchè se mentre sto guidando arriva una telefonata o un sms, beh, ecco, insomma, Tom Tom si chiude. Certo, si può riaprire, ma non è così rapido come può sembrare. Almeno credo.

Forse però parlo da utente skillato. Magari il target per WP7 studiato da Microsoft non è così esperto. Però vi dico solo una cosa: mio padre, che ha anche lui un Nokia piuttosto evoluto, ha imparato a riconoscere quando un’app è in esecuzione/aperta, perchè accanto alla sua icona ne appare un’altra … una specie di “ingranaggio” (che però dipende dal tema in uso sul cellulare), che indica appunto che quell’applicazione sta girando in background.

Vedremo, io non ho mica la verità in mano!

Send to Kindle
.NET World

Gestire il doppio-click Con Silverlight 4 e MVVM

Grazie al buon Ale forse ho raggiunto una soluzione intelligente e che mi piace. Lo scopo era quello di gestire il doppio-click all’interno di un’applicazione Silverlight 4 senza troppi fronzoli, e potendo sfruttare il tutto in un’ottica Model-View-ViewModel, quindi senza alcun codice nel code-behind delle Page.

Il tutto parte da questo post, segnalatomi questa mattina da Alessandro, appunto. 🙂

Il codice del post implementa un DoubleClickTrigger, da inserire poi come child di un qualsiasi componente grafico della nostra pagina, come StackPanel, TextBlock e così via. Voglio solo riproporre qui solo una parte del codice di quell’articolo, ovvero il gestore dell’evento OnMouseButtonDown:

private void OnMouseButtonDown(object sender, MouseButtonEventArgs e)
{
    if (!timer.IsEnabled)
    {
        timer.Start();
        return;
    }
 
    timer.Stop();
 
    // Qui si scatena il doppio-click, eseguo quello che devo eseguire
}

E’ piuttosto semplice: al primo MouseDown parte un piccolo Timer da 200ms. Se l’utente clicca nuovamente entro questo tempo, significa che è avvenuto un DoubleClick, e quindi raggiungiamo la riga di codice che qui sopra vedete commentata. Se mettessimo una MessageBox.Show(“”);, a tutti gli effetti sul doppio-click appare il vostro messaggio.

In un’ottica M-V-VM, però, sappiamo benissimo che tutto ciò che deve essere eseguito deve essere contenuto nella nostra classe ViewModel. La soluzione in questo caso è usare una attached-property, che permette di attaccare ad un componente grafico una qualsiasi istanza di ICommand, anche dove solitamente non sarebbe possibile. Ed ecco quindi poche righe di codice che lo rendono possibile:

public static class ControlsCommandHelper
{
    public static DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command",
        typeof(ICommand),
        typeof(ControlsCommandHelper),
        new PropertyMetadata(null));
 
    public static void SetCommand(DependencyObject target, ICommand value)
    {
        target.SetValue(ControlsCommandHelper.CommandProperty, value);
    }
 
    public static ICommand GetCommand(DependencyObject target)
    {
        return (ICommand)target.GetValue(CommandProperty);
    }
}

 

A questo punto l’event handler sopra diventa:

private void OnMouseButtonDown(object sender, MouseButtonEventArgs e)
{
    if (!timer.IsEnabled)
    {
        timer.Start();
        return;
    }
 
    timer.Stop();
 
    UIElement element = sender as UIElement;
 
    if (element != null)
    {
        ICommand command = element.GetValue(ControlsCommandHelper.CommandProperty) as ICommand;
 
        if (command != null)
        {
            command.Execute(null);
        }
    }
}

 

Morale: quando avviene un DoubleClick, prendo lo UIElement che ha scatenato l’evento, recupero la sua attached property Command e – se tutto va a buon fine – semplicemente eseguo il comando. In questo caso passo null all’Execute(), altrimenti dovrei gestire anche il CommandParameter.

Quindi, niente code-behind. Il tutto può essere inserito, come dicevo all’inizio, anche all’interno di un DataTemplate di una ListBox, quindi questa tecnica può essere benissimo utilizzata per reagire al doppio-click, lavorando sul SelectedItem della ListBox stessa.

screenshots

Rimane solo il problema dei 200ms, che non mi piacciono perchè dovrebbe essere l’OS che si prende cura di dirmi quando è avvenuto un doppio-click. Anche perchè un utente può andare nel pannello di controllo e allungare/diminuire il tempo considerato per il doppio-click, e così facendo lo ignoro e basta.

Ecco comunque un piccolo codice sorgente che può essere utile.

Send to Kindle
.NET World

Silverlight 4 alla ricerca del doppio-click perduto

E’ da qualche giorno che ho in testa questo post, e lo sto scrivendo nella mia testa, ponderando bene le parole ed i termini da utilizzare. Probabilmente martedì mattina è stata la mia peggior giornata lavorativa da un bel pezzo a questa parte, e vi posso assicurare che ce ne vuole.

Ritengo la mancanza del doppio-click in Silverlight 4 una vera e propria cazzata.

Gli esperti non me ne vogliano, ma dire che SL4 è un framework pensato per il Web e quindi il doppio-click è male, è semplicemente assurdo, vuol dire negare la realtà e vuol dire adeguarsi passivamente a ciò che ci è stato imposto, senza pensare con un po’ di creatività e senza un minimo stimolo a migliorare le cose per il futuro.

Silverlight 4 non è un framework pensato per il Web: SL4 è un framework per la realizzazione di applicazioni distribuite sul Web. Ne usufruite per la maggior parte all’interno del vostro browser, ma girano sul vostro PC e dal punto di vista tecnico sono più vicine ad un’applicazione desktop che ad altro. SL4 è anche il framework che usiamo/useremo in futuro per scrivere applicazioni su Windows Phone 7, e non è affatto detto che siano Web. Con SL4 posso scrivere videogiochi, software per la contabilità personale, per ricordarmi le medicine da prendere, per prendere appunti: applicazioni di qualsiasi tipo. E un’applicazione degna di questo nome deve poter permettere all’utente di interagire con il doppio-click. Punto.

Windows consente l’utilizzo del doppio-click: perchè una mia applicazione SL4 out of browser non dovrebbe permetterlo?

E poi, lasciate che vi dica una cosa: dire che sul Web non si dovrebbe usare il doppio-click a me sembra una regola di usability, e non una questione tecnica o simili. Una regola di usability non dovrebbe essere cablata nel framework che sto utilizzando. Altrimenti di questo passo non dovrebbe permettere di scrivere del testo verde su background verde. Non dovrebbe permettere di inserire più di 5000 elementi in una ListBox. Insomma, certe cose sono e devono essere a carico del developer, e non stupide limitazioni inserite nello strumento tecnologico che si sta utilizzando per il proprio lavoro. Un framework dovrebbe permettere ad un dev di raggiungere il suo scopo, nel bene e nel male: se la mia app è scritta bene e funziona bene, ne venderò 1.000.000 di copie, altrimenti nessuna. E sinceramente decidere di voler usare il doppio-click non mi sembra così male.

Seguendo questo ragionamento, non avrebbero dovuto inserire nemmeno l’evento MouseWheel: avete mai visto un sito Web che gestisce la rotellina del mouse? Se lo avete visto, non era un sito Web: era un’applicazione. Tutti i sw gestiscono la rotellina, per zoomare avanti e indietro. In giochi come Call Of Duty posso cambiare arma, con la rotellina. Posso scrivere app in SL4 che con la rotellina scorrono gli elementi di una ListBox, e poi su quest’ultima non posso gestire un banale e semplice doppio-click?

Lasciate che vi dica un’altra cosa: negli ultimi decenni (2 o 3, non esageriamo) è il modello di programmazione Web che pian piano si è concettualmente spostato verso il modello di programmazione Desktop. Probabilmente sono la persona meno indicata per dirvelo, ma dal punto di vista utente ho visto comparire sul Web modalità di interazione tipiche del desktop: finestre di dialogo modali, drag’n’drop, etc. etc. Anche per noi sviluppatori la cosa è fin troppo evidente: cosa sono le Web Forms se non la trasposizione sul Web delle Windows Forms? Anche nel loro comportamento, intendo dire, copiano in tutto e per tutto una tipica applicazione desktop. E’ giusto che sia così, perchè i due mondi si sono e si stanno avvicinando sempre di più, a volte toccandosi nel caso di Silverlight che – lo ripeto – è a tutti gli effetti un sw locale, che gira sul vostro PC e sfrutta le risorse locali del vostro PC.

Altra questione: ma Silverlight non doveva sin dalla prima release essere allineato al 100% con la sua controparte WPF? Ora, mi rendo conto che non è dal tutto possibile, perchè sono stupido ma non fino a questo punto. Però un conto sono limitazioni tecniche oggettive, un conto è aver stabilito a tavolino che un developer Silverlight non può gestire mai, in nessun caso, un semplice doppio-click. La cosa secondo me divertente è che in WPF posso farlo su qualsiasi controllo, anche dove dal punto di vista della usability sarebbe assurdo: perchè? Perchè è compito del developer fare ciò che è più giusto: nessuno si sognerebbe mai di fare doppio-click su un Button, semplicemente perchè con un Button non si interagisce così. E così via, gli esempi si sprecano.

E poi, teniamo presente che in WPF/Silverlight possono customizzare l’aspetto di ogni controllo. Posso far apparire un Button come una ListBox e viceversa. Posso customizzare ogni cosa. Microsoft mi dà una potenza ed una libertà mai avuta prima, e poi non mi permette per definizione la gestione del doppio-click. Cavolo, ce l’avevo in Visual Basic 4.0 quasi 20 anni fa!!

E non venitemi a dire che – sì, certo – puoi comunque gestirlo: basta contare il tempo in ms tra un click e l’altro. Stiamo scherzando? Con tre click posso creare un’applicazione con i RIA Services, e poi devo passare un giorno intero a gestire due eventi MouseDown contando il tempo per vedere quando e come si scatena un doppio-click. Avendo cura, sia chiaro, di confrontarlo con il tempo impostato nel sistema operativo, altrimenti…

E’ apparsa ieri una scritta in una slide nel’evento GroundZero di DotNetLombardia: “Let brighest developers builds business application”. Sul fatto che io sia un brightest developer è tutto da vedere, ma il focus è che noi developer di applicazioni finali dobbiamo preoccuparci di costruire le applicazioni per far guadagnare le nostre aziende, e non litigare per l’ennesima volta per trovare un workaround ad una evidenza mancanza dello strumento di sviluppo che si sta utilizzando.

La mia paura, tra l’altro, non è tanto ‘sto bendetto doppio-click (che è solo la goccia che ha fatto traboccare il vaso), ma è l’idea che qualcuno là a Redmond, o dove diavolo sta il palazzo dove si sviluppa il .NET Framework, decida a tavolino di togliere questo o quello in base a strane regole che fino al giorno prima non c’erano. Regole di usability, regole dettate dalla moda del momento, senza alcuna certezza che varranno così anche nel futuro.

Insomma, se qualcuno di voi ha voglia di tradurre in inglese questo mio post, lasci pure trasparire un po’ di rabbia e di frustrazione, perchè è esattamente quella che ho provato martedì mattina, e continuerò a provarla ancora per un po’.

Sapete qual’è l’ultima cosa davvero divertente? Non vedo l’ora di leggere le features di SL5, perchè non posso davvero credere che non venga presa in considerazione questa cosa.

Un Igor molto, molto deluso, e che ora può tornare a dormire un pochino.

Send to Kindle
.NET World

Ripristinare i templates di Visual Studio 2010

Da qualche settimana dalla mia installazione di Visual Studio 2010 erano spariti un po’ di templates dalle finestre di dialogo New Project e Add New Item. Non so bene quali di preciso, ma ve ne dico due che di sicuro mi mancavano: il progetto Silverlight Application e l’oggetto Class.

Davvero scomodo. 🙂 La mancanza di Class tra l’altro mi costringeva ad aggiungere al progetto un semplice Code File, per scrivere a mano ogni volta namespace + public partial class, etc. etc.

Stamattina mi sono deciso a risolvere la questione, trovando questo post che risolve il problema. Il post si riferisce a Visual Studio 2008, ma si adatta anche a Visual Studio 2010.

E’ sufficiente eseguire il comando devenv /InstallVSTemplates, ovviamente dalla directory dove avete installato l’IDE di Visual Studio. Il tutto in modalità Administrator.

Adesso finalmente tutto è tornato alla normalità!

Send to Kindle
.NET World

Windows Azure è sempre più presente

A questo link è possibile scaricare i tool per sviluppare su Windows Azure con Visual Studio.

A quest’altro link invece è possibile scaricare un libro di 96 pagina sulla tecnologia Windows Azure (attenzione che il link che ho messo punta direttamente al file pdf, per cui – o aspettate un po’ nel browser – o cliccate col destro e fate un bel “Salva con nome”).

Pian piano Windows Azure sta guadagnando popolarità ed attenzione verso il mondo dei developer.

Chi vivrà, vedrà.

Send to Kindle
.NET World

Un’ottima extension for Visual Studio 2010

Anche io come molti adoro la nuova funzione Extension Manager di Visual Studio 2010, che permette di estendere le funzionalità dell’IDE.

Per chi lavora con WPF/Silverlight, secondo me è irrinunciabile lo XAML Intellisense Presenter (scaricabile da qua): in pratica, migliora l’Intellisense nel designer di VS2010 quando si lavora con lo XAML, che detta così è semplice e magari banale, ma vi posso assicurare che è di una comodità devastante.

Prima feature fra tutte: quando nello XAML appare la classica finestrella dell’Intellisense, adesso è possibile filtrare proprietà ed eventi, oppure applicare filtri custom. Seconda feature fra tutte: quando si dichiara un nuovo namespace nello XAML, il namespace e l’assembly possono essere inseriti premendo le lettere maiuscole che formano il full-qualified-name. Mi spiego meglio: se dovete dichiarare questo prefix toolkit:

xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"

 

è sufficiente premere “SWC” per il namespace, e “SWCT” per il nome dell’assembly. Le caratteristiche di questa extension sono altre, al punto che quando adesso mi sposto sul mio notebook – dove non l’ho ancora installato – si sente un pochino la mancanza.

Send to Kindle