sabato 24 novembre 2012

Recensione: Beginning Windows 8 Application Development

9781118012680 cover.indd

Come molti di voi sanno, sono un appassionato di sviluppo per Windows 8 e, quindi, mi sembra logico recensire questo libro inerente l’argomento.

Tanto per cominciare si tratta di un libro di quasi 600 pagine che copre un pò tutti gli aspetti relativi alla piattaforma di sviluppo Windows Store Apps.

E’ facile comprendere che il termine “Beginning”, associato a quanto detto sopra (le 600 pagine e i molti argomenti coperti), fa immediatamente pensare ad un libro dedicato a chi si avvicina allo sviluppo delle Windows Store Apps e così è.

E’, dunque,  un libro che consente facilmente a chi non sa nulla della piattaforma Windows 8 di avvicinarvisi ed essere pronto per sviscerare in seguito, utilizzando altri testi o la rete, gli argomenti che riterrà più interessanti.

Il libro è suddiviso in tre parti (più un’appendice) che guidano il lettore da praticamente zero fino ad avere un livello sufficiente per cominciare a scrivere applicazioni degne di questo nome.

La prima sezione introduce il lettore all’ecosistema Windows 8 partendo dalla storia dei sistemi operativi Microsoft e continuando attraverso l’utilizzo del nuovo sistema operativo fino ad arrivare all’aspetto architetturale e all’utilizzo di Visual Studio.

La seconda sezione del libro è quella in cui troviamo tutti gli argomenti centrali dello sviluppo delle Windows Store Apps: dai principi del Modern UI Language fino all’utilizzo dei contratti e dei sensori, passando per XAML e HTML5/Javascript.

Interessante la presenza del capitolo relativo ad HTML5 e Javascript (una 50-ina di pagine su come sviluppare applicazioni Windows Store Apps con HTML).

Essenziale ma ben realizzato il capitolo sull’asynchronous programming che abbraccia sia C# che Javascript.

La terza ed ultima parte del libro è dedicata agli aspetti “avanzati” dello sviluppo come l’utilizzo di C++ (capitolo veramente ridotto all’essenziale e, tutto sommato, poco più che introduttivo), concetti avanzati come I background task o le soluzioni ibride, testing e Store.

Al termine di ogni capitolo sono presenti alcune domande a cui il lettore può rispondere e verificare le risposte confrontando con quanto riportato in un capitolo dell’appendice. A mio personale modo di vedere tali domande sono poche e, sostanzialmente, non danno valore aggiunto al libro (si sarebbe potuto dedicare maggior spazio ad alcuni argomenti).

Inoltre, per chi utilizza VB.NET c’è da dire che l’intero libro ha solamente esempi in C# (sono facili da capire ma è giusto segnalarlo).

In definitiva si tratta di un ottimo libro da consigliare a chi si avvicina all’ecosistema delle Windows Store Apps e decisamente poco adatto, invece, a chi vuole approfondire alcuni argomenti in favore di altri.

 

giovedì 22 novembre 2012

L’evento Kinecteer nella sezione Community Showcase di TinyCLR

Vi segnalo la pubblicazione di un post relativo all’evento “Natural User Interface con Kinect e .NET Gadgeteer“ apparso nella sezione “Community Showcase” di TinyCLR.

Potere leggere il post all’indirizzo http://www.tinyclr.com/forum/topic?id=9717 e potete trovate anche il video del Rover Gadgeteer guidato attraverso il Kinect.

 

Technorati Tags: ,,,

martedì 13 novembre 2012

Roma Oggi è sullo Store

Roma Oggi è l’applicazione per Windows8 che mostra, giorno per giorno, gli eventi e gli appuntamenti programmati nella provincia di Roma.

Promotional-Image-414X180

L'applicazione utilizza il set di dati rilasciato dall'ente provinciale romano all’interno dell’'open data "Roma&più - Guida alle meraviglie intorno a Roma" disponibile all'indirizzo http://www.opendata.provincia.roma.it.

WindowsStore_badge_black_en_large_120x376

Vorrei ringraziare Alessandro Scardova per avermi aiutato nella realizzazione del logo (che, per la cronaca, senza il suo aiuto, avrebbe fatto veramente pena!!!).

 

