Using Bing SDK in Windows 8 Metro Apps

Vediamo come possiamo utilizzare Bing SDK nelle nostre Metro Style Apps.

Inanzitutto dobbiamo scaricare dal sito Microsoft il package Bing Maps SDK for Windows Store apps a questo indirizzo:  http://visualstudiogallery.msdn.microsoft.com/bb764f67-6b2c-4e14-b2d3-17477ae1eaca, dove troviamo anche alcune indicazioni per noi sviluppatori.

Una volta scaricato/installato il package lo dobbiamo aggiungere come Reference alla nostra applicazione, a questo punto se siamo sviluppatori C# o VB.NET ci manca ancora un requisito obbligatorio, cioè: Microsoft C++ Runtime Package.

Bene, ora che abbiamo tutti gli strumenti che ci servono per sviluppare ci manca ancora il Map Developer Account che possiamo creare sul sito http://www.bingmapsportal.com/.

Qui possiamo accedere con il nostro LiveId così da creare una SecretKey (che ci servira dopo per usufruire del servizio) associata alla nostra App:

Ecco qui una screenshot:

Ora possiammo vedere qualche esempio di codice

Per iniziare dobbiamo mettere come resource la SecretKey così che sia sempre disponibile nella nostra App (possiamo usare il App.xaml):

Adesso non ci rimane che mettere il controllo Map via XAML in questo modo:

L’App di esempio che ho fatto mette a disposizione quattro funzionalità nell’AppBar:

ZoomIn (fattore di ingrandimento sulla mappa)
ZoomOut (fattore di ridimensionamento sulla mappa)
SetLocation (posizione attuale)
ChangeView  (cambio di vista)

Qui una screenshot completa:

Adesso vediamo il codice che serve per le funzionalità sopra alencate.

ZoomIn / ZoomOut

Per fare questo tipo di operazioni sulla mappa, molto semplicemente ci basta accedere all’oggetto mappa definito prima e impostare il nuovo ZoomLevel che ci interessa e successivamente fare un SetZoomLevel sulla mappa con il nuovo fattore di Zoom.

Ecco come:

Change Map Type

Per cambiare visualizzazione è sufficiente cambiare il valore l’enumerativa  MapType dell’oggetto Map impostato precedentemente.

Ecco un esempio:

Set Location

Per impostare la nostra posizione attuale sulla mappa dobbiare creare un’istanza dell’oggetto Geolocaltor e invocare il metodo async GetGeopositionAsync che a sua volta ci restuirà indietro un oggetto GeoPosition con latitudine e longitudine.

Ora possiamo creare un oggetto Location date le coordinate appena recuperate e fare un SetView sull’oggetto Map creato in precedenza dove ci viene richiesto un oggetto Localtion e il fattore di Zoom che volgliamo.

Ecco un esempio:

