July 2010 - Posts
Dopo vari (e vani) tentativi di aggiungere una service reference da un progetto Windows Phone 7 (Silverligth) da Visual Studio 2010 e senza ottenere nessun errore durante la “add” ho scoperto che il classico file Reference.cs era vuoto e non erano stati aggiunte le voci al file ServiceReferences.ClientConfig.
Dopo vari prove ho scoperto che evidentemente Visual Studio 2010 non riesce a eseguire l’aggiunta rispetto al subset di funzionalità del .NET Compact Framework rispetto a WCF.
Per risolvere il problema è sufficiente fare la Add Service Reference da Visual Studio Express for Windows Phone.
E’ il primo problema che trovo usando Visual Studio 2010 “Full”.
Hope useful
Con questo post abbiamo quasi finito il porting delle nostre applicazioni e librerie, nonchè le demo e i test alla versione Beta degli SDK.
In questo post ci dedichiamo alle modifiche alle classi del servizio Push Notification
Per la parte teorica fate riferimento ai due articoli di Mighell:
1) http://thinkmobile.it/blogs/mighell/archive/2010/06/18/microsoft-push-notification-service.aspx
2) http://thinkmobile.it/blogs/mighell/archive/2010/06/20/come-funziona-il-push-notification-service-in-windows-phone-7-series.aspx
Tra l’altro Mighell sta producendo un articolo completo che verrà pubblicato subito prima o subito dopo le ferie.
In questo post intanto anticipo le modifiche alle classi per coloro che hanno lavorato con la April CTP.
La classe NotificationChannelExceptionEventArgs è stata sostituita con NotificationChannelErrorEventArgs. La classe espone le informazioni sul tipo di errore, compreso il nuovo meccanismo di segnalazione del livello della batteria che potrebbe inibile l’arrivo di messaggi.
Ad esempio è possibile individuare i seguenti “Errori”; ho tolto dai vari case il nostro codice reale.
La seconda modifica riguarda il metodo BindToShellNotification che è divento BindToShellTile. Questo metodo accetta l’elenco degli Uri ammessi per l’invio di “risorse da remoto”
L’eccezione NotificationChannelExistException è stata rimossa e non sostituita per semplificare il codice che adesso può
1) Cercare se il canale utilizzato è già aperto (classica Find presente anche nella versione di Marzo)
2) Se il canale non viene trovato, si procede alla creazione e al binding verso la Shell
3) Si può testare IsShellTileBound e IsShellToastBound per evitare di legare nuovamente un canale già aperto alla Shell del telefono. Occhio che non si può eseguire un doppio BindToShell. Nel caso si debbano modificare le impostazioni si può eseguire un Unbind tramite il metodo UnbindToShellTile e UnbindToShellToast
La classe ShellEntryPoint è stata rimossa e adesso è possibile assegnare direttamente gli Uri per le risorse/domini esterni.
L’evento ShellNotificationReceived è diventato ShellToastNotificationReceived.
E’ cambiato anche leggermente il formato per inviare notifiche verso il canale.
Per le notifiche Tile occorre indicare (X-Notification class è in realtà opzionale e vale 1)
sendNotificationRequest.ContentType = "text/xml";
sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "token");
sendNotificationRequest.Headers.Add("X-NotificationClass", "<batching interval>");
Il messaggio può essere il seguente:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<wp:Notification xmlns:wp=\"WPNotification\">
<wp:Tile>
<wp:BackgroundImage>path</wp:BackgroundImage>
<wp:Count>count</wp:Count>
<wp:Title>tile</wp:Title>
</wp:Tile>
</wp:Notification>
Per i Toast invece occorre (come sempre X-Notification class è opzionale)
sendNotificationRequest.ContentType = "text/xml";
sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast");
sendNotificationRequest.Headers.Add("X-NotificationClass", "<batching interval>");
e il payload è rimasto invariato.
Ecco un esempio di Tile con immagine che “arriva” da internet di una nostra applicazione:

Stiamo aggiornando una demo che sfrutta il Location Service e colgo l’occasione per indicare le modifiche rispetto alla versione April CTP come nei precedenti post.
La prima modifica è l’assembly da referenziare: adesso è System.Device.dll e prende il posto di Microsoft.Devices. In molti post si trova erroneamente l’informazione che il nuovo assembly è Microsoft.Phone.
L’enum GeoPositionAccuracy non contiene più il settaggio Low. Adesso espone Default e High.
Abbiamo ripubblicato la nuova versione aggiornata al SDK Beta della nostra libreria per simulare il servizio via Mouse: il porting è stato velocissimo. Il tutto, comprese le istruzioni, a partire da quì: http://thinkmobile.it/media/p/7011.aspx
Per quanto riguarda invece il supporto alla NetworkInterface occorre rimuovere la reference a Microsoft.Device, che, come indicato all’inizio del post è stato rimossa. Il nuovo namespace è Microsoft.Phone.Net e l’assembly è Microsoft.Phone.
E’ stato modificato il modo con cui recuperare il tipo di interfaccia: la classe adesso espone una proprietà NetworkInterfaceType al posto del metodo GetNetworkInterfaceType…curioso perchè il cambio era stato introdotto al contrario nella versione di Aprile rispetto a Marzo.
Sono stati modificati, e aggiunti, alcuni elementi dell’enum NetworkInterfaceType.
Altre modifiche riguardano gli eventi che la nostra applicazione o semplicemente la singola pagina subisce durante l’interazione
Abbiamo già accennato in un post precedente che è cambiata la firma del metodo OnNavigatedFrom che riceve adesso un argomento di tipo System.Windows.Navigation.NavigationEventArgs.
Il metodo OnOrientationChaging della classe PhoneApplicationPage è stato rimosso; abbiamo a disposizione solo l’evento OnOrientationChanged: in pratica possiamo intercettare il cambio di orientamento al suo termine e non possiamo intervenire durante la fase.
Anche l’indicazione sull’orientamento viene adesso proposta direttamente nello XAML della page al posto del codice presente nel code behind della April CTP.
Le classe WinodwsPhoneEvents è stata rimossa e sostituita dalla classe PhoneApplicationService.
Il codice seguente non è quindi più valido:
così come non sono più validi gli eventi Paused e Resume che avevamo visto in articoli precedenti.
Gli eventi sono stati sostituiti rispettivamente da Deactivated e Activated e sono già cablati nel codice del template di Visual Studio 2010 Express for Windows Phone.
Un’altra modifica alle librerie introdotta con l’SDK uscito lunedì sera riguarda l’inizializzazione delle applicazioni.
Come si nota dallo screenshot l’inizializzazione viene fatta da un metodo, presente nella classe App derivata da Application, e richiamato dal costruttore della classe stessa.
Il metodo controlla se l’inizializzazione è già stata fatta e in caso negativo crea il Frame per lo splash screen (altra novità introdotta da questa beta). Al termine della “navigazione” viene impostato il RootFrame come RootVisual in modo da eseguire il render dell’applicazione.

Rispetto al post precedente, occorre prestare attenzione al macro find/replace.
Se abbiamo usato la ApplicationBar, presente nel namespace Shell, occorre prestare attenzione al namespace utilizzato.
Questo un esempio corretto con il nuovo SDK Beta
Attenzione anche al fatto che ApplicationBarIconButton ha una nuova proprietà Text che non può essere vuota. Assicurarsi di averla utilizzata o rimpierla di conseguenza.
Attenzione anche ad eventuali override del metodo OnNavigatedTo.
La firma del metodo nella versione di Aprile riceveva un argomento di tipo diverso (occhio che il nome è identico quindi cambia solamente il namespace)
protected override void OnNavigatedTo(Microsoft.Phone.Navigation.PhoneNavigationEventArgs e)
{
base.OnNavigatedTo(e);
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
}
TextBox
Altra cosa di cui mi sono accorto, ma su sarebbe bene indagare più in profondità è l’altezza di defautl rispetto agli stili dei vari TextBox.
Mentre precedentemente il designer inseriva i TextBox con Height fissa a “32”, adesso il nuovo designer inserisce “72” come value fisso.
Utilizzando il Market Place Launcher, in questa versione si scopre qualcosa sul marketplace.
Appena attivato si presenta così:
La visualizzazione panorama consente di scrollare verso destra per mostrare le varie tipologie di applicazione
Cliccando All si accede alla relativa categoria
per ogni applicazione di esempio si notano le informazioni con relativi screenshots
Buon divertimento !
Oggi giornata di upgrade dei vari progetti e demo creati con la versione di Aprile degli strumenti di sviluppo.
Il primo progetto, già pubblicato nella sezione media di ThinkMobile.it e oggetto di alcuni articoli usciti sul sito ThinkMobile.it, IoProgrammo e Html.it, presenta queste problematiche.
Aprendo il progetto che utilizzava il controllo WebBrowser il designer non si apre e alcune delle reference risultano “rotte”.
Proviamo a risolvere i problemi: nella versione Beta hanno modificato molti assembly e namespace spostando, come spesso accade, le classi durante il refactoring.
Reference
Il progetto April CTP si presentava così:
Per prima cosa i seguenti assembly sono stati unificati in un’unica dll denominata Microsoft.Phone:
Microsoft.Phone.Controls
Microsoft.Phone.Controls.Navigation
Microsoft.Phone.Controls.WebBrowser
Microsoft.Phone.Controls.WebBrowserInterop
Microsoft.Phone.Shell
Microsoft.Phone.Notification
Microsoft.Phone.Execution
Microsoft.Phone.Info
Microsoft.Phone.Tasks
Microsoft.Devices
Occorre quindi eliminare tutte le reference verso i vecchi assembly e aggiungere la reference verso i nuovi.
Sono stati notevolmente semplificate anche le dll sia come numero che come namespace. Questo l’elenco delle nuove librerie (da notare in versione 7.0.0.0):
Visto che l’applicazione presentava una semplice finestra con il controllo web browser abbiamo pochi errori nella parte XAML:
Il primo problema deriva ancora dai assembly referenziati nel file MainPage.xaml. Per risolvere a tappeto il problema consiglio di cercare le seguenti definizioni nei vari file xaml e rimpiazzarle con quanto segue:
Cercare:
clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation
Rimpiazzare con:
clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone
Cercare:
clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.WebBrowser
Rimpiazzare con:
clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone
Cercare:
clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone.Shell
Rimpiazzare con:
clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone
Cercare:
clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls
Rimpiazzare con:
clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone
Il terzo problema riguarda il file app.xaml in quanto le risorse nella versione di aprile erano state inserite direttamente nel file. In questa versione sono inserite come risorse nelle librerie. Per prima cosa occorre rimuovere la sezione <App.Resources> e poi occorre sostituire nei vari xaml delle pagine alcuni nomi di risorse.
Anche in questo caso, Jamie Rodriguez del team di sviluppo, come segnalato da Mighell nel suo post, conviene fare un find/replace:
PhoneTextPageTitle1Style -> PhoneTextNormalStyle
PhoneTextPageTitle2Style –> PhoneTextTitle1Style
PhoneTextApplicationNameStyle –> PhoneTextNormalStyle
PhoneTextTitleNameStyle –> PhoneTextTitle1Style
Ci sono altre incompatiilità a cui dedicheremo un post non appena faremo l’upgrade reale.
Nel nostro primo progetto è sufficiente fare Reload Designer per ottenere il nuovo designer con il “vecchio” form:
F5 e via:
Ultimo punto che conviene fixare è il file di definizione del deploy WMAppManifest.xml. Visto che ci sono varie modifiche da fare il consiglio è ricreare il progetto con lo stesso nome in una directory temporanea e copiare il contenuto di questo file direttamente sul progetto reale.
I primi due strumenti che saltano all’occhio dopo l’installazione dei nuovi strumenti di sviluppo sono sicuramente Developer Phone Registration e XAP Deployment. In entrambi i casi, alcune preview erano disponibili come prodotti separati su CodePlex o su altri siti (ci siamo capiti :-)).
Il primo strumento consente di sbloccare un telefono reale per lo sviluppo e necessità del nostro account Windows Live e della connessione fisica via Zune al device. Ricordo che è possibile sbloccare 3 telefoni per lo sviluppo per ogni Windows Live ID.
Lo strumento si presenta così
A meno che non mi sia perso qualcosa i servizi Zune non sono ancora disponibili per l’Italia (al termine del wizard via web infatti ci viene negato l’accesso), ma il software può essere ugualmente scaricato e istallato.
Il secondo strumento è molto comodo per installare una applicazione sul device o sull’emulatore partendo da un file .xap senza ricorrere a Visual Studio: nella nostra azienda (ThinkAhead, azienda del gruppo DevLeap) ad esempio le due persone che lavorano nel marketing non hanno installato Visual Studio (o comunque, giustamente non lo sanno usare), ma possono testare e verificare l’applicazione sull’emulatore installando semplicemente installando lo XAP che arriva dal reparto sviluppo.
Ad esempio prendendo l’interfaccia di esempio dell’accelerometro la cui libreria è stata postata anche su http://thinkmobile.it/media/p/6977.aspx e premendo il tasto deploy lasciando nella combo l’emulatore come target si effettua il deploy:
Una volta completato il deploy, il nuovo emulatore si presenta con l’applicazione installata:

Sono stati appena rilasciati i nuovi strumenti di sviluppo per Windows Phone 7.
Il download è pubblico a partire da questo link: http://www.microsoft.com/express/Downloads/#2010-Visual-Phone.
Per adesso e probabilmente per il resto del periodo beta sono disponibili sono in lingua inglese.
Occorre disinstallare la beta precedente.
Come per la beta precedente, anche questa versione è compatiile con Visual Studio 2010 RTM: è possibile continuare ad usare la versione installata per sviluppare per il telefono sfruttando, ad esempio, il meccanismo di controllo sorgenti aziendale.
Questa versione è compatibile con Expression Blend 4, nel senso che è possibile isntallare la Beta di Expression Blend 4 side by side con Expression Blend 4.
Come giustamente accade in qualunque strumento in Beta, molte sono le modifiche ai namespace, alle classi e alle risorse rispetto alla April CTP.
L’elenco completo, su cui farò un post più preciso appena migrerò una nostra applicazione su N-layer è disponibile nelle release notes: http://download.microsoft.com/download/4/E/A/4EA52332-C6B1-476E-9938-C4F805146AF5/Release%20Notes%20-%20WPDT%20Beta.htm
Girando fra i forum di Windows Phone 7, oggi ho trovato questa notizia e, non so per quale motivo mi è apparsa direttamente tradotta in italiano.
Lascio il testo tradotto, tanto è decisamente chiaro, e, come sempre, divertente:
Microsoft ha ufficialmente inaugurato WinCE7 che ampiamente si crede per essere il nucleo del telefono di Windows 7. Non solo quello, ma hanno fatto un CTP download disponibili. A afferrilo andare a https://connect.microsoft.com/directory/non-feedback, trovare il prodotto "Windows Embedded Compact" e fare clic su Applica (esso verrà automaticamente accettare si). Questo è solo una CTP e RTM quarto trimestre di quest'anno si prevede che il prodotto.
Speriamo che questo aiuterà il processo di porting di hacking WP7.
Ovviamente il “telefono di Windows 7” non è il dispositivo con cui Windows telefona, ma è proptio “Windows Phone 7” :-).
A breve uscira la prima beta di SQL CE 4 come database in-process (come i precedenti) che non ha bisogno di un engine nativo per poter girare. In pratica basta portare dietro gli assembly .NET per far funzionare il tutto.
Altra novità riguarda il supporto per ASP.NET. In pratica diventa un database gratuito e in-process semplice da portare insieme alla applicazione su un hoster.
Info ufficiali: http://weblogs.asp.net/scottgu/archive/2010/06/30/new-embedded-database-support-with-asp-net.aspx
Nelle FAQ si mormora di una versione per Windows Phone 7
Ho pubblicato nella sezione media una nostra libreria interna (http://we.thinkahead.it), ancora in fase di sviluppo, per simulare l'acceletrometro via mouse durante l'utilizzo dell'emulatore.
Il funzionamento è semplice: premere il tasto sinistro del mouse e eseguire il movimento: X e Y si riflettono sull'asse X e Y dell'acceletrometro. Premendo qualunque tasto sulla tastiera del PC il movimento "Su/Giu" va a muovere l'asse Z al posto dell'asse Y.
Per utilizzare la libreria, è' sufficiente effettuare una reference da qualunque progetto Windows Phone 7 verso AccelerometerProxy.dll e utilizzare AccelerometerHelper.GetAccelerometer() per ottenere un riferimento all'acceletrometro via mouse o reale in base alla configurazione del file app.config.
Includere il file app.config nel progetto principale e modificare a piacere la chiave Tolerance per impostare il rapporto di scaling rispetto al movimento del mouse; per Default è 1 ovvero ogni pixel del mouse sposta di 1 il valore dell'accelerometro. Valori ammessi di tipo Double.
Nel caso in cui si usi un valore diverso da "Mouse" nel app.config, se l'acceletrometro standard ha problemi, la libreria esegue un fallback vero il mouse.
N.B. La libreria viene fornita senza nessun supporto. E' la prima versione della nostra libreria interna che abbiamo deciso di condividere ed è ancora in fase di sviluppo. La libreria si basa sulla April CTP Refresh.
Il tutto si scarica da quì: http://thinkmobile.it/media/p/6977.aspx