windowsClient http://blogs.ugidotnet.org/danielemulas/category/windowsClient.aspx windowsClient it-IT Daniele Mulas Subtext Version 2.6.0.0 WPF - Ribbon preview http://blogs.ugidotnet.org/danielemulas/archive/2008/12/14/wpf-ribbon-preview.aspx <p>In questo fine settimana ho deciso di approfondire la Ribbon toolbar di Office, per poterla riutilizzare nelle mie interfaccie.</p> <p>Primo passo scaricare la ribbon toolbar disponibile su codeplex a questo indirizzo : <a href="http://www.codeplex.com/wpf/Wiki/View.aspx?title=WPF%20Ribbon%20Preview">WPF Ribbon Preview</a></p> <p>Secondo passo da compiere è sicuramente scaricare l' handsOnLab presente nel sito dedicato al mondo client di microsoft(<a href="http://www.windowsClient.net">www.windowsClient.net</a>) nella sezione learn che illustra,oltre alla Ribbon anche le nuove features del WPF Toolkit ed in particolare del Datagrid. </p> <p>Iniziamo a capire il suo funzionamento.</p> <p>Prima di tutto è necessario dire che la Ribbon è governata attraverso i Ribbon Command che permettono di impostare per ogni sua sezione <br />delle caratteristiche comuni.  <br />Le RibbonCommand sono composte da :</p> <ul> <p>a) <b>LabelTitle</b> <br />b) <b>LabelDescription</b> </p> <p>c) <b>ToolTipTitle</b> </p> <p>d) <b>ToolTipDescription</b> </p> <p>e) <b>ToolTipImageSource</b> </p> <p>f) <b>SmallImageSource</b> </p> <p>g) <b>LargeImageSource</b> </p> <p>h) <b>ToolTipFooterTitle</b></p> <p>i) <b>ToolTipFooterDescription</b></p> <p>l) <b>ToolTipFooterImageSource</b> </p> <p> </p> </ul> <p>Iniziamo ad analizzare le varie sezioni della Ribbon attraverso il suo codice XAML. <br /> <br />Istanziamo una nuova ribbon toolbar all'interno della nostra applicazione : <br /> <br /><font color="#800000">&lt;r:Ribbon &gt;</font></p> <p><font color="#800000">&lt;/r:Ribbon&gt;</font></p> <p>Una prima sezione è sicuramente la Application Menu , ovvero il pulsante dove sono possibili compiere le principali operazioni come il salvataggio del documento, la stampa ecc.. <br />Vediamo come configurarla attraverso il codice : <br /> <br /><font color="#800000">&lt;r:Ribbon.ApplicationMenu&gt;</font></p> <p><font color="#800000">&lt;r:RibbonApplicationMenu&gt; <br /> <br /></font><font color="#000000">Definizione dei command per la Application Menu</font></p> <p><font color="#800000">&lt;r:RibbonApplicationMenu.Command&gt;</font></p> <p><font color="#800000">&lt;r:RibbonCommand</font></p> <p><font color="#800000">Executed="OnCloseApplication"</font></p> <p><font color="#800000">LabelTitle="Application Button"</font></p> <p><font color="#800000">LabelDescription="Close the application."</font></p> <p><font color="#800000">SmallImageSource="images/Coins.png"</font></p> <p><font color="#800000">LargeImageSource="images/Coins.png"</font></p> <p><font color="#800000">ToolTipTitle="Personal Finance Manager"</font></p> <p><font color="#800000">ToolTipDescription="Click here to open or save a checkbook register." /&gt;</font></p> <p><font color="#800000">&lt;/r:RibbonApplicationMenu.Command&gt;</font></p> <p><font color="#800000">&lt;/r:RibbonApplicationMenu&gt;</font></p> <p><font color="#800000">&lt;/r:Ribbon.ApplicationMenu&gt;</font> <br /> <br /></p> <p>Come detto in precedenza ogni sezione della Ribbon viene configurata attraverso i RibbonComand che ne permettono una ampia personalizzazione. <br /> <br />Una volta definito l'aspetto del pulsante è necessario inserire al suo interno i vari Items che andranno a comporre il menù.</p> <p>Per fare questo è necessario definire un <b>RibbonApplicationMenuItem</b> per ogni elemento del menù, ed attraverso i suoi RibbonCommand definirne il <br />suo aspetto. <br /> <br /><font color="#800000">&lt;r:RibbonApplicationMenuItem&gt;</font></p> <p><font color="#800000">&lt;r:RibbonApplicationMenuItem.Command&gt;</font></p> <p><font color="#800000">&lt;r:RibbonCommand</font></p> <p><font color="#800000">LabelTitle="_Close"</font></p> <p><font color="#800000">LabelDescription="Close the Application"</font></p> <p><font color="#800000">Executed="OnCloseApplication" /&gt;</font></p> <p><font color="#800000">&lt;/r:RibbonApplicationMenuItem.Command&gt;</font></p> <p><font color="#800000">&lt;/r:RibbonApplicationMenuItem&gt;</font></p> <p> <br /></p> <p>Definito il menù principale, passiamo a definire la vera RibbonToolbar. La Toolbar si divide in <strong>Tabs - Group - Controls</strong> <br /> <br />Le Tabs vengono utilizzate per inserire delle funzionalità comuni ( come era per le voci File,Modifica,Visualizza dei vecchi menù) <br />I Groups vengono usati all'interno delle tabs per suddividere controlli che sono similiari nelle loro funzioni <br />Controls sono i veri e propri pulsanti che vengono visualizzati. <br /> <br />I Controls possono essere di diverso tipo :</p> <ul> <li><b>RibbonButton</b></li> <li><b>RibbonCheckBox</b></li> <li><b>RibbonToggleButton</b></li> <li><b>RibbonDropDownButton</b></li> <li><b>RibbonSplitButton</b></li> <li><b>RibbonComboBox</b></li> <li><b>RibbonTextBox</b></li> <li><b>RibbonLabel</b></li> <li><b>RibbonSeparator</b></li> <li><b>RibbonToolTip</b></li> </ul> <p>I quali permettono di costruire delle Toolbar con il Look&amp;Feel stile Office 2007 di alta qualità. <br /> <br />Come esempio andiamo ad inserire un RibbonButton all'interno della nostra ToolBar. <br /> <br />Per prima cosa è necessario creare un Tab <br /><font color="#800000"> <br />&lt;r:RibbonTab Label="Banking"&gt;</font></p> <p><font color="#800000">&lt;/r:RibbonTab&gt;</font></p> <p> <br />All'interno del Tab inseriamo il nostro Group <br /> <br /><font color="#800000">&lt;r:RibbonTab Label="Banking"&gt;</font></p> <p><font color="#800000">&lt;r:RibbonTab.Groups&gt;</font></p> <p><font color="#800000">&lt;r:RibbonGroup&gt;</font></p> <p><font color="#800000">&lt;/r:RibbonGroup&gt;</font></p> <p><font color="#800000">&lt;/r:RibbonTab.Groups&gt; <br /> <br /></font><font color="#000000">I ribbon Group, possono essere formattati attraverso delle proprietà che ne consentono di definire come i controlli verranno <br />visualizzati al suo interno. Questo può essere effettuato attraverso la definizione dei <strong>GroupSizeDefinitions. <br /> <br /></strong></font>A questo punto inseriamo il nostro RibbonButton : <br /> <br /><font color="#800000">&lt;r:RibbonButton Name="RibbonButton1" &gt; <br />                                &lt;r:RibbonButton.Command&gt; <br />                                    &lt;r:RibbonCommand <br />                                        LargeImageSource="/img/softwareD_32x32.png" <br />                                        LabelTitle="Help" <br />                                        &gt; <br />            &lt;/r:RibbonCommand&gt; <br />         &lt;/r:RibbonButton.Command&gt; <br />&lt;/r:RibbonButton&gt;</font></p> <p> <br />Così faccendo possiamo andare a costruirci la nostra Ribbon Toolbar che ci consente di dare un aspetto molto professionali alle nostre applicazioni. <br /> <br />Per  maggiori informazioni rimando al sito di windowsclient.net dove, come detto in precedenza, è possibile scaricare un piccolo Hands-On Lab e il suo <br />sorgente dove vengono descritte tutti i passaggi su come configurare il WPF Toolkit e la RibbonToolbar. <br /> <br /><a href="http://windowsclient.net/downloads/folders/hands-on-labs/entry76491.aspx">What’s Coming in WPF: Datagrid, Ribbon, and VSM</a></p><img src="http://blogs.ugidotnet.org/danielemulas/aggbug/94928.aspx" width="1" height="1" /> Daniele Mulas http://blogs.ugidotnet.org/danielemulas/archive/2008/12/14/wpf-ribbon-preview.aspx Sun, 14 Dec 2008 20:31:54 GMT http://blogs.ugidotnet.org/danielemulas/archive/2008/12/14/wpf-ribbon-preview.aspx#feedback 552 http://blogs.ugidotnet.org/danielemulas/comments/commentRss/94928.aspx http://blogs.ugidotnet.org/danielemulas/services/trackbacks/94928.aspx Ftp Attivo http://blogs.ugidotnet.org/danielemulas/archive/2008/05/10/ftp-attivo.aspx Per un progetto di cui mi sono occupato in azienda ho avuto la necessità di interfacciare la mia applicazione con un dispositivo elettronico, il quale comunica con l'esterno tramite un server FTP.<br /> <br /> Com'è noto il protocollo comuica con la porta 21 e la prima operazione da compiere è l'autenticazione. <br /> <br /> <br /> <table cellspacing="1" cellpadding="1" width="600" bgcolor="#efefef" summary="" border="0"> <tbody> <tr> <td><font color="#0000ff" size="2"><font color="#0000ff" size="2">Private </font></font><font size="2">tpTcpClient </font><font color="#0000ff" size="2"><font color="#0000ff" size="2">As</font></font><font size="2"> TcpClient<br /> </font> <font size="2">ftpTcpClient = </font><font color="#0000ff" size="2"><font color="#0000ff" size="2">New</font></font><font size="2"> TcpClient(strftpLogin, 21)</font></td> </tr> </tbody> </table> <br /> A questo punto dobbiamo inviare dei comandi con i quali comunichiamo le nostre credenziali di accesso :<br /> <br /> <table cellspacing="1" cellpadding="1" width="600" bgcolor="#efefef" summary="" border="0"> <tbody> <tr> <td> <p><font size="2"><font size="2">ResponseStream = ftpTcpClient.GetStream<br /> strCommand = </font><font color="#a31515" size="2"><font color="#a31515" size="2">"USER "</font></font><font size="2"> + strName + vbCrLf<br /> bteSendBytes = Encoding.ASCII.GetBytes(strCommand)<br /> ResponseStream.Write(bteSendBytes, 0, bteSendBytes.Length)</font></font></p> </td> </tr> </tbody> </table> <p>Per permettere al server FTP di darci una risposta al comando dobbiamo attedere una frazione di secondo prima dell'invio della password<br /> <br /> </p> <p> </p> <table cellspacing="1" cellpadding="1" width="600" bgcolor="#efefef" summary="" border="0"> <tbody> <tr> <td><font color="#0000ff" size="2"><font color="#0000ff" size="2"><font size="2"> <p><font color="#000000">Threading.Thread.Sleep(500)</font></p> </font></font></font></td> </tr> </tbody> </table> <p><br /> Ripetiamo le operazioni per la Password <br /> <br /> </p> <p> </p> <table cellspacing="1" cellpadding="1" width="600" bgcolor="#efefef" summary="" border="0"> <tbody> <tr> <td><font size="2"><font size="2"><font size="2">strCommand = </font><font color="#a31515" size="2"><font color="#a31515" size="2">"PASS "</font></font><font size="2"> + strPWD + vbCrLf<br /> Array.Clear(bteSendBytes, 0, bteSendBytes.Length)<br /> bteSendBytes = Encoding.ASCII.GetBytes(strCommand)<br /> ResponseStream.Write(bteSendBytes, 0, bteSendBytes.Length)</font></font></font></td> </tr> </tbody> </table> <p><br /> A questo punto se tutto è andato a buon fine dovremmo essere connessi al dispositivo che rimane in attesa di un nostro comando.<br /> <br /> Il protocollo FTP ha due metodi comunicazione attivo e passivo. <br /> <br /> La differenza fondamentale è che nel caso di comunicazione passiva è il server a comunicare al client attraverso il comando PASV la porta di comunicazione nel quale verrà instaruata la comunicazione, mentre nel caso di ftp attivo è il client ad indicare al server attraverso il comando PORT la porta di comunicazione che rimane in ascolto in attesa di una connessione da parte del server FTP.<br /> <br /> Tipicamente le porte di comunicazione devono essere  &gt; 1023.<br /> <br /> Il disposito lavora con un FTP di tipo attivo quindi sarà nostro compito indircargli a quale porta attendiamo la comunicazione :<br /> <br /> <br /> </p> <p> </p> <table cellspacing="1" cellpadding="1" width="600" bgcolor="#efefef" summary="" border="0"> <tbody> <tr> <td><font size="2"><font color="#0000ff" size="2"><font color="#0000ff" size="2">Dim </font></font><font size="2">ipLocale </font><font color="#0000ff" size="2"><font color="#0000ff" size="2">As</font></font><font size="2"> </font><font color="#0000ff" size="2"><font color="#0000ff" size="2">String</font></font><font size="2"> = Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString()<br /> </font><font color="#0000ff" size="2"><font color="#0000ff" size="2">Dim</font></font><font size="2"> Listener </font><font color="#0000ff" size="2"><font color="#0000ff" size="2">As</font></font><font size="2"> </font><font color="#0000ff" size="2"><font color="#0000ff" size="2">New</font></font><font size="2"> TcpListener(IPAddress.Parse(ipLocale), myPortOpen)<br /> Listener.Start()</font></font></td> </tr> </tbody> </table> <p><br /> Inviamo i comandi per richiedere il file desiderato :</p> <p> </p> <table cellspacing="1" cellpadding="1" width="600" bgcolor="#efefef" summary="" border="0"> <tbody> <tr> <td><font size="2"><font color="#0000ff" size="2"><font color="#0000ff" size="2"><font size="2">FTPCommands(ftpStream, </font><font color="#a31515" size="2"><font color="#a31515" size="2">"TYPE I"</font></font><font size="2">, returnMessage)<br /> FTPCommands(ftpStream, </font><font color="#a31515" size="2"><font color="#a31515" size="2">"PORT 192,168,0,3,7,35"</font></font><font size="2">, returnMessage)<br /> FTPCommands(ftpStream, </font><font color="#a31515" size="2"><font color="#a31515" size="2">"RETR "</font></font><font size="2"> + strFilePath, returnMessage)</font></font></font><font size="2"></font></font></td> </tr> </tbody> </table> <br /> A questo punto non ci resta che attendere che il server faccia la sua richiesta di comunicazione alla porta indicata<br /> <br /> <table cellspacing="1" cellpadding="1" width="600" bgcolor="#efefef" summary="" border="0"> <tbody> <tr> <td><font size="2"><font color="#0000ff" size="2"><font color="#0000ff" size="2"><font size="2"><font color="#0000ff" size="2"><font color="#0000ff" size="2"><font color="#000000">If </font> </font></font><font color="#000000" size="2">Listener.Pending </font><font size="2"><font color="#000000" size="2">Then<br /> <br /> </font></font><font color="#000000"><font size="2">dataClient = Listener.AcceptTcpClient()<br /> DownloadStream = dataClient.GetStream<br /> </font><font size="2"><font size="2">ReDim</font></font></font><font size="2"><font color="#000000"> bytDwFile(1024)</font></font><font size="2"><font color="#000000" size="2">Do<br /> </font></font><font color="#000000"><font size="2">lngFileLength = DownloadStream.Read(bytDwFile, 0, 1024)<br /> DwFile.Write(bytDwFile, 0, lngFileLength)<br /> </font><font size="2"><font size="2">Loop</font></font><font size="2"> </font><font size="2"><font size="2">While</font></font></font><font size="2"><font color="#000000"> lngFileLength &gt; 0<br /> <br /> <br /> Listener.Stop()</font></font></font></font></font><font size="2"></font></font></td> </tr> </tbody> </table> <br /> A questo punto abbiamo concluso le operazioni di download non ci resta che salvare il file sul nostro pc.<br /> <br /><img src="http://blogs.ugidotnet.org/danielemulas/aggbug/92601.aspx" width="1" height="1" /> Daniele Mulas http://blogs.ugidotnet.org/danielemulas/archive/2008/05/10/ftp-attivo.aspx Sat, 10 May 2008 13:28:55 GMT http://blogs.ugidotnet.org/danielemulas/archive/2008/05/10/ftp-attivo.aspx#feedback 1385 http://blogs.ugidotnet.org/danielemulas/comments/commentRss/92601.aspx http://blogs.ugidotnet.org/danielemulas/services/trackbacks/92601.aspx