giovedì 22 dicembre 2011

FT: Buon Natale e felice anno nuovo



Eccomi arrivato alla fine di quest'anno, un anno, che sermbrava iniziato bene, ma in realtà nel cammino di ogni giorno, si presentava sempre una salita più dura e complessa della precedente.



Questo periodo, lo adoro tantissimo, per i valoro, per la mia religione e per la gioia, anche se quest'anno il Natale non sarà proprio uno dei più sereni che ho passato.



Soddisfazioni e traguardi quest'anno ne ho raggiunti, ma una certa situazione non mi fa vivere il Natale, come lo è stato in certi anni della mia vita, Natale, che la ritengo come festa di pace, di amore.



Spero che quest'anno Madre Celeste, proprio come dice il caro amico Roberto, aiuta chi dedica il suo tempo ad aiutare il prossimo, ma che ad oggi ancora non si è esaudito questo mio pensiero.



L'anno 2011 sta per finire, e mi auguro che si porti via quelle giornate, quelle situazioni negative, che hanno caratterizzato l'anno, ma soprattutto che hanno portato in me, ferite molto profonde, ferite nell'anima.



L'augurio che voglio dare, è quello di passare un Natale sereno, ma soprattutto di amare e voleter bene il prossimo.



Auguro a tutti, un felice 2012, che salute, felicità ed amore non vi mancano.



L'attività di blogger riprenderà dopo le vacanze natalizie.

martedì 20 dicembre 2011

software gratuito di controllo remoto teamviewer

Il software TeamViewer http://www.teamviewer.com/it/ è un eccellente software per il controllo remoto.
Il software facile da utilizzare, permette di controllare i pc, oppure utilizzarlo in quei contesti in cui bisogna far vedere cosa succede nel proprio schermo in altri computer, un esempio potrebbe essere quello utilizzato nelle classi.
Da questa pagina http://www.teamviewer.com/it/download/index.aspx potete scaricare le varie versioni, tra cui quella portatile, ossia la versione che non richiede nessuna installazione e che può essere utilizzata dalla propria chiavetta.
Per il download e maggiori informazioni, visitate il sito indicato.

mercoledì 14 dicembre 2011

Sito su office manuali e consigli sull'utilizzo di word, excel power point, libre office e tanto altro

Il sito http://www.sos-office.it è un punto di riferimento per tutti coloro che utilizzano il software Microsoft Office (word, excel, outlook, power point, access, ecc) il software gratuito LibreOffice, il cms Joomla ed altri applicativi di uso quotidiano.
Il sito è in lingua italiana, e si trovano interessanti consiglio e guide sull'utilizzo di alcuni software.

lunedì 12 dicembre 2011

XNA utilizzo di un filmato

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_tutorial-xna-utilizzo-di-un-video_1107.aspx



Introduzione
In questo articolo, vedremo come applicare nei nostri video giochi, creati in XNA, un video.
Può capitare, nella realizzazione di un video gioco, che prima di iniziare il gioco, di visualizzare al giocatore un video, una presentazione o altro.
Per utilizzare i video in XNA, ci sono delle classi apposite che gestiscono tali file, ed in particolare, i video di tipo WMV.



Creazione del gioco
Dopo aver creato un nuovo progetto di tipo XNA, aggiungente nella sezione “content”, un file video, (in esplora soluzione, tasto destro sul “content”, “aggiungi” e successivamente la voce “elemento esistente”) il tutto come riportato in figura 1.





Figura 1



Passiamo in visualizzazione codice, in dichiarazione di classe, del nostro gioco, si creano oggetti a livello di classe, in questo modo possiamo gestirle in tutte le fasi del gioco.
Nella dichiarazione di livello di classe, si creano tre oggetti, uno di tipo “Video”, che avrà il compito di gestire il file video, caricato nelle risorse, una classe di tipo “VideoPlay” che verifica ed imposta l’esecuzione del video, ed una classe di tipo texture2D, per visualizzare il nostro filmato.
Qui di seguito si riporta l’esempio di codice delle suddette operazioni.



GraphicsDeviceManager graphics;



SpriteBatch spriteBatch;



//classi per la gestione del video



Video video;



VideoPlayer videoPlayer;



Texture2D videoTexture;







Nell’evento loadcontent, scriviamo il codice per inizializzare gli oggetti, o meglio impostare il filmato e l’oggetto video player.
Riportiamo il codice completo dell’evento LoadContent.