FTBrowser 1.1 is Out!!

Pubblicata sullo store di Windows 8 la versione 1.1 di FTBrowser, client non ufficiale per Fotolia.

In questa versione è stato introdotto il supporto alle country: USA, Germania, Spagna, Francia, Italia, Portogallo e Brasile.

Prossimamente le altre lingue supportate dalla piattaforma Fotolia e le nuove funzionalità di consultazione dello sterminato parco immagini.

WindowsStore_badge_black_en_large_120x376

 

giovedì 1 novembre 2012

I background task di Windows 8 su ioProgrammo di Novembre

Ancora un articolo relativo allo sviluppo per Windows 8 ed in particolare per le Windows Store Apps su ioProgrammo

Questa volta si tratta dei background task.

4-180g

 

martedì 30 ottobre 2012

Windows Phone 8 SDK is out!!!

Finalmente è disponibile per tutti.

Windows Phone 8 SDK è scaricabile per tutti:

http://www.microsoft.com/en-us/download/details.aspx?id=35471

Il link permette il download del web setup, mentre se volete l’ISO potete utilizzare questo:

http://go.microsoft.com/fwlink/?LinkID=257234&clcid=0x409

I requisiti richiesti sono I seguenti:

Supported operating systems:

  • Windows 8, Windows 8 Pro
  • Windows 8 64-bit (x64) client versions

Hardware:

  • 4 GB of free hard disk space
  • 4 GB RAM
  • 64-bit (x64) CPU

Windows Phone 8 Emulator:

  • Windows 8 Pro edition or greater
  • Requires a processor that supports Second Level Address Translation (SLAT)

Attenzione soprattutto al supporto allo SLAT nei vostri PC, perchè, senza quello, non va l’emulatore

Per verificare se potete supportare l’emulatore vi basta andare nel control panel:

SNAGHTML1a480f84

e selezionare il nodo Hyper-V:

SNAGHTML1a493990

Nel mio caso……niente emulatore!!!!

 

Technorati Tags: ,

martedì 9 ottobre 2012

Kinect SDK 1.6: Capire la posizione del Kinect nello spazio

Una delle novità introdotte nella versione 1.6 dell’SDK di Kinect è la possibilità di capire la posizione del Kinect nello spazio.

La classe KinectSensor espone il metodo AccelerometerGetCurrentReading che permette di recuperare il vettore (oggetto di classe Vector4) con le componenti X, Y e Z dell’accelerazione di gravità che agisce sul device.

Per capire la posizione del Kinect basta ricordarsi la regola della mano destra applicata al centro del device (vedi figura).

image

L’asse Z è quello uscente dal Kinect nella direzione dei payer e, di conseguenza, l’asse Y è quello rivolto verso l’alto e l’asse X è quello che, guardando il Kinect, esce verso destra.

Le componenti del vettore risultato sono normalizzare in g (cioè anzichè utilizzare la normale unità di misura m/s2 che è piuttosto asettica, viene utilizzato il g=9.81 m/s2).

Una volta avviato il Kinect (anche senza attivare alcun streaming) possiamo richiamare il metodo sopra citato per ottenere il vettore dell’accelerometro.

Nel progetto allegato al post, abbiamo una windows form in cui un timer, ad ogni secondo, recupera il vettore e visualizza le tre componenti dello stesso:

  1. Private Sub AccelerometerTimerTickHandler(sender As Object, e As EventArgs)
  2.     If Sensor IsNot Nothing AndAlso Sensor.IsRunning Then
  3.         Dim vector = Sensor.AccelerometerGetCurrentReading()
  4.         Me.lblVectorXValue.Text = vector.X.ToString("##0.00000")
  5.         Me.lblVectorYValue.Text = vector.Y.ToString("##0.00000")
  6.         Me.lblVectorZValue.Text = vector.Z.ToString("##0.00000")
  7.     End If
  8. End Sub

Se eseguiamo l’applicazione (che permette la variazione dell’elevation angle e, inizialmente pone tale elevation angle pari a zero) otteniamo:

SNAGHTMLc931cd

Possiamo osservare che I valori delle componenti oscillano anche se il Kinect è fermo e, come detto in precedenza l’unica componente degna di nota è quella lungo l’asse Y (lo zero perfetto nelle componenti X e Z è casuale ma I valori sono sempre molto piccoli in questa situazione).