Nell’esempio sopra ho aggiunto la possibilità tramite un Tap sulla mappa di impostare un pushpin (come memo.

Ecco il link per scaricare l’esempio.

Buon Divertimento

Maurizio

Using SQLite in Windows 8 Metro Style Apps

Con grande stupore, visto che all’uscita di Windows 8 non era previsto nessun supporto nativo per database, ora è finalmente disponibile una versione del noto database SQLite (precompiled) sia per WinRT che per Windows Phone 8.  🙂

Da ora in poi saremo in grado di sviluppare applicazioni che possono condividere il layer di accesso ai dati basato su SQLite, quindi semplificare l’integrazione tra le due piattaforme: Windows 8 e Windows Phone 8.

Fatta questa premessa, vediamo i passi da seguire per poter integrare SQLite nelle nostre Windows 8 Apps.

Di cosa abbiamo bisogno?

Inanzitutto dobbiamo andare sul sito ufficiale www.sqlite.org alla sezione download scaricare il package per WinRT che si chiama Precompiled Binaries for Windows Runtime ed eseguire l’installazione.

Una volta completata la fase d’installazione possiamo aprire la nostra Windows 8 App e aggiungere la reference al progetto.
Ecco la screenshot:

SQLite ReferenceSe, a questo punto, la nostra applicazione non dovesse compilare, sarebbe dovuto dal fatto che essendo SQLite una libreria di codice nativo dobbiamo impostare dal Configuration Manager di Visual Studio x86 o x64 (e non AnyCPU)  non essendo ancora supportato ARM.


Adesso non ci rimane che scaricare tramite NuGet una libreria chiamata sqlite-net che ci semplifica la vita e fornisce il supporto LINQ per lavorare con i dati e il supporto all’async pattern.
NuGet scaricarà nella root del nostro progetto 2 files: SQLite.cs (supporto sincrono) e SQLiteAsync.cs (supporto asincrono), che sono appunto le classi che ci vengono in supporto per lo sviluppo.

Ora scriviamo del codice:

In questo post vedremo come iniziare a usare SQLite in un App XAML / C#, come creare un database e eseguire delle operazioni CRUD sui dati.

Il primo passaggio è quello di creare un oggetto SQLiteAsyncConnection, o SQLiteConnection (per la versione sicnrona), che identifica la connessione al database.
Ecco un esempio di creazione Db Sincrona:

Ecco un esempio di Creazione Db Asyncrona:
Ora però ci serve almeno una tabella quindi definiamo una classe e andiamo a decorare le Proprietà in questo modo:

In questo esempio possiamo notare alcuni attributi utili per decorare in modoo opportuno la nostra classe:

AutoIncrement: utile per dire a SQLite che quella colonna sarà un numero auto incrementato.
PrimaryKey: serve per identificare una colonna come chiave primaria.

Per creare la tabella appena definita chiamiamo il metodo CreateTableAsync <T>, o CreateTable<T> (per la versione sincrona), per ogni tabella che si desidera creare, dove T è il tipo di dati che andremo a riporre in essa.

Ora ci tocca inserire dei dati e per farlo possiamo usare il metodo InsertAsync, o Insert (nella versione sincrona), che accetta come parametro una istanza di oggetto che andremo a salvare… oppure possiamo usare, in caso di inserimento massivo, InsertAllAsync che accetta come parametro una istanza di un oggetto enumerabile.
Ecco un esempio della versione Asyncrona:
E qui la versione sincrona:

Come si può notare per la versione sincrona ho utilizzato il metodo RunInTransaction che ci permette di scrivere del codice safe e gestire al meglio i nostri dati.

Adesso non ci rimane altro che visualizzare i nostri dati appena inseriti: per farlo possiamo utilizzare il metodo Table<T> e chiamare successivamente  l’extentions ToListAsync (solo nella versione asincrona).
Ecco un esempio della versione asincrona:
E qui la versione sincrona:

….. e ora siamo pronti a integrare SQLite nelle nostre Windows 8 APP! 🙂

Enjoy!

Windows 8, WinRT, Debugging DataBinding Error

Ciao,
giusto oggi mi dicevo… perchè nei progetti Windows Store App non abbiamo a disposizione un meccanismo di debugging per le espressioni di Binding ?

Si, possiamo sempre andare a leggere la finestra di Output per analizzare le segnalazioni che il compilatore ci mette a disposizione così da riuscire a risolvere i nostri problemi, ma possiamo, senza troppa fatica utilizzare le informazioni relative all’errore di binding utilizzando la classe DebugSettings e l’evento BindingFailed.

Il delegato che avremo a disposizione ha come argomento la classe BindingFailedEventArgs che a sua volta espone una proprietà Message che ci permetterà di visualizzare le informazioni sull’errore di data binding.

Ecco un esempio:


partial class App : Application
 {
     public App()
     {       
         DebugSettings.BindingFailed += OnBindingFailed;
     }

     private void OnBindingFailed(object sender, BindingFailedEventArgs e)
     {
         Debug.WriteLine(e.Message);
     }
 }

Maurizio

Windows 8, WinRT, Advanced AppBar with vector icons in XAML

Ciao a tutti,
in quest’articolo vorrei proseguire il discorso sull’uso delle icone per l’AppBar.
Anche se sembra difficile, potrebbe capitare di non trovare un’icona adatta alle proprie necessità tra le 150 circa disponibili di default nel template di Visual Studio 2012.

Se appunto, non siamo fortunati nella ricerca dell’icona che fa per noi, possiamo pensare di utilizzare Metro Studio 2 di SyncFusion http://www.syncfusion.com/downloads/metrostudio che al momento viene dato in licenza gratuita al posto di 499$ 🙂

Metro Studio 2 è un software che mette a disposizione, suddivise per categorie, moltissime icone adatte alle nostre applicazioni MetroStyle e quindi per la AppBar.

Ecco una screenshoot di Metro Studio 2:

Una volta trovata l’icona che più si adatta alle nostre esigenze possiamo andare a eseguire diverse personalizzazioni, tra qui: dimensioni, colore di sfondo, rotazione, colore della shape, etc etc… e quando abbiamo completato possiamo esportare lo XAML che è stato generato.

Ecco un esempio di personalizzazione:

Io direi solo WOW!!! 🙂 ci troviamo una icona vettoriale pronta da inserire in uno stile nel nostro ResourceDictionary 🙂

Ecco un esempio di XAML pronto da esportare:

Qui invece un esempio di stile completo:

Se non vogliamo scaricare Metro Studio 2 esiste anche
http://www.thexamlproject.com/ che permette di ricercare icone ed esportare lo XAML… l’unica differenza è che qui non possiamo personalizzare la nostra icona.

Bene, ora vi mostro un esempio dell’AppBar con l’icona “Collaps” preparata in precedenza:

Bene, credo di avervi raccontato tutto per oggi 🙂
Buon divertimento con le icone
Maurizio

Framework.NET 4.5 to Support Zip File Manipulation Out of the Box

Ciao,

giusto in questi giorni durante la fase di realizzazione di un App per Windows 8, mi sono imbattuto nell’utilizzo di una delle novità del Framework 4.5, haimè poco pubblicizzate, ma che ritengo di notevole interesse, costituita dalla possibilità di manipolare archivi compressi con l’algoritmo Zip classico.

Stiamo parlando di un’aggiunta al già esistente namespace System.IO.Compression che ora viene incontro all’esigenza della gestione di archivi compressi.

Dopo questa prima sperimentazione posso assolutamente dire che questo nuovo namespace è un pò spartano, ma comunque un buon supporto se non abbiamo esigenze particolari, se invece abbiamo la necessità di usare funzionalità avanzate SharpZipLib e DotNetZip rimangono le library di riferimento. 🙂

Ad ampliare System.IO.Compression.dll ora abbiamo a disposizione il namespace System.IO.Compression.FileSystem.dll dove mettiamo in evidenza le classi:

System.IO.Compression.FileSystem.ZipFile
System.IO.Compression.FileSystem.ZipArchive

Partiamo con la classe ZipFile dove troviamo 2 metodi principali:
– CreateFromDirectory
– ExtractToDirectory

I due metodi ci permettono di zippare/upzippare un archivio in una determinata destinazione, vedi esempio qui sotto:

ZipFile.CreateFromDirectory("", "", CompressionLevel.Optimal, true)
ZipFile.ExtractToDirectory("", "")

Il nuovo namespace mette a disposizione due classi chiamate ZipArchive e ZipArchiveEntry, le quali rappresentano, rispettivamente, un archivio Zip e una entry, cioè un singolo elemento dello Zip/Archivio.

La classe ZipFile, vista in precedenza, espone un metodo Open che restituisce un’istanza di ZipArchive.
E’ quindi possibile leggere il contenuto dell’archivio eseguendo una semplice interazione della collezione Entries che risulta essere una ReadOnlyCollection vedi esempio:


using(ZipArchive zip = ZipFile.Open("", ZipArchiveMode.Read))
{
foreach(var item in zip.Entries)
{
Console.WriteLine("FileName: {0} ", item.FullName)
}
}

Ecco le proprietà della classe ZipArchiveEntry:
– FullName (che identifica il path completo del file)
– CompressedLength (dimensione in bytes da compresso)
– Length (la dimensione originaria del file)
– Name (nome senza il path)
– LastWriteTime (data/ora dell’ultima modifica)

Creazione di un Archivio compresso:

using(ZipArchive zip = ZipFile.Open("", ZipArchiveMode.Create))
{
zip.CreateEntry("", CompressionLevel.Optimal)
}

Modificare un archivio Zip esistente aggiungendo o rimuovendo file:

using(ZipArchive zip = ZipFile.Open("", ZipArchiveMode.Update))
{
zip.CreateEntry("", CompressionLevel.Fastest)
ZipArchiveEntry zipEntry = zip.GetEntry("")
zipEntry.Delete()
}

Vista la semplicità di utilizzo non mi soffermerei troppo sulle varie implementazioni mostrate, ma aggiugeree qualche considerazione:
– La classe ZipArchive implementa l’interfaccia IDisposable quindi è consigliato l’utilizzo nel blocco using.
– Durante la creazione di un archivio compresso i file elencati verranno aggiunti allo Zip solo quando il blocco using sarà finalizzato.
– Nella fase di Update di un archivio compresso, le modifiche saranno applicate solo quanto il blocco using sarà finalizzato.

Bene, credo di avervi raccontato tutta la mia esperienza sull’argomento, come accennato prima, il nuovo utilissimo namespace è ancora un pò spartano viste le poche funzionalità a disposizione, ma è comunque un inizio è un buon supporto nell’attesa di una sua estensione nelle prossime versioni del Framework.

Maurizio 🙂

Using Callisto Library and SettingsFlyout !!!!

Ciao,
vediamo come utilizzare il controllo SettingFlyout messo a disposizione dalla Callisto Library per la nostra Settings Charm.

Partendo dal post precedente dove abbiamo parlato e visto come scaricare la Callisto Library ora proviamo ad utilizzarla per realizzare una
Settings Charm per le nostre Windows 8 Apps.

Qui ci mettiamo in ascolto sulla richiesta da parte dell’utente della Setting Pane:

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            SettingsPane.GetForCurrentView().CommandsRequested += OnSettingsPane_CommandsRequested;
            base.OnNavigatedTo(e);
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            SettingsPane.GetForCurrentView().CommandsRequested -= OnSettingsPane_CommandsRequested;
            base.OnNavigatedFrom(e);
        }