protected override void LoadContent()



{



// Create a new SpriteBatch, which can be used to draw textures.



spriteBatch = new SpriteBatch(GraphicsDevice);



//inizializzo gli oggetti



video = Content.Load<Video>("video");



videoPlayer = new VideoPlayer();



// TODO: use this.Content to load your game content here



}



Nell’evento Update verifichiamo che l’utente ha digitato il tasto “S” in tal caso verifichiamo che il video è fermato, per avviarlo.
La classe video Player, espone diverse proprietà, come lo stato, se farlo eseguirlo in maniera ciclica, senza volume, ed altro ancora.
Mentre il metodo play, che accetta come parametro, un oggetto di tipo video, esegue il video.
Qui di seguito si riporta un esempio di codice, delle suddette operazioni.



protected override void Update(GameTime gameTime)



{



// Allows the game to exit



if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)



this.Exit();



//nel caso che digitato il pulsante A avvio o fermo il video



if (Keyboard.GetState().IsKeyDown(Keys.S))



{



if (videoPlayer.State == MediaState.Stopped)



{



videoPlayer.IsLooped = true;



videoPlayer.Play(video);



}



else



{



videoPlayer.Stop();



}



}



// TODO: Add your update logic here



base.Update(gameTime);



}







Ora dobbiamo scrivere il codice per visualizzare all’utente il nostro video, il tutto lo possiamo fare tranquillamente tramite l’utilizzo della classe “Texture2D”, che tramite il metodo GetTexture, ottiene il video.
Qui di seguito, si riporta il codice completo dell’evento Draw.




protected override void Draw(GameTime gameTime)



{



GraphicsDevice.Clear(Color.CornflowerBlue);



//visualizzo il filmat



if (videoPlayer.State != MediaState.Stopped)



{



videoTexture = videoPlayer.GetTexture();



}



Rectangle schermo = new Rectangle(GraphicsDevice.Viewport.X, GraphicsDevice.Viewport.Y, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);



//verifico che ho le informazioni per visualizzarli usllo schermo



if (videoTexture != null)



{



spriteBatch.Begin();



spriteBatch.Draw(videoTexture, schermo, Color.Azure);



spriteBatch.End();



}



// TODO: Add your drawing code here



base.Draw(gameTime);



}







Ora non ci resta che testare il nostro progetto, tramite il pulsante “F5” e succesivamente all'avvio del gioco, digitate il tasto “S” per avviare il video.




Conclusioni
L'articolo ha voluto fornire le nozioni di base, dell’utilizzo dei video nei nostri giochi, l’uso di questi file è notevolmente semplice, visto le numerose classi che dispone il Framework XNA, per la gestione dei video e non solo.

venerdì 9 dicembre 2011

download Format Factory 2.80 italiano portable USB

Nuova versione del programma Format Factory 2.80 italiano portatile, un programma che permette di convertire i file da un formato ad un altro.
Il programma, non si installa, si usa direttamente, facendo doppio click sul file eseguibile.
Il software è in lingua italiana e facile da utilizzare.
Qui http://www.istitutomajorana.it/index.php?option=com_content&task=view&id=1591&Itemid=33 trovate la pagina per il download e maggiori informazioni.
Complimenti ad Antonio e Silvio, per questi software utilissimi.

giovedì 8 dicembre 2011

Silverlight esportare un datagrid in Excel

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_silverlight-esportare-un-datagrid-in-exc_1110.aspx





Introduzione
Vedremo com esportare il contenuto di un controllo datagrid in formato exel 2007 il tutto tramite il linguaggio di programmazione VB.Net e C#



Creazione del progetto
Si crea un nuovo progetto in Silverlight, in riferimento al linguaggio di proprio interesse.
Dopo aver creato un nuovo progetto, aggiungete nella form, un controllo datagrid.
Prima, di lavorare sulla pagina, si crea una classe, che sarà utilizzata come contenitore di dati, per valorizzare il nostro controllo griglia.
Da esplora soluzione, si crea una nuova classe. Chiamata Persona.
Questa classe, contiene due proprietà nome e cognome.
Qui di seguito si riporta il codice di tale operazione.



VB.Net



Public Class Persona



Property Nome As String



Property Cognome As String



End Class





C#



public class Persona



{



string _nome;



string _cognome;



public string Cognome



{



get { return _cognome; }



set { _cognome = value; }



}



public string Nome



{



get { return _nome; }



set { _nome = value; }



}



}