Se incliniamo il KInect verso il basso (ad esempio impostando –20 gradi l’elevetion angle), osserviamo che la componente Z aumenta in positivo, mentre la componente Y diminuisce:

SNAGHTMLcd0d5c

Il perchè è spiegato con il fatto che dobbiamo considerare il sistema di riferimento X,Y,Z solidale al Kinect come illustrato dalla seguente figura:

image

Il discorso è del tutto analogo se, anzichè “giocare” con l’elevation angle, icliniamo fisicamente il device.

 

lunedì 8 ottobre 2012

Rilasciata la versione 1.6 dell’SDK di Kinect

E’ di oggi l’annuncio del rilascio della nuova versione dell’SDK di Kinect (siamo alla 1.6).

Tante le migliorie apportate (anche se non c’è ancora traccia di getsure recognition) che cercheremo di approfondire in qualche post specifico.

Riporto, brevemente, le novità che potete consultare nel post del blog ufficiale.

  • I dati relativi all’accelerometro interno al sensore sono esposti attraverso delle API. Questo può consentire di individuare la posizione del sensore stesso nello spazio;
  • I dati di profondità sono stati estesi sopra I 4 metri;
  • Possono essere controllati, da codice, I valori di luminosità ed esposizione della video camera interna al sensore, in modo da adattare meglio lo stesso all’ambiente circostante;
  • Lo stream dati relativo all’infrarosso catturato dalla camera ad infrarossi è accessibile via API. Potrebbe essere utilizzato per raccogliere immagini in ambienti con scarsa luminosità

A queste si aggiungono delle migliorie ai developer tools, la compatibilità per Windows8 , Visual Studio 2012 e .NET Framework 4.5 (già con il vecchio SDK si poteva utilizzare Visual Studio 2012 ma con progetti 4.0).

Infine, il sensore può girare anche su macchine virtuali (Hyper-V, VMWare e Parallels).

Per scaricare, sia l’SDK che il developer toolkit, andare all’indirizzo http://www.microsoft.com/en-us/kinectforwindows/develop/developer-downloads.aspx

 

Technorati Tags: ,

Win8@Work: Tutto ciò che avreste voluto sapere sullo sviluppo per Windows 8 e non avete mai osato chiedere!!

Rieccomi qua per segnalarvi l’evento Win8@Work di DomusDotNet.

Una giornata interamente dedicata allo sviluppo per Windows8 ed in particolare alle applicazionei Windows Store Apps.

Win8AtWorkLogo

Quest’anno, come DomusDotNet, abbiamo deciso di focalizzare I nostri eventi più sul pratico che sul teorico. E’ per questo che tutti I nostri eventi di quest’anno saranno caratterizzati dal suffisso “@Work” a testimoniare la volontà di fare vedere come si utilizzano le tecnologie più che parlare di come sono fatte.

Adesso iscrivetevi, perchè non potete dire di non essere stati avvertiti!!! Smile

 

mercoledì 19 settembre 2012

martedì 18 settembre 2012

martedì 21 agosto 2012

FTBrowser è sullo Store di Windows8

FTBrowser, il client Metro non ufficiale di Fotolia, è sullo store di Windows8.

PromotionalImage-414x468

Le funzionalità implementate in questa prima versione prevedono:

  • Visualizzazione delle immagini in evidenza (home page images);
  • Visualizzazione delle gallerie Stagionali;
  • Visualizzazione delle gallerie tematiche;
  • Visualizzazione dei dettagli di una singola immagine.

Il client permette di eseguire ricerche nell’immenso partimonio delle immagini Fotolia e di condividere le immagini tramite social network o mail.

Il client, in questa versione è solo ed esclusivamente in Inglese ma prossimamente verrà rilasaciato anche per altre country. L’utente potrà decidere da settings quale country visualizzare.