Nel delegato andiamo a definire la nostra SettingFlyout:

private void OnSettingsPane_CommandsRequested(SettingsPane sender,SettingsPaneCommandsRequestedEventArgs args)
{
SettingsCommand cmd = new SettingsCommand("", "", (x) =>
{
//nuova SettingsFlyout - CallistoLibrary
SettingsFlyout settings = new SettingsFlyout();

//Configurazione
settings.FlyoutWidth = Callisto.Controls.SettingsFlyout.SettingsFlyoutWidth.Wide;
settings.HeaderBrush = new SolidColorBrush(Color.FromArgb(255, 139, 69, 19));
settings.HeaderText = "

"
settings.Background = new ImageBrush { ImageSource = new BitmapImage(new Uri(@"ms-appx:/Assets/BackgroundImage.png")) };

//Contenuto della SettingsFlyout
settings.Content = new SettingContent();

settings.IsOpen = true;
});
args.Request.ApplicationCommands.Add(cmd);
}

Molto rapidamente abbiamo configurato la nostra Settings Charm creando un nuovo SettingsCommand e definendo al suo interno una SettingsFlyout parte della Callisto Library.

In aggiunta come esempio ho creato una page di contenuto dedicata SettingContent fatta in questo modo:

<Page
x:Class=".SettingContent"
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">

<TextBlock Text="" FontSize="28" Margin="10,0,0,0" />
<TextBox x:Name="" Width="400"
HorizontalAlignment="Left" Margin="10,0,0,0" />

Ecco il risultato finale:

Settings Charm

Settings Charm

Windows 8, WinRT, Privacy and Policy!!!

Ciao a tutti,
per esperienza personale pubblico questo POST!!!! 😦

Se state sviluppando un App per Windows 8 o siete pronti per la fase si Certificazione a parte ricordarvi di leggere tutti i “requirements” necessari per l’approvazione vi ricordo vivamente la Privacy.

La “Privacy” deve apparire in due step:

Description Page pagina di dettaglio del prodotto sullo Store, qui deve comparire un rimando alla Privacy and Policy.

Settings Charm anche qui deve comparire un rimando alla stessa Privacy.

Tutto queste è necessario se la Vostra App utilizza in qualche informazioni personali, condivisione, memorizzazione, etc etc …

Vi ricordo questo, prima di ricevere un bel “Reject” dell’App dopo l’attesa di 7 giorni.

Maurizio 🙂