Terminata la creazione della classe persona si passa alla pagina contenente il nostro controllo datagrid.
Ricordiamo di tenere a false, la proprietà autogeneratecolumns.
Aggiungiamo un pulsante, che ci permetta di visualizzare una finestra di dialogo per poter salvare il nostro file.




Creazione del file di excel
Apriamo un documento Excel, ed impostiamo le colonne, una denominata cognome e l’altra nome, nella riga successiva, impostare i valori, il tutto come illustrato in figura 1.










Figura 1




Salviamo il file in formato excel 2003 xml, ossia formato excel 2003 xml come mostrato in figura 2.








Figura 2




Aprite il file xml in




<Styles>



<Style ss:ID="Default" ss:Name="Normal">



<Alignment ss:Vertical="Bottom"/>



<Borders/>



<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>



<Interior/>



<NumberFormat/>



<Protection/>



</Style>



</Styles>



<Worksheet ss:Name="Foglio1">



<Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="2" x:FullColumns="1"



x:FullRows="1" ss:DefaultRowHeight="15">



<Row>



<Cell><Data ss:Type="String">Cognome</Data></Cell>



<Cell><Data ss:Type="String">Nome</Data></Cell>



</Row>



<Row>



<Cell><Data ss:Type="String">Mat</Data></Cell>



<Cell><Data ss:Type="String">Ema</Data></Cell>



</Row>



</Table>



<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">



<PageSetup>



<Header x:Margin="0.3"/>



<Footer x:Margin="0.3"/>



<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>



</PageSetup>



<Selected/>



<Panes>



<Pane>



<Number>3</Number>



<ActiveRow>1</ActiveRow>



<ActiveCol>2</ActiveCol>



</Pane>



</Panes>



<ProtectObjects>False</ProtectObjects>



<ProtectScenarios>False</ProtectScenarios>



</WorksheetOptions>



</Worksheet>





Modifichiamo due parti relative al foglio 1, la prima è il campo ss:ExpandedRowCount="2" in
ss:ExpandedRowCount="[TotaleRecord]"

La seconda sostitzione la parte relative alle righe dei dati ossia questa




<Row>



<Cell><Data ss:Type="String">Mat</Data></Cell>



<Cell><Data ss:Type="String">Ema</Data></Cell>



</Row>



In
[RigaDati]
In pratica il frammento di codce sarà come riportato qui di seguito



<Styles>



<Style ss:ID="Default" ss:Name="Normal">



<Alignment ss:Vertical="Bottom"/>



<Borders/>



<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>



<Interior/>



<NumberFormat/>



<Protection/>



</Style>



</Styles>



<Worksheet ss:Name="Foglio1">



<Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="[TotaleRecord]" x:FullColumns="1"



x:FullRows="1" ss:DefaultRowHeight="15">



<Row>



<Cell><Data ss:Type="String">Cognome</Data></Cell>



<Cell><Data ss:Type="String">Nome</Data></Cell>



</Row>



[RigaDati]



</Table>



<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">



<PageSetup>



<Header x:Margin="0.3"/>



<Footer x:Margin="0.3"/>



<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>



</PageSetup>



<Selected/>



<Panes>



<Pane>



<Number>3</Number>



<ActiveRow>1</ActiveRow>



<ActiveCol>2</ActiveCol>



</Pane>



</Panes>



<ProtectObjects>False</ProtectObjects>



<ProtectScenarios>False</ProtectScenarios>



</WorksheetOptions>



</Worksheet>







La modifica al modello del file excel, è stata modificata, non ci resta, che aggiungerla al progetto.
Facciamo tasto destro sul nostro progetto, nella finestra esplora soluzione, ed aggiungiamo come elemento esistente.



Stesura di codice
Passiamo in modalità codice della nostra applicazione SiLverlight, aggiungiamo lo spazio dei nomi per la gestione delle classi dei file, stream e risorse.
Qui di seguito si riporta il codice delle suddette operazioni per entrambi i linguaggi.




VB.Net



Imports System.IO



Imports System.Text



Imports System.Windows.Resources





C#



using System.IO;



using System.Text;



using System.Windows.Resources;





Nell’evento load della nostra pagina, carichiamo i dati nella griglia.
Qui di seguito si riporta il codice delle suddette operazioni per entrambi i linguaggi.




VB.Net



Private Sub LayoutRoot_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles LayoutRoot.Loaded



Dim listPersona As New List(Of Persona)



Dim per As New Persona



per.Cognome = "Mattei"



per.Nome = "Emanuele"



listPersona.Add(per)



per = New Persona()



per.Cognome = "Mat"



per.Nome = "Ema"



listPersona.Add(per)



'carico i dati



DataGrid1.ItemsSource = listPersona



End Sub





C#



private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)



{



List<Persona> listPersona = new List<Persona>();



Persona per = new Persona();



per.Cognome = "Mattei";



per.Nome = "Emanuele";





listPersona.Add(per);



per = new Persona();



per.Cognome = "Mat";



per.Nome = "Ema";



listPersona.Add(per);



//carico i dati



dataGrid1.ItemsSource = listPersona;



}







Si crea una funzione, che permette il salvataggio dei dati in formato excel.
La funzione prende il modello del file excel creato in precedenza e lo manipola.
Qui di seguito si riporta il codice di tale operazione.




VB.Net



Private Function CreaFileExcelXml(dati As IEnumerable(Of Persona2))



Dim TotaleRecord As Integer = dati.Count() + 1



Dim sb As New StringBuilder



For Each elemento In dati



sb.AppendLine("<Row>")



sb.AppendFormat("<Cell><Data ss:Type=""String"">" & elemento.Cognome & "</Data></Cell>")



sb.AppendFormat("<Cell><Data ss:Type=""String"">" & elemento.Nome & "</Data></Cell>")



sb.AppendLine("</Row>")



Next



Dim streamRisorsa As StreamResourceInfo = Application.GetResourceStream(New Uri("FileExcel2.xml", UriKind.Relative))



Dim StreamReaderDati As New StreamReader(streamRisorsa.Stream)



Dim streamFile As String = StreamReaderDati.ReadToEnd()



streamFile = streamFile.Replace("[TotaleRecord]", TotaleRecord.ToString())



streamFile = streamFile.Replace("[RigaDati]", sb.ToString())



StreamReaderDati.Close()



Return streamFile



End Function





C#



private string CreaFileExcelXml(IEnumerable<Persona> dati)



{



int TotaleRecord = dati.Count() + 1;



StringBuilder sb = new StringBuilder();



foreach (var elemento in dati)



{



sb.AppendLine("<Row>");



sb.AppendFormat("<Cell><Data ss:Type=\"String\">{0}</Data></Cell>", elemento.Cognome);



sb.AppendFormat("<Cell><Data ss:Type=\"String\">{0}</Data></Cell>", elemento.Nome);



sb.AppendLine("</Row>");



}



StreamResourceInfo streamRisorsa = Application.GetResourceStream(new Uri("FileExcel2.xml", UriKind.Relative));



var StreamReaderDati = new StreamReader(streamRisorsa.Stream);



string streamFile = StreamReaderDati.ReadToEnd();



streamFile = streamFile.Replace("[TotaleRecord]", TotaleRecord.ToString());



streamFile = streamFile.Replace("[RigaDati]", sb.ToString());



StreamReaderDati.Close();



return streamFile;



}





Ora non ci resta che creare il codice da utilizzare nel pulsante di esportazione, che rileverà i dati del controllo datagrid e li esporta in excel



Qui di seguito si riporta delle suddette operazioni.




VB.Net



Private Sub BtnEsporta_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles BtnEsporta.Click



Dim data As String = String.Empty



Dim SaveDialog As New SaveFileDialog()



SaveDialog.DefaultExt = "xml"



SaveDialog.Filter = "XML Files *.xml"



Dim scelta As Boolean? = SaveDialog.ShowDialog()



Dim testo As String = SaveDialog.SafeFileName



If scelta = True Then



Using fs As Stream = CType(SaveDialog.OpenFile(), Stream)



'Ottengo i dati contenuti nel controllo datagrid



Dim listPersone As IEnumerable(Of Persona2) = CType(DataGrid1.ItemsSource, IEnumerable(Of Persona2))



'rilevo lo stream dati relativo al file excel da generare



data = CreaFileExcelXml(listPersone)



'scrivo il file excel



Dim FileByte As Byte() = New System.Text.UTF8Encoding(True).GetBytes(data)



fs.Write(FileByte, 0, FileByte.Length)



fs.Close()



End Using



End If



End Sub





C#



private void BtnEsporta_Click(object sender, RoutedEventArgs e)



{



string data = String.Empty;



SaveFileDialog SaveDialog = new SaveFileDialog();



SaveDialog.DefaultExt = "xml";



SaveDialog.Filter = "XML Files *.xml";



bool? scelta = SaveDialog.ShowDialog();



string testo = SaveDialog.SafeFileName;



if (scelta == true)



{



using (Stream fs = (Stream)SaveDialog.OpenFile())



{



//Ottengo i dati contenuti nel controllo datagrid



IEnumerable<Persona> listPersona = dataGrid1.ItemsSource as IEnumerable<Persona>;



//rilevo lo stream dati relativo al file excel da generare



data = CreaFileExcelXml(listPersona);



//scrivo il file excel



byte[] FileByte = new System.Text.UTF8Encoding(true).GetBytes(data);



fs.Write(FileByte, 0, FileByte.Length);



fs.Close();



}



}



}







Conclusioni
L'articolo ha voluto fornire una tecnica di come esportare il contenuto di una fonte dati, e precisamente di un controllo datagrid, in formato Excel. Tecnica che può tornare utile qualora si devono gestire particolare dati, soprattutto in riferimento ad una intranet.


mercoledì 7 dicembre 2011

XNA You must explicitly specify asset names to resolve the conflict

Nello sviluppare video games, in XNA, può capitare che durante la compilazione, venga visualizzato il seguente errore "More than one output asset is named "c:\do" You must explicitly specify asset names to resolve the conflict".
Questo è dovuto al fatto che abbiamo nella sezione "Content" quella relativa alle risorse, file (immagini, suoni, video, ecc) con lo stesso nome, o meglio la proprietà "Asset" impostato con il valore uguale ad un'altra risorsa.
Cambiando tale valore, tutto funziona corretamente.

domenica 4 dicembre 2011

Evento Dotnetcampus 2012

Da qualche giorno, è on line il nuovo sito di DotnetCampus http://www.dotnetcampus.it/ 2012.
L'evento, rivolto a studenti, ed anche esperti della tecnologia .Net, verrà svolto in 3 città.
A Roma il 21 aprile (Natale di Roma) a Cosenza il 10 marzo e Benevento.
Al momento l'agenda è in fase di preparazione, ma potete partecipare per segnalare l'argomento di vostro interesse.
Per maggiori informazioni ed iscrizioni visitate il sito indicato

giovedì 1 dicembre 2011

Silverlight navigazione tra pagine tramite VB.Net e C#

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_tutorial-silverlight-la-navigazione-tra-_1109.aspx



Introduzione
Dalla versione 3 di Silverlight, sono state introdotte classi e modelli per la creazione di applicazioni in Silverlight che permettono la navigazione, come avviene per le comuni applicazioni web.
In questo articolo, vedremo come creare una semplice applicazione, con un semplice menu di navigazione posto nella parte superiore della nostra applicazione, che tramite i pulsanti posti nella pagina, naviga tra le varie pagine.




Creazione del progetto
Si crea un nuovo progetto di tipo “applicazione Silverlight”, nei modelli presenti c’è anche quello relativo alla navigazione, che fornisce un modello (direi anche ben fatto) di navigazione, ma nell’articolo, vedremo come crearlo da zero, permettendo al lettore di comprendere la tecnica di navigazione.
Fatto ciò, facciamo click sul pulsante ok, e nella finestra successiva, confermiamo le opzioni che ci vengono visualizzate, tenendo conto che la versione di Silverlight che andremo utilizzare è la “4”. A questo punto ci troviamo la nostra pagina vuota.
Aggiungiamo 3 pulsanti, e li posizioniamo in alto, il primo avrà il testo “Pagina 1” il secondo “Pagina 2” ed il terzo il testo “Pagina 3”, mentre la proprietà name, sarà rispettivamente btnPagina1, per il primo, btnPagina2 per il secondo e “btnPagina3” per il terzo.
Ora dobbiamo aggiungere al nostro progetto, i riferimenti alla libreria “System.Windows.Controls” e “System.Windows.Controls.Navigation”, nella finestra esplora soluzione, facciamo click con il pulsante destro sul nome del progetto e nel menu di scelta rapida che ci viene visualizzato, la voce aggiungi riferimenti, nella finestra, selezioniamo la pagina “Net”, tra i vari componenti selezioniamo quelli precedenti elencati, il tutto come mostrato in figura 1.





Figura 1




In questo modo abbiamo aggiunto i riferimenti al nostro progetto.
Nella parte di codice “XAML” andiamo ad aggiungere il riferimento, digitiamo in alto, dopo l’ultimo tag xmlns il codice xmlns e facciamo tramite tastiera, teniamo premuto il pulsante “Ctrl” e poi successivamente una breve pressione alla barra spaziatrice, in modo che ci visualizza gli assembly disponibili, il tutto come mostrato in figura 2.





Figura 2




Verranno visualizzati diversi assembly, noi selezioniamo quello relativo a “System.Windows.controls (system.Windows.controls.Navigation)”.
Ricordiamo di assegnare un alias, in modo che possiamo utilizzarlo nel codice xaml con facilità, per esempio dopo l’attriuti xmlns mettendo i due punti possiamo assegnare un nome.
Qui di seguito si riporta la parte del codice relativa a XAML delle intestazioni.



XAML



<UserControl x:Class="SLNavigazione.MainPage"



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"



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



mc:Ignorable="d"



d:DesignHeight="300" d:DesignWidth="400">









Nella parte di codice XAML, dopo i controlli inseriti precedentemente, aggiungiamo sotto i pulsanti, un controllo border, nel cui interno ci sarà il nostro controllo navigation frame.
Infatti è la classe frame a gestire la navigazione.
Aggiungiamo tre pagine, dalla finestra di esplora soluzione, facciamo click sul nome del progetto e nel menu di scelta rapida che ci viene visualizzato selezioniamo “Aggiungi” e successivamente la voce “Nuovo Elemento”, nella finestra che ci viene visualizzata, facciamo click sul modello “Pagina Silverlight”.
Aggiungiamo al nostro progetto, tre pagine, in ogni pagina, aggiungiamo una label, in modo che impostiamo un testo particolare per verificare la navigazione tra pagine.
Ora nell’evento click del primo pulsante (doppio click sul primo pulsante), scriviamo il codice che ci permette di navigare tra le varie pagine, in particolare, utilizzeremo il metodo “Navigate” dell’oggetto frame.
Qui di seguito si riporta il codice per l’evento click del pirmo pulsante.






VB.Net



Private Sub btnPagina1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnPagina1.Click



frmNavigazione.Navigate(New Uri("/Page1.xaml", UriKind.Relative))



End Sub





C#



private void btnPagina1_Click(object sender, RoutedEventArgs e)



{



frmNavigazione.Navigate(new Uri(@"/Page1.xaml", UriKind.Relative));



}









Lo spostamento tra pagine, può avvenire, anche utilizzando la proprietà content, come riportato qui di seguito, per il pulsante 2, ma in questo caso l’oggetto di navigazione cambia il suo contenuto, ma è da evitare.
Riportiamo a titolo informativo il codice per entrambi i linguaggi.






VB.Net



Private Sub btnPagina2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)



Dim pagina As New Page1()



frmNavigazione.Content = pagina



End Sub



C#



private void btnPagina2_Click(object sender, RoutedEventArgs e)



{



Page2 pagina = new Page2();



frmNavigazione.Content = pagina;



}







Mentre per l’evento click del terzo pulsante, impostiamo dei parametri da passare, in particolare avremo un parametro chiamato id, con un valore numerico. Vedremo successivamente, come rilevare tale valore.
Qui di seguito si riporta l’esempio di codice per entrambi i linguaggi




VB.Net



Private Sub btnPagina3_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnPagina3.Click



frmNavigazione.Navigate(New Uri("/Page3.xaml?ID=5", UriKind.Relative))



End Sub





C#



private void btnPagina3_Click(object sender, RoutedEventArgs e)



{



frmNavigazione.Navigate(new Uri(@"/Page3.xaml?id=5", UriKind.Relative));



}







Qui di seguito riportiamo il codice xaml




<UserControl x:Class="SLNavigazione.MainPage"



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"



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



mc:Ignorable="d"



d:DesignHeight="300" d:DesignWidth="400">





<Grid x:Name="LayoutRoot" Background="White">



<Button Content="Pagina 1" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="btnPagina1" VerticalAlignment="Top" Width="75" Click="btnPagina1_Click" />



<Button Content="Pagina 2" Height="23" HorizontalAlignment="Left" Margin="148,12,0,0" Name="btnPagina2" VerticalAlignment="Top" Width="75" Click="btnPagina2_Click" />



<Button Content="Pagina 3" Height="23" HorizontalAlignment="Left" Margin="313,12,0,0" Name="btnPagina3" VerticalAlignment="Top" Width="75" Click="btnPagina3_Click" />



<Border Name="BordoFinestra" Background="Green" BorderBrush="red" BorderThickness="3" CornerRadius="25" Margin="0,57,0,0">



<Navigation:Frame Name="frmNavigazione" Background="Green" >







</Navigation:Frame>







</Border>



</Grid>



</UserControl>





La classe Frame, contiene diverse proprietà, metodi ed eventi, un evento, che potrebbe interessare è quello per la gestione degli errori.
L’evento “NavigationFailed” che utilizzeremo nella pagina principale, ci permette di gestire i vari errori.
Se facciamo click sul frame, nella finsetra delle proprietà, sono riportati i vari eventi, facciamo click su quello in questione.
Nella visualizzazione codice, scriviamo il codice che permette di visualizzare a video il messaggio di errore.
La proprietà “Handler” impostata a “true” permette che l'evento è stato gestito e che non occorre generare eccezioni.



Qui di seguito si riporta un esempio di codice.





VB.Net



Private Sub frmNavigazione_NavigationFailed(ByVal sender As System.Object, ByVal e As System.Windows.Navigation.NavigationFailedEventArgs) Handles frmNavigazione.NavigationFailed



e.Handled = True



MessageBox.Show(e.Exception.Message)



End Sub



C#



private void frmNavigazione_NavigationFailed(object sender, System.Windows.Navigation.NavigationFailedEventArgs e)



{



e.Handled = true;



MessageBox.Show(e.Exception.Message);



}





Altra proprietà interessante è “Exception” che ci ritorna l’eccezione, mentre la proprietà Uri, il percorso che percorso che ha sollevato l’eccezione.
Quando si aggiungono pagine, viene inserito per default l’evento “OnNavigatedTo” che si scatena quando si passa all’altra pagina, il tutto come riportato qui di seguito





VB.Net



'Viene eseguito quando l'utente passa a questa pagina.



Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)





End Sub





C#



// Viene eseguito quando l'utente passa a questa pagina.



protected override void OnNavigatedTo(NavigationEventArgs e)



{





}







Inoltre abbiamo altri eventi, che ci possono tornare utile, come “OnNavigatedFrom”, che viene eseguita, nel momento in cui non è più la pagina attiva, l’evento “OnNavigatingFrom” nel momento in cui si sta passando ad un’altra pagina,



Nella pagina 3 vediamo come rilevare i valori passati in query string.
Nell’evento OnNavigatedTo, rileviamo se l’oggetto “NavigationContext”, contiene nel querystring il parametro, in modo che possiamo visualizzarlo a video.
Qui di seguito si riporta il codice per entrambi i linguaggi, che permette di rilevare il codice Id passato in query string. Tramite il metodo ContainKey, verifichiamo che esiste tale parametro.




VB.Net



'Viene eseguito quando l'utente passa a questa pagina.



Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)



If NavigationContext.QueryString.ContainsKey("id") = True Then



MessageBox.Show(NavigationContext.QueryString("id"))



End If



End Sub





C#



// Viene eseguito quando l'utente passa a questa pagina.



protected override void OnNavigatedTo(NavigationEventArgs e)



{



if (NavigationContext.QueryString.ContainsKey("id") == true )



{



MessageBox.Show(NavigationContext.QueryString["id"]);



}



}





Alcune proprietà e metodi che possono tornare utili, quelle preposte dalla classe “NavigationSerivces, che ci fornisce interessanti informazioni.
Per esempio la proprietà “CanGoBack” che ci indica se è presente almeno una voce nella cronogia, che tramite il metodo GoBack possiamo visualizzarla, oppure la proprietà “CanGoForward” che permette di sapere se è presente almeno una voce nella cronologia per lo spostamento in avanti, che possiamo utilizzare tramite il metodo “GoForward”.




Conclusioni
L’articolo ha voluto fornire al lettore le basi per la creazione di applicazioni in Silverlight, con navigazione simile a quella che si utilizza per le applicazion web.
Nella nuova versione di Silverlight, la navigazione è molto più semplificata, e rende l’approccio a questa tecnica molto facilitato. Grazie alle classi messe a disposizioni da Silverlight, si possono creare applicazioni anche di un certo livello e complessità, gestendo in un modo ottimale la navigazione.