Il client utilizza la versione WinRT di FTToolkit (http://fttkrt.codeplex.com) la cui versione beta verrà rilasciata a breve e si affiancherà al toolkit “canonico” già disponibile su codeplex (http://fttk.codeplex.com).

 

sabato 18 agosto 2012

Utilizzare i “contratti” nelle ex Metro Style Apps su ioProgrammo 178

Vi segnalo l’uscita, sul numero di settembre di ioProgrammo, del mio articolo sull’utilizzo dei “contratti” nello sviluppo delle oramai ex Metro Style Apps.

4-178g

 

domenica 12 agosto 2012

Pubblicato il video della mia intervista durante Codemotion

So che non frega niente a nessuno, ma è stato pubblicato il video dell’intervista che ho rilasciato, in qualità di presidente di DomusDotNet durante l’evento Codemotion che si è tenuto a Roma a fine marzo.

 

mercoledì 25 luglio 2012

Articolo su Async/Await su ioProgrammo 177

Vi segnalo il mio articolo sull’utilizzo di Async/Await uscito sul numero di Agosto di ioProgrammo:

ioProgrammo177

Confronto tra le precedenti modalità di implementazione del pattern asincrono in .NET e la nuova modalità del framework 4.5 e  come il compilatore interpreta le nuove parole chiave Async/Await.

 

mercoledì 11 luglio 2012

Metro Style Apps: override dei brush utilizzati nei controlli

Nel precedente post abbiamo visto come sia possibile modificare i colori di background del controllo ToggleSwitch eseguendo, di fatto, l’override dei brush definiti intrinsecamente nello stesso controllo.

La tecnica dell’override delle risorse predefinite può essere utilizzata anche per altri controlli e, in questo post, cercheremo di capire come recuperare i nomi di tali risorse in modo da avere completo controllo sull’aspetto grafico.

Prendiamo ad esempio il controllo XAML HyperLinkButton. Questo controllo visualizza un link ad un URL ed ha 4 differenti colori: il colore normale, il colore assunto quando il mouse è posizionato al di sopra, il colore quando si preme il pulsante sinistro del mouse (o l’utente “tappa” con il dito) e il colore quando è disabilitato.

SNAGHTML2424bb50

Il colore normale è modificabile tramite la proprietà Foreground:

  1. <HyperlinkButton Content="HyperlinkButton" HorizontalAlignment="Left"
  2.                  VerticalAlignment="Top" Margin="50" BorderThickness="2"
  3.                  BorderBrush="White" Foreground="Red" />

Gli altri tre colori (in realtà sono Brush) non sono accessibili da proprietà del controllo e, al momento, dobbiamo ricorrere all’override delle risorse.

Un modo pratico e funzionale per capire quali sono le risorse utilizzate all’interno del controllo per la stilizzazione dello stesso è ricorrere a Blend.

Semplicemente apriamo la pagina (o l’intero progetto) in cui utilizziamo l’HyperlinkButton tramite Blend:

image

e, creiamo una copia del template:

image

Possiamo inserire la copia del template dove vogliamo (tanto, poi rimuoveremo il template stesso), ad esempio all’interno della pagina stessa:

image

Una volta generato la copia del template otteniamo:

image

Se analizziamo la gestione dei VisualState del controllo, possiamo trovare i tre VisualState che ci interessano:

  1. <VisualState x:Name="PointerOver">
  2.     <Storyboard>
  3.         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
  4.             <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource HyperlinkPointerOverForegroundThemeBrush}"/>
  5.         </ObjectAnimationUsingKeyFrames>
  6.     </Storyboard>
  7. </VisualState>
  8. <VisualState x:Name="Pressed">
  9.     <Storyboard>
  10.         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
  11.             <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource HyperlinkPressedForegroundThemeBrush}"/>
  12.         </ObjectAnimationUsingKeyFrames>
  13.     </Storyboard>
  14. </VisualState>
  15. <VisualState x:Name="Disabled">
  16.     <Storyboard>
  17.         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
  18.             <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource HyperlinkDisabledThemeBrush}"/>
  19.         </ObjectAnimationUsingKeyFrames>
  20.     </Storyboard>
  21. </VisualState>

In questi VisualState sono riportati i nomi delle risorse Brush utilizzate dal controllo, ed in particolare:

  • HyperlinkPointerOverForegroundThemeBrush : la risorsa brush utilizzata quando il mouse è posizionato sopra il link;
  • HyperlinkPressedForegroundThemeBrush : la risorsa brush utilizzata quando l’utente clicca con il mouse sul link;
  • HyperlinkDisabledThemeBrush : la risorsa brush utilizzata per il link disabilitato.

In realtà, se andiamo a cercare il tag Setter relativo al Foreground, troviamo anche la risorsa HyperlinkForegroundThemeBrush utilizzata per il foreground.

In questo modo se vogliamo cambiare tutti i brush utilizzati dai nostri HyperLinkButton possiamo ridefinire:

  1. <SolidColorBrush x:Key="HyperlinkForegroundThemeBrush" Color="Blue" />
  2. <SolidColorBrush x:Key="HyperlinkPointerOverForegroundThemeBrush" Color="Red" />
  3. <SolidColorBrush x:Key="HyperlinkPressedForegroundThemeBrush" Color="Green" />
  4. <SolidColorBrush x:Key="HyperlinkDisabledThemeBrush" Color="Yellow" />

e posizionare queste definizioni all’interno delle risorse dell’applicazione (o nell’App.xaml o, meglio in uno dei file xaml che contengono i nostri stili personalizzati).

Con le precedenti risorse otteniamo:

SNAGHTML24568bd9

Ovviamente, la copia del template dell’HyperlinkButton che ci è servita solamente per recuperare i nomi delle risorse può essere tranquillamente rimossa (a meno che non la si voglia personalizzare ulteriormente dal punto di vista grafico).

La tecnica utilizzata può essere, ovviamente, utilizzata anche per altri controlli di cui vogliamo personalizzare l’aspetto grafico (tipicamente i colori) senza ridefinire il template.

 

martedì 10 luglio 2012

Metro Style Apps: cambiare il colore di background del ToggleSwitch

Se utilizziamo il controllo ToggleSwitch all'interno delle nostre applicazioni Metro Style, possiamo notare che il suo colore di background è, di default, quello del tema scelto dall'utente:

image

Purtroppo, se vogliamo modificare tale colore per adattarlo alla palette utilizzata nell’applicazione, non abbiamo a disposizione alcuna proprietà.

Un modo per intervenire in tal senso è ridefinire tre SolidColorBrush all’interno delle risorse.

In particolare, è sufficiente ridefinire I seguenti Brush:

  1. <SolidColorBrush x:Key="ToggleSwitchCurtainBackgroundThemeBrush" Color="Red" />
  2. <SolidColorBrush x:Key="ToggleSwitchCurtainPointerOverBackgroundThemeBrush" Color="Green" />
  3. <SolidColorBrush x:Key="ToggleSwitchCurtainPressedBackgroundThemeBrush" Color="Yellow" />

Nel dettaglio:

  • ToggleSwitchCurtainBackgroundThemeBrush : è il brush utilizzato per il background del toggle attivato:

image

  • ToggleSwitchCurtainPointerOverBackgroundThemeBrush : è il brush utilizzato quando l’utente passa sopra il controllo (con il controllo nello stato On) con il mouse;
  • ToggleSwitchCurtainPressedBackgroundThemeBrush : è il brush utilizzato quando l’utente esegue il click con il mouse sul controllo (e questo è nello stato On).

Al limite, per assurdo, potremmo utilizzare anche una ImageBrush per “colorare il nostro ToggleSwitch:

  1. <ImageBrush x:Key="ToggleSwitchCurtainBackgroundThemeBrush" ImageSource="../Assets/ImmagineSfondo.jpg"></ImageBrush>

l’importante è mantenere l’attributo Key.

 

martedì 19 giugno 2012

MIcrosoft Surface: la presentazione ufficiale

Ecco il video completo della presentazione ufficiale di Microsoft del nuovo tablet Surface, per gli esseri umani (non come noi geek) che se la sono persa live alle 0:30 di stanotte:

Buona visione!!!

 

Signori e signore ecco a voi Microsoft Surface

Presentato ieri il tablet Microsoft!!

Si chiama Surface e a me piace!! Almeno a livello di linee, poi aspettiamo di provarlo per vedere anche a livello di hardware.

Se vi interessa, questo è il video introduttivo:

Se volete maggiori info potete visitare il sito ufficiale.

Per quanto riguarda le caratteristiche, saranno disponibili due versioni: una con Windows 8 “completo e uno con Windows RT (solo la parte Metro).

Maggiori specifiche nella seguente immagine:

image

Speriamo di poter presto mettere le mani sull’aggeggio in modo da fornire dei riscontri il più possibile oggettivi.

Stay tuned!!!

 

giovedì 31 maggio 2012

Windows 8 App Hall of Fame – Presente!!!!

Sono orgoglioso di appartenere alla masnada di facce da poco di buono presenti nella Hall of Fame italiana di Windows 8!!

Se non siete impressionabili e se avete tempo fateci un giro!!!!

Questo è il link http://it.windows8app.eu/ e la visione è consigliata ad un pubblico adulto! Smile

 

lunedì 21 maggio 2012

Kinect for Windows : Rilasciata la versione 1.5 dell’SDK

Come già promesso in precedenza, Microsoft ha rilasciato oggi la versione 1.5 dell’SDK per Kinect for Windows.

In questo post vi illustrerò cosa abbiamo di nuovo riservandomi posts di approfondimento in seguito.

Innanzitutto, per chi fosse interessato, il download della nuova versione è al link.

Nella pagina di download troverete l’SDK vero e proprio ed il Kinect Toolkit.

Il primo è, evidentemente, il core per lo sviluppo di applicazioni con Kinect mentre il secondo esempi di codice e risorse per semplificare lo sviluppo.

Ma vediamo in dettaglio le novità

  • Rilevamento dello scheletro in modalità seduta: Fornisce la possibilità di monitorare la parte superiore del corpo degli utenti (10 punti di joint) quando la parte inferiore è nascosta (ad esempio diatro una scrivania o un mobile). Utilizzabile anche per riconoscere l'utente quando questo seduto su una poltrona, divano o un altro oggetto inanimato;
  • Miglioramento del rilevamento scheletrico: miglioramenti nella velocità di riconoscimento, nell’ottimizzazione delle risorse e nell’utilizzo della CPU per la modalità di Skeletal Tracking;
  • Possibilità di tracciare il viso: è possibile, utilizzando dei componenti del toolkit, mappare una immagine al di sopra del viso rendendo di fatto possibile una sorta di face tracking. Sono state, inoltre, aggiunte informazioni di orientamento dello scheletro che permettono di capire meglio la posizione nello spazio;
  • Kinect Toolkit: fornisce componenti, librerie, strumenti e altre risorse per semplificare lo sviluppo di applicazioni che utilizzano Kinect;
  • Kinect Studio: semplifica la fase di test delle applicazioni sviluppate con Kinect permettendo di registrare e riprodurre movimenti dell’utente;
  • Riconoscimento vocale: il riconoscimento vocale è stato esteso ad altre nazioni tra cui l’Italia.

I Language Packs nelle varie lingue sono scaricabili all’indirizzo http://www.microsoft.com/en-us/download/details.aspx?id=29864

Nei prossimi post cercheremo di andare a fondo delle novità portando esempi concreti.

Restate connessi!!!!!

 

venerdì 18 maggio 2012

Metro Style Apps – I samples di MSDN e il SuspensionManager

Chi si avvicina al mondo delle Metro Style Apps in questo momento, probabilmente, fa uso smodato dei samples che si trovano al link:

http://code.msdn.microsoft.com/windowsapps/

Coloro che scaricano i samples in VB (ma mi sembra ci sia anche in C#), troveranno un interessante modulo per gestire i dati da salvare su isolated storage per la gestione, ad esempio, della sospensione.

Tale modulo si chiama SuspensionManager e utilizza un Dictionary(Of String, Object) per la memorizzazione dei dati da salvare in sessione.

Sono presenti, poi, due metodi per salvare e recupere il dictionary dall'isolated storage i quali utilizzano un DataContractSerializer per la serializzazione.

Per semplicità riporto il modulo presente nei samples:

  1. ' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. ' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. ' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. ' PARTICULAR PURPOSE.
  5. '
  6. ' Copyright (c) Microsoft Corporation. All rights reserved
  7.  
  8. Imports System.IO
  9. Imports System.Runtime.Serialization
  10. Imports Windows.Storage
  11. Imports Windows.Storage.Streams
  12.  
  13. Module SuspensionManager
  14.     Private sessionState_ As New Dictionary(Of String, Object)
  15.     Private knownTypes_ As List(Of Type) = New List(Of Type)
  16.     Private Const filename As String = "_sessionState.xml"
  17.  
  18.     ' Provides access to the currect session state
  19.     Public ReadOnly Property SessionState As Dictionary(Of String, Object)
  20.         Get
  21.             Return sessionState_
  22.         End Get
  23.     End Property
  24.  
  25.     ' Allows custom types to be added to the list of types that can be serialized
  26.     Public ReadOnly Property KnownTypes As List(Of Type)
  27.         Get
  28.             Return knownTypes_
  29.         End Get
  30.     End Property
  31.  
  32.     ' Save the current session state
  33.     Public Async Function SaveAsync() As Task
  34.         ' Get the output stream for the SessionState file.
  35.         Dim file As StorageFile = Await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting)
  36.         Dim raStream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.ReadWrite)
  37.         Using outStream As IOutputStream = raStream.GetOutputStreamAt(0)
  38.             ' Serialize the Session State.
  39.             Dim serializer As New DataContractSerializer(GetType(Dictionary(Of String, Object)))
  40.             serializer.WriteObject(outStream.AsStreamForWrite, sessionState_)
  41.             Await outStream.FlushAsync
  42.         End Using
  43.     End Function
  44.  
  45.     ' Restore the saved sesison state
  46.     Public Async Function RestoreAsync() As Task
  47.         ' Get the input stream for the SessionState file.
  48.         Try
  49.             Dim file As StorageFile = Await ApplicationData.Current.LocalFolder.GetFileAsync(filename)
  50.             If file Is Nothing Then
  51.                 Exit Function
  52.             End If
  53.             Dim inStream As IInputStream = Await file.OpenSequentialReadAsync
  54.  
  55.             ' Deserialize the Session State.
  56.             Dim serializer As New DataContractSerializer(GetType(Dictionary(Of String, Object)))
  57.             sessionState_ = CType(serializer.ReadObject(inStream.AsStreamForRead), Dictionary(Of String, Object))
  58.         Catch ex As Exception
  59.             ' Restoring state is best-effort.  If it fails, the app will just come up with a new session.
  60.         End Try
  61.     End Function
  62.  
  63. End Module

A parte che, personalmente (ma è gusto personale, quindi opinabile), non amo i moduli vecchio stile, il modulo proposto negli esempi non permette di serializzare eventuali nostre classi.

Questo perchè è previsto l’attributo privato knownTypes_ di tipo List(Of Type) (con relativa properietà esposta) ma, di fatto, non ne viene fatto uso nel DataContractSerializer:

  1. ' Get the output stream for the SessionState file.
  2. Dim file As StorageFile = Await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting)
  3. Dim raStream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.ReadWrite)
  4. Using outStream As IOutputStream = raStream.GetOutputStreamAt(0)
  5.     ' Serialize the Session State.
  6.     Dim serializer As New DataContractSerializer(GetType(Dictionary(Of String, Object)))
  7.     serializer.WriteObject(outStream.AsStreamForWrite, sessionState_)
  8.     Await outStream.FlushAsync
  9. End Using

La modifica da apportare, quindi, per gestire le nostre classi (ovviamente purchè le stesse siano serializzabili) è di comunicare al DataContractSerializer che abbiamo dei tipi che deve conoscere:

  1. ' Get the output stream for the SessionState file.
  2. Dim file As StorageFile = Await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting)
  3. Dim raStream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.ReadWrite)
  4. Using outStream As IOutputStream = raStream.GetOutputStreamAt(0)
  5.     ' Serialize the Session State.
  6.     Dim serializer As New DataContractSerializer(GetType(Dictionary(Of String, Object)), knownTypes_)
  7.     serializer.WriteObject(outStream.AsStreamForWrite, sessionState_)
  8.     Await outStream.FlushAsync
  9. End Using

Per poter, dunque, utilizzare liberamente le nostre classi potremmo, una tantum, aggiungere i nostri tipi ed essere sicuri che il tutto funzioni:

  1. SuspensionManager.Instance.KnownTypes.Add(GetType(Contact))

In allegato al post trovate la solution per Visual Studio 11 Beta con la classe e una modesta interfaccia di prova.