Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FACOLTÀ DI INGEGNERIA
Corso di Laurea Triennale in Ingegneria Informatica
Relatore: Laureando:
Chiar.mo Prof. Maurizio Fermeglia Matteo Miotto
1
5.4 Data binding.................................................................................................................................. 32
5.4.1 Uso di LINQ to SQL ........................................................................................................ 32
5.4.2 Implementazione del data binding ............................................................................... 33
5.4.3 Data binding a livello di interfaccia utente (XAML) ...................................................... 34
5.4.4 Uso di DataGrid ............................................................................................................. 35
5.4.5 Data binding a livello di codice C# ................................................................................ 37
5.4.6 Navigazione tra record:................................................................................................. 39
5.4.7 Editing di record ............................................................................................................ 40
CAPITOLO 6 - Conclusioni ............................................................................................................................... 42
Bibliografia ....................................................................................................................................................... 43
2
CAPITOLO 1
Introduzione
L’obbiettivo di questa tesi è la progettazione e la realizzazione di un’applicazione che gestisca le attività del
laboratorio MOSE. Le principali attività di tale laboratorio prevedono essenzialmente la gestione dei dati
relativi alle pubblicazioni scientifiche, ma anche a progetti, congressi, tesi, componenti dello staff e corsi.
La situazione iniziale vede l’esistenza di una base di dati e un’applicazione realizzata in ambiente Microsoft
Office Access (in particolare si tratta di un file .ADP, Access Data Project). L’obbiettivo è, dunque, quello di
realizzare un’applicazione, in sostituzione a quella esistente, in grado di gestire le attività del laboratorio
MOSE, operando sulla base di dati esistente.
Ciò che ha motivato la realizzazione di una nuova applicazione è la necessità di svincolarsi dall’ambiente
Microsoft Office Access, sul quale è realizzata la precedente applicazione. Infatti l’esecuzione di tale
applicazione richiede il possesso, da parte dell’utente, della corretta versione di Microsoft Office Access,
nonché della relativa licenza. Inoltre, lo sviluppo di una nuova applicazione offre la possibilità di
riprogettare le modalità di presentazione dei dati e le operazioni da effettuare su di essi, al fine di
migliorare l’organizzazione e l’usabilità dell’applicazione stessa.
L’unico vincolo progettuale fa riferimento all’uso dell’ambiente .NET. Si è scelto, infatti, di sviluppare
l’applicazione utilizzando la tecnologia WPF (Windows Presentation Foundation) e il linguaggio di
programmazione C#.
In questa tesi verranno affrontati tutti i punti dello sviluppo della nuova applicazione, in particolare:
Nel capitolo 2 verranno illustrate le modalità di raccolta e analisi dei requisiti, nonché la loro
presentazione;
Nel capitolo 3 verranno esposti i principi generali seguiti per la progettazione dell’applicazione, con
particolare attenzione all’interfaccia utente, all’organizzazione e alla presentazione dei dati;
Nel capitolo 4 verranno illustrate le modalità d’installazione e configurazione dell’applicazione.
Verrà inoltre esposto un esempio d’uso dell’applicazione;
3
Nel capitolo 5 verranno considerati alcuni dettagli tecnici relativi all’implementazione
dell’applicazione, come lo sviluppo dell’interfaccia utente per mezzo della tecnologia WPF e del
data binding mediante l’uso di LINQ e il codice C#.
4
CAPITOLO 2
Analisi dei requisiti
Il sito web del laboratorio MOSE. Tale sito, realizzato con la tecnologia Share Point, interroga la
base di dati per la visualizzazione delle informazioni (in sola lettura);
Applicazione esistente (ADP);
Applicazione “windows form” non utilizzata.
La base di dati è composta da 22 tabelle, 63 viste e 133 stored procedures. Tali elementi sono stati
esaminati durante la fase di analisi dei requisiti. In questa tesi verranno citate tabelle, viste e stored
procedures esclusivamente utilizzate dall’applicazione (ADP).
Si riporta di seguito lo schema relazionale della base di dati. Lo schema completo verrà suddiviso in più
parti per facilitarne la consultazione.
5
tblStaff tblStaffTitoli tblTitoli tblTipoPubbl
PK ID_Staff PK,FK1 ID_Staff PK ID_Titolo PK ID_TipoPubb
PK,FK2 ID_Titolo
Cognome Autori TipoPubblicazione
Nome Riferimento TipoPubEnglish
Attivo FK2 ID_Stato Class_TS
Username FK3 ID_Rivista Class_PD
Amministratore Anno
PhotoFileName Titolo
PhoneNumber FK1 ID_tipoPubb
tblStatoTitolo
OfficeLocation ID_SitoWeb tblRiviste
Email PK ID_Stato ImpactFactor
Summary ID_Settore PK ID_rivista
Eduacation Stato
ResearchActivity Statoen Denominazione
ResearchProject RivistaInternazionale
Collaborations Referee
Enabled LuogoPubblicazione
tblTitoloProgetto
tblStaffCongressi tblCongressi
PK,FK1 ID_Titolo
PK,FK1 ID_Staff PK ID_Congresso
PK,FK2 ID_Progetto
PK,FK2 ID_Congresso
Denominazione
Presentazione Data
Organizzazione Anno
Partecipazione CongressoInternazionale
Referee
tblCollegamentoKeywordsTitolo tblProgetti
PK,FK1 ID_Keyword PK,FK1 ID_Progetto
PK,FK2 ID_Titolo
Progetto
SiglaProgetto
Anno_Inizio
Anno_Fine
Finanziatore
ResponsabileLocale
ResponsabileGlobale
FinanziamentoLocale
FianziamentoGlobale
tblKeyword VisualizzaSito
TipoProgetto
PK ID_Keyword ImgProject
Summary
Keyword Link
Figura 2.1
La porzione di schema relazionale considerata in Figura 2.1 fa riferimento alle pubblicazioni. La tabella
tblTitoli rappresenta le pubblicazioni ed è il fulcro di questa porzione di diagramma relazionale.
6
tblStaff tblTesi tblTesiDettaglio
PK ID_Staff PK ID_Tesi PK,FK1 ID_Tesi
tblTesiStato tblTipiTesi
PK ID_Stato PK ID_Tipo
StatoTesi Tipo
Figura 2.2
La porzione dello schema relazionale riportata in Figura 2.2 si sviluppa attorno alla tabella tblTesi,
rappresentante le tesi.
Figura 2.3
Quest’ultima porzione di schema relazionale (Figura 2.3) fa riferimento ai corsi e alla partecipazione agli
stessi dei componenti dello staff.
7
Si riportano di seguito le viste utilizzate dall’applicazione esistente:
viewTesi_ID: utilizzata per visualizzare le informazioni relative alle tesi, ordinate rispetto al campo
AnnoLaurea (ordinamento decrescente). Gli attributi di questa vista sono: ID_Tesi, ID_Tipo,
ArgomentoIT, ArgomentoEN, Collaborazione, Correlatori, ID_Curriculum, Stato,
ID_Relatore, Autore, DataInizioTesi, MEseLAurea, AnnoLaurea, Voto;
viewTesi_Autore: utilizzata per visualizzare le informazioni relative alle tesi, ordinate rispetto al
campo Autore (ordinamento crescente). Gli attributi di questa vista sono: ID_Tesi, ID_Tipo,
ArgomentoIT, ArgomentoEN, Collaborazione, Correlatori, ID_Curriculum, Stato,
ID_Relatore, Autore, DataInizioTesi, MEseLAurea, AnnoLaurea, Voto;
viewStaff: utilizzata per visualizzare l’elenco dei componenti dello staff. Gli attributi di questa vista
sono: ID_Staff, Cognome, Nome, Attivo;
viewRiviste: utilizzata per visualizzare le informazioni relative alle riviste, ordinate rispetto al
campo Denominazione (nome della rivista). Gli attributi di questa vista sono: ID_rivista,
Denominazione, RivistaInternazionale, Referee, LuogoDiPubblicazione;
viewReportTesiAreaChimica: utilizzata per visualizzare le informazioni relative alle tesi discusse
dei curriculum facenti parte dell’area chimica. L’ordinamento fa riferimento al campo AnnoLaurea
(ordinamento decrescente). Gli attributi di questa vista sono: ID_Tesi, ArgomentoIT,
Collaborazione, Correlatori, ID_Curriculum, Stato Tesi, Tipo, ArgomentoEN, Cognome
(del relatore, da tblStaff), Autore, DataInizioTesi, MEseLAurea, AnnoLaurea, Voto,
Curriculum;
viewReportTesiAreaInformatica: utilizzata per visualizzare le informazioni relative alle tesi
discusse dei curriculum facenti parte dell’area informatica. L’ordinamento fa riferimento al campo
AnnoLaurea (ordinamento decrescente). Gli attributi di questa vista sono: ID_Tesi, ArgomentoIT,
Collaborazione, Correlatori, ID_Curriculum, Stato Tesi, Tipo, ArgomentoEN, Cognome
(del relatore, da tblStaff), Autore, DataInizioTesi, MEseLAurea, AnnoLaurea, Voto,
Curriculum;
viewReportTesiNonDiscusse: utilizzata per visualizzare le informazioni relative alle tesi non
ancora discusse. L’ordinamento fa riferimento al campo AnnoLaurea (ordinamento decrescente).
Gli attributi di questa vista sono: ID_Tesi, ArgomentoIT, Collaborazione, Correlatori,
ID_Curriculum, Stato Tesi, Tipo, ArgomentoEN, Cognome (del relatore, da tblStaff),
Autore, DataInizioTesi, MEseLAurea, AnnoLaurea, Voto, Curriculum.
8
2.2 Analisi applicazione esistente
Come già accennato in precedenza, l’applicazione esistente è realizzata in ambiente Microsoft Access. In
particolare si tratta di un file di tipo ADP, ovvero Access Data Project. L’applicazione è composta da 27
maschere (si intendono sia le maschere che le sotto maschere) e 7 report. Con il termine “maschera” si
intende la finestra (o form) all’interno di un’applicazione di MS Access.
Analizzando singolarmente le maschere è stato possibile individuare l’insieme dei dati da visualizzare e le
operazioni che si desiderano effettuare su di essi. Sono state eseguite inoltre delle prove per verificare
l’usabilità dell’interfaccia utente, identificare i punti di forza e le caratteristiche da migliorare o aggiungere.
Tutti gli elementi raccolti nella fase di analisi hanno portato alla stesura dei requisiti, esposti nel capitolo
2.3.
2.3 Requisiti
Dall’analisi della basi di dati, dell’applicazione esistente e dall’intervista con il committente è possibile
individuare i requisiti dell’applicazione. Essi verranno suddivisi in più parti al fine di migliorarne la
consultazione.
Le attività relative allo staff del laboratorio MOSE consistono nella gestione dei dati relativi al
personale.
ID_Staff;
Cognome;
Nome;
Active status: indica lo stato di attività/inattività del soggetto;
Username;
Admin Status: indica se il soggetto è amministratore o meno;
Nome del file immagine associata: immagine presente sul server web del laboratorio che
deve essere visualizzata nel sito web. In caso non sia presente alcuna immagine associata al
soggetto, per convenzione si utilizza il file “nofoto.jpg”;
Numero di telefono;
Ubicazione dell’ufficio;
Email;
Dati relativi al curriculum:
o Sommario;
o Educazione;
o Attività di ricerca;
o Progetti di ricerca;
o Collaborazioni.
9
Aggiunta, modifica, rimozione di un componente dello staff;
Visualizzazioni lista e dettaglio.
L’esportazione delle pubblicazioni è un processo che prevede la scrittura su un file di testo (.txt) in
formato “comma separated” dei dati relativi alle pubblicazioni secondo diverse modalità. Il
processo di esportazione si snoda lungo i seguenti punti:
1. Scelta del componente dello staff per il quale si desiderano esportare le pubblicazioni;
2. Scelta del formato di esportazione tra i seguenti:
a. Autore, titolo, rivista, riferimento;
b. Autore, rivista, riferimento, titolo;
c. Titolo, autore, rivista, riferimento;
d. Rivista, riferimento, titolo, autore;
e. Rivista, riferimento, autore, titolo.
3. Scelta di informazioni aggiuntive tra le seguenti:
a. Numero;
b. Tipo;
c. Stato Titolo;
d. Anno.
4. Scelta della cartella di destinazione;
5. Esecuzione dell’esportazione.
L’upload dei documenti è un processo che prevede il salvataggio di un documento relativo ad una
pubblicazione in una directory del server del laboratorio MOSE. Il processo si snoda lungo i seguenti
punti:
ID Congresso;
Denominazione;
Data;
11
Anno;
Congresso Internazionale (si/no);
Referee (si/no);
Lista dei componenti dello staff che partecipano a un congresso:
o Cognome;
o Partecipazione (si/no);
o Organizzazione (si/no);
o Presentazione (si/no).
ID Progetto;
Sigla;
Denominazione del progetto;
Anno inizio;
Anno fine;
Finanziatore;
Finanziamento locale;
Finanziamento globale;
Responsabile locale;
Responsabile globale;
Visualizza sul sito (si/no);
Immagine del progetto (nome del file);
Link sito;
Tipo progetto: numero intero (0 nessuno, 1 processo, 2 materiali, 3 bio, 4 ICT);
Sommario(codice html).
ID Corso;
Nome del corso;
Ente organizzatore;
Periodo;
Luogo;
Anno;
Lista dei componenti dello staff che partecipano ai corsi (Cognome, organizzatore(si/no)).
13
2.3.9 Report
È prevista la creazione di 7 tipi di report. In particolare 4 report per le pubblicazioni e 3 per le tesi.
Per quanto riguarda i report relativi alle pubblicazioni essi sono “personalizzati”, ovvero riguardano
le pubblicazioni di un componente dello staff scelto. Nello specifico:
Report totale delle pubblicazioni: i dati che vengono visualizzati sono: Anno, ID
Pubblicazione, Autori, Rivista-Convegno di pubblicazione, Riferimento, Titolo,
Tipo di pubblicazione;
Report “per anno”: i dati che vengono visualizzati sono: Titolo, Autori, Denominazione,
Riferimento, Titolo, Tipo pubblicazione, Stato. Tali dati vengono raggruppati secondo
l’anno di pubblicazione;
Report “per tipo di pubblicazione”: i dati che vengono visualizzati sono: Anno, ID
Pubblicazione, Autori, Rivista-Convegno di pubblicazione, Titolo, Riferimento. Tali
dati vengono raggruppati secondo il tipo di pubblicazione;
Report “per numero”: i dati che vengono visualizzati sono: ID Pubblicazione, Anno,
Autori, Denominazione, Riferimento, Titolo, Tipo, Stato. Tali dati vengono visualizzati
con ordinamento crescente rispetto al campo ID Pubblicazione.
Per quanto riguarda i report relativi alle tesi, si prevede nello specifico:
Tutti i report relativi alle tesi visualizzano i seguenti dati: Autore, ID Tesi, Titolo Tesi, Tipo,
Collaborazione, Stato, Data Laurea, Voto.
14
CAPITOLO 3
Progettazione
Dallo studio effettuato ci si propone di progettare il nuovo front-end attenendosi ai seguenti principi
generali:
Sulla base di questi principi generali si è basata la progettazione del nuovo front-end.
Nella progettazione del nuovo front-end è stata effettuata una riorganizzazione delle attività. Infatti,
mentre nell’applicazione esistente le attività erano profondamente legate alla struttura della base di dati,
nel nuovo front-end si è cercato di raggruppare le attività correlate tra loro. Questo raggruppamento è
stato realizzato in base a:
15
Rilevanza di un’attività nel complesso della gestione;
Mole di dati che un’attività necessità di gestire;
Frequenza di esecuzione di un’attività.
Raccogliendo tutti questi elementi si passa alla definizione del layout della User Interface.
Tenendo conto di tutti gli elementi finora raccolti per la progettazione dell’interfaccia utente, si
rappresenta in figura 3.1 il modello di layout scelto per il nuovo front-end.
Analizzando il layout:
16
comprensione. Spesso alcuni pulsanti possono raggruppare più operazioni che verranno rese
accessibili all’utente premendo il pulsante stesso;
5. Navigation pane: panello contenente l’elenco delle attività e delle operazioni secondarie. Può
inoltre contenere delle attività correlate suggerite all’utente. L’elenco ha una struttura ad albero, in
modo da permettere l’espansione o la contrazione di gruppi di attività (il gruppo di attività è
rappresentato da un rettangolo blu, mentre le singole attività sono rappresentate da un rettangolo
grigio);
6. Content Area: è l’area che raccoglie e organizza tutti i dati relativi all’attività corrente, il cui titolo è
rappresentato (in figura 3.1) con un rettangolo azzurro;
7. Expander Group: è un pannello che può essere espanso (7) o compresso (8) e contiene i dati da
presentare all’utente. La funzione di espansione/compressione del pannello permette all’utente
rispettivamente di rendere visibili/nascondere gruppi di dati non utili alla consultazione. Questo
consente di ridurre la complessità dei dati presentati all’utente. I dati all’interno di un expander
group sono riuniti in gruppi logici (per descrivere, ad esempio, il dettaglio anagrafico di un soggetto
un gruppo può contenere informazioni di carattere generale, un altro gruppo può contenere dati
relativi ai contatti, e così via);
8. Expander Group compresso;
9. Status Bar: visualizza lo stato dell’applicazione, notifica i salvataggi, le modifiche ai dati e lo stato di
connessione al database.
Figura 3.1
17
CAPITOLO 4
Interfaccia Utente
Per quanto riguarda l’installazione dell’applicazione è previsto l’impiego della tecnologia ClickOnce. Click
Once è una tecnologia di distribuzione che consente di creare applicazioni basate su Windows. Esse sono
aggiornabili in qualsiasi momento e possono essere installate ed eseguite con un’interazione minima da
parte dell’utente. ClickOnce risolve un’importante problema: l’aggiornamento dell’applicazione. Questa
operazione infatti installa solamente le parti dell’applicazione che hanno subito modifiche, a differenza di
altre tecnologie (ad esempio MS Windows Installer) che nel processo di aggiornamento reinstallano
completamente le applicazioni.
La configurazione dell’applicazione è molto veloce. Gli unici elementi che hanno necessità di configurazione
sono:
Modifica del file di configurazione: procedura consigliata per utenti esperti. Essa prevede la
modifica del file (XML) denominato “MoseUXPrototype.exe.config”. Esempio di configurazione:
connectionString="Data Source=SERVER_NAME;Initial Catalog=MoseDB;Integrated
Security=True"
L’unica modifica necessaria è quella relativa al campo “Data Source”. Il valore da inserire è quello
relativo al nome del server (SQL Server);
Configurazione guidata: procedura avviabile all’interno dell’applicazione.
Anche per quanto riguarda la configurazione delle directory di upload ed esportazione è disponibile una
configurazione guidata all’interno dell’applicazione. Per quanto riguarda la directory di esportazione, se
non viene specificata una particolare directory, la destinazione dell’esportazione sarà la directory
contenente il file eseguibile dell’applicazione.
18
4.2 Utilizzo dell’applicazione
Nel capitolo 3 (Progettazione) sono stati descritti i principi e le idee di base sui quali è stata sviluppata
l’interfaccia utente (o UI, User Interface). In questo capitolo si provvederà a fornire una panoramica sulle
funzionalità e sull’uso dell’applicazione.
Come accennato in precedenza, nel processo di progettazione è stata fatta una distinzione tra attività di
gestione principali e secondarie. In tabella 4.1 sono elencate le attività di gestione principali e, per ognuna
di esse, le attività secondarie e correlate.
Keywords Curriculum
Riviste Tipi Tesi
SECONDARIE
Tipi Pubb. Stati Tesi
Stati Pubb.
Le attività secondarie sono attività che hanno a che fare con le relative attività principali ma la loro
importanza, la loro frequenza d’uso e la loro mole di dati sono minori rispetto alle attività principali. Le
attività correlate invece sono attività che vengono suggerite all’utente quando si trova in un certo contesto
(attività principale).
Fatta questa importante premessa sull’organizzazione delle attività, è possibile analizzare più in
dettaglio l’interfaccia utente e il suo utilizzo. All’avvio l’applicazione si presenta come una finestra
che occupa tutta la superficie dello schermo. È possibile ridurre le dimensioni della finestra ma non
oltre le dimensioni minime (800x600px), fissate per evitare “tagli” di visualizzazione.
Come già discusso nel capitolo 3.3, nella parte superiore dell’applicazione sono presenti le attività
principali. Esse sono disposte una di fianco all’altra per permettere una navigazione “a schede”. La
prima voce a sinistra non fa riferimento ad un’attività ma ad una pagina denominata “Home”
(Figura 4.1). Questa è la pagina visualizzata all’avvio dell’applicazione e permette l’accesso veloce a
tutte le attività principali e secondarie e alle funzionalità di configurazione.
19
Figura 4.1
Come è possibile notare dalla figura 4.1 le varie attività all’interno della pagina “Home” sono
contenute in gruppi. I controlli che realizzano i raggruppamenti sono denominati expander. Gli
expander sono dei controlli aventi un titolo e un contenuto che può essere espanso o compresso al
fine di migliorare l’organizzazione e regolare a piacimento la quantità di informazioni visualizzate.
Per iniziare ad utilizzare l’applicazione basta fare click su una voce della pagina Home oppure
scegliere una tra le attività principali contenute in activity pane (vedi capitolo 3.3). Per offrire un
esempio che sia il più completo possibile, senza analizzare ogni singola attività dell’applicazione, si
consideri l’attività di gestione delle pubblicazioni. Le rimanenti attività hanno un funzionamento
identico.
La visualizzazione di default per le pubblicazioni (come per tutte le altre attività principali) è la
visualizzazione dettaglio (Figura 4.2).
20
Figura 4.2
22
Figura 4.8
7. Gruppo “Informazioni Generali”: controllo di tipo expander, contiene tutte le informazioni
di carattere generale relative alle pubblicazioni;
8. Griglia relativa ai componenti dello staff che hanno partecipato alla pubblicazione. Come
per tutte le griglie (e dunque anche per quanto riguarda i punti 10 e 11), l’aggiunta di un
componente può essere fatta premendo il tasto tab fino alla creazione di una nuova riga. La
rimozione, invece, può essere effettuata selezionando la riga che si desidera rimuovere e
premendo il tasto canc;
9. Gruppo “Informazioni Pubblicazione”: controllo di tipo expander, contiene tutte le
informazioni specifiche sulla pubblicazione;
10. Griglia relativa ai progetti cui la pubblicazione fa riferimento;
11. Griglia relativa alle keywords relative alla pubblicazione;
12. Status Bar: indica lo stato dell’applicazione. Essa notifica eventuali salvataggi, rimuozioni e
aggiunte di nuove pubblicazioni;
13. Pannello di navigazione (o navigation pane): contiene le attività secondarie e le attività
correlate. È strutturato ad albero, in modo che sia possibile nascondere/visualizzare le
informazioni che si desiderano.
A titolo dimostrativo, di seguito si riportano le immagini relative alla visualizzazione griglia (figura
4.9) e visualizzazione staff (figura 4.10) delle pubblicazioni. Per motivi di spazio viene riportata
solamente la parte contenuta all’interno dell’area contenuti (content area).
Figura 4.9
23
Figura 4.10
Sia in figura 4.9 che in figura 4.10 è possibile notare come le griglie visualizzino le righe a colori
alternati, al fine di migliorarne la consultazione.
Nella visualizzazione staff relativa alle pubblicazioni(figura 4.10) è possibile notare la presenza sulla
sinistra di una lista contenente tutti i componenti dello staff. La griglia posizionata in destra
visualizzerà le pubblicazioni relative al componente dello staff selezionato.
Figura 4.11
24
CAPITOLO 5
Implementazione
Ampia integrazione: WPF integra molte tecnologie diverse tra loro, permettendo l’uso di
applicazioni contenenti elementi 3D, 2D, video, documenti e controlli e molto altro;
Indipendenza della risoluzione: gli elementi sullo schermo possono essere compressi o estesi
indipendentemente dalla risoluzione dello schermo. Questo è possibile perché il rendering di
elementi WPF si basa sulla grafica vettoriale;
Accelerazione hardware: WPF è costruito su Direct3D, quindi i contenuti, che siano 2D, 3D o
semplicemente caratteri, vengono converti in oggetti Direct3D e il rendering viene eseguito
dall’hardware;
Programmazione dichiarativa: la combinazione di WPF e XAML è simile all’uso di HTML per definire
un’interfaccia utente. Infatti le applicazioni WPF necessitano del codice XAML (eXtensible
Application Markup Language) per la “descrizione” dell’interfaccia utente e del codice C# (o VB,
Visual Basic) per l’implementazione degli algoritmi. Questa caratteristica di WPF è molto
importante perché permette di separare l’implementazione dell’interfaccia utente dalla scrittura
del codice sottostante. Questo può essere un elemento utile quando ad esempio più team lavorano
su diverse parti. Ogni elemento (ad esempio una finestra) contenuto nell’applicazione sarà dunque
costituito da due files: NomeElemento.xaml e NomeElemento.xaml.cs. Il primo è il file contenente il
codice XAML, il secondo invece contiene il codice (in questo caso) C#;
Composizione e personalizzazione: WPF permette la creazione di controlli utente composti da più
controlli elementari e la personalizzazione dei controlli stessi.
25
interessante di per sé. Quindi parlare di XAML senza un framework come WPF è come parlare di C# senza il
.NET Framework.
5.2.1 Containers
Si analizza ora il codice XAML della finestra MainWindow (ovvero il contenuto del file
MainWindow.xaml):
1 <Window
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 x:Class="MoseUXPrototype.MainWindow"
5 x:Name="Window"
6 Title="Gestione Attività Mose"
7 Width="800" Height="600" Background="#FFE0E4E7"
8 WindowStartupLocation="CenterScreen"
9 WindowState="Maximized"
10 MinHeight="600"
11 MinWidth="800">
12
13 <Grid x:Name="LayoutRoot">
14 <Grid.RowDefinitions>
15 <RowDefinition></RowDefinition>
16 </Grid.RowDefinitions>
17 <Frame Name="frmPageContainer" Grid.Row="0"
18 NavigationUIVisibility="Hidden"
26
19 Source="Pages/pagHome.xaml"/>
20 </Grid>
21 </Window>
Dove:
Name indica il nome dell’elemento Frame;
NavigationUIVisibility impostato su Hidden permette di nascondere la barra di
navigazione (contenente anche pulsanti Previous e Forward);
Source indica l’URI (Uniform Resource Identifier) della pagina che si intende visualizzare
all’interno del Frame.
L’obbiettivo della navigazione è quello di spostarsi da una pagina all’altra. È possibile eseguire la
navigazione in 3 differenti modi:
Dove il parametro passato al metodo Navigate è di tipo Uri e dove UriKind indica se l’Uri è relativo,
assoluto o indeterminato.
Navigando tra le pagine, può essere necessario il passaggio di dati tra le stesse. Di seguito si riporta
un frammento di codice che mostra come può essere implementato il passaggio di dati da una
pagina ad un’altra:
27
Nel frammento di codice riportato sopra, in particolare in riga 2, è possibile notare come una
pagina venga istanziata come un qualsiasi altro oggetto. È possibile inoltre notare come l’oggetto in
questione (la pagina pagPubblicationsDetail) venga creato invocando un overload del costruttore
che accetta un parametro di tipo intero. Di seguito si riporta il costruttore (overload) relativo:
Si analizza ora, in dettaglio, una piccola porzione di pagina, al fine di illustrare come avviene
l’implementazione del layout in XAML.
Figura 5.1
Si consideri la pagina (figura 5.1) relativa alla gestione dei componenti dello staff (visualizzazione dettaglio),
denominata pagStaffDetail.
28
La parte principale del logical tree, ovvero quella relativa ai contenitori principali del layout, è riportata in
figura 5.2.
Page
Layout Root
Resources
(Grid)
Figura 5.2
In figura 5.2 all’interno dei blocchi troviamo il nome dei contenitori e tra parentesi la natura (tipo) dei
contenitori stessi. In figura 5.2 si possono riconoscere due tipi di panel, ovvero quei particolari contenitori
che permettono la realizzazione del layout:
Stack Panel: questo contenitore ordina sequenzialmente i suoi elementi figli in una pila. La pila può
avere orientamento verticale od orizzontale;
Grid: questo contenitore è molto versatile ed è sicuramente il più utilizzato nel layout
dell’interfaccia grafica dell’applicazione. Questo contenitore permette di disporre gli elementi figli
in più righe e colonne e mette a disposizione un grosso numero di funzionalità per controllare le
righe e le colonne. Facendo un paragone, il controllo Grid funziona in modo simile alla TABLE in
HTML.
Nell’implementazione del layout sono stati utilizzati esclusivamente questi due tipi di panel.
Si analizzerà di seguito un frammento del codice XAML della pagina pagStaffDetail. Il frammento in
questione è la parte di codice contenuta all’interno del controllo Border chiamato Action Pane (vedi figura
5.2). Un controllo di tipo border non è altro che un pannello rettangolare senza alcuna funzione di layout
(come invece hanno Stack Panel e Grid) i cui bordi e sfondo possono essere personalizzati. Nel caso del
“Action Pane” il controllo border viene utilizzato rendendone visibile solamente il bordo inferiore e
applicando un effetto di ombra (da 10 a riga 13) nella sua parte inferiore.
29
15 <Grid.RowDefinitions>
16 <RowDefinition Height="64"></RowDefinition>
16 <RowDefinition Height="16"></RowDefinition>
18 </Grid.RowDefinitions>
19 <Grid.ColumnDefinitions>
20 <ColumnDefinition Width="210"></ColumnDefinition>
21 <ColumnDefinition Width="3"></ColumnDefinition>
22 <ColumnDefinition Width="180"></ColumnDefinition>
23 <ColumnDefinition Width="3"></ColumnDefinition>
24 <ColumnDefinition Width="130"></ColumnDefinition>
25 <ColumnDefinition Width="3"></ColumnDefinition>
26 <ColumnDefinition Width="200"></ColumnDefinition>
27 <ColumnDefinition ></ColumnDefinition>
28 </Grid.ColumnDefinitions>
29 <!-- ... -->
30 <Path Data="M301,70.331 L301,149.331" Grid.RowSpan="2"
31 Grid.Column="1" HorizontalAlignment="Center" Stretch="Fill" Width="1">
32 <Path.Stroke>
33 <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
34 <GradientStop Color="#FF858585" Offset="1"/>
35 <GradientStop Color="White"/>
36 </LinearGradientBrush>
37 </Path.Stroke>
38 </Path>
39 <TextBlock Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center"
40 Foreground="#FF646464">Modifica</TextBlock>
41 <!--MODIFICA-->
42 <StackPanel Name="ModificaStack" Grid.Row="0" Grid.Column="2"
43 VerticalAlignment="Center" HorizontalAlignment="Center"
44 Orientation="Horizontal">
45 <Button Name="btnAdd" Height="55" Width="50" Style="{DynamicResource
46 ActivityButtonStyle}" HorizontalAlignment="Center" Margin="5,0,0,0"
47 VerticalAlignment="Center" Click="btnAdd_Click" ToolTip="Aggiungi un
48 nuovo componente dello staff">
49 <Grid HorizontalAlignment="Center" Height="50" Width="50">
50 <Grid.RowDefinitions>
51 <RowDefinition Height="2*"/>
52 <RowDefinition Height="*"/>
53 </Grid.RowDefinitions>
54 <TextBlock Grid.Row="1" VerticalAlignment="Center"
55 HorizontalAlignment="Center">Aggiungi</TextBlock>
56 <Image Grid.Row="0"
57 RenderOptions.BitmapScalingMode="NearestNeighbor"
58 Source="Images/icoAddStaff.png" Stretch="None"
58 HorizontalAlignment="Center" VerticalAlignment="Center"/>
60 </Grid>
61 </Button>
62 </StackPanel>
63 <!-- ... -->
64 </Grid>
65 </Border>
Il frammento di codice riportato è una piccola parte del codice XAML costituente l’intera pagina
pagStaffDetail (65 righe di 529). In esso sono presenti alcuni tra i più importanti concetti necessari alla
realizzazione del layout dell’applicazione.
Per rendere completa la spiegazione del frammento di codice e per facilitarne la comprensione, si riporta in
figura 5.4 la parte di logical tree riferita al frammento di codice.
Action Pane
(Border)
Border
(Grid) Border Effect
Background
btnAdd
...
(Button)
(Grid)
Column ModificaStack
Row Definition (Textblock)
Definition (Stack Panel)
Figura 5.4
31
5.4 Data binding
Il data binding è la parte fondamentale dell’implementazione. Esso si occupa infatti di stabilire una
connessione con la base di dati e di “interfacciare” lo scambio di dati tra il front-end e la base di dati stessa.
Lo operazioni che si possono effettuare sono le più comuni: inserimento, rimozione e modifica di record,
esecuzione di query e stored procedures.
Figura 5.5
32
La creazione di un elemento LINQ to SQL Classes fa in modo che all’interno del progetto
dell’applicazione vengano inseriti 3 file (figura 5.6):
MoseDB.dbml
MoseDB.dbml.layout
MoseDB.designer.cs Figura 5.6
Aprendo il file MoseDB.dbml si accede al designer che permette di trascinare dalla base di dati tutti
gli elementi di cui abbiamo bisogno nella nostra applicazione. In particolare è stato eseguito il drag-
and-drop di tutte le tabelle della base di dati e delle stored procedures sp_PubbStaff e sp_PubbWeb.
La classe MoseDBDataContext
C’è da notare che, a questo punto del processo di data binding, è stata generata (automaticamente
dall’ambiente di sviluppo) una classe MoseDBDataContext, che deriva dalla classe DataContext.
Questa classe ha la funzione di “mascherare” la connessione con il database e di rendere possibili le
operazioni di aggiornamento verso il database stesso.
Ogni tabella del database sarà accessibile come proprietà pubblica di questa classe e sarà, a sua
volta, un classe di tipo Table. Riassumendo in poche parole, la classe DataContext è l’entry point
per poter utilizzare Linq To SQL.
Per descrivere le modalità d’implementazione del data binding s’illustra il caso di gestione dei dati
relativi ai corsi. In figura 5.7 è riportata l’area contenuti (content area) relativa ai corsi.
Figura 5.7
Si riporta in figura 5.8 la porzione di diagramma relazione contenente i dati in gioco in questo
esempio.
33
tblStaff tblStaffCorsi tblCorsi
PK ID_Staff PK,FK1 ID_Staff PK ID_Corso
PK,FK2 ID_Corso
Cognome NomeCorso
Nome Organizzatore EnteOrganizzatore
Attivo Periodo
Username Luogo
Amministratore Anno
PhotoFileName
PhoneNumber
OfficeLocation
Email
Summary
Eduacation
ResearchActivity
ResearchProject
Collaborations
Enabled
Figura 5.8
Nelle applicazioni WPF il data binding viene implementato in due “livelli”. Infatti il data binding
viene realizzato sia a livello d’interfaccia, e quindi di codice XAML, sia a livello di codice C#.
La parte di data binding realizzata a livello d’interfaccia serve ad associare determinati controlli alle
rispettive sorgenti di dati. Ad esempio, in figura 5.7, è possibile notare come i dati vengano associati
a controlli di tipo textbox (in alto) e controlli di tipo combobox e checkbox (in basso). Inoltre a
livello d’interfaccia viene specificata la modalità con la quale i dati vengono presentati (ad esempio
se sono in sola lettura).
Considerando l’esempio introdotto in figura 5.7, si analizzeranno ora alcuni frammenti di codice
XAML per evidenziare il data binding a livello d’interfaccia. L’esempio considerato comprende la
realizzazione di un data binding relativo ad una visualizzazione detta master-detail, ovvero
comprendente i dati relativi a un corso (master) e i componenti dello staff che vi partecipano
(detail).
1 <Page.Resources>
2 <CollectionViewSource x:Key="MasterView"/>
3 <CollectionViewSource x:Key="DetailView" Source="{Binding
4 Source={StaticResource MasterView}, Path='tblStaffCorsis'}"/>
5 <CollectionViewSource x:Key="staffLookup" />
Il frammento di codice riportato sopra indica come nelle risorse della pagina siano stati definiti tre
elementi CollectionViewSource. Un elemento CollectionViewSource è una classe derivata da
CollectionView, ovvero quella classe che rappresenta una visualizzazione per il raggruppamento,
l’ordinamento, il filtraggio e lo spostamento in un insieme di dati. Gli elementi di tipo
CollectionViewSource sono da preferire a quelli di tipo CollectionView nei casi, come in questo,
in cui si debba lavorare con diverse view (e quindi anche diverse sorgenti di dati). Dal codice si nota
che:
Definite le sorgenti dei dati, è possibile ora associare i controlli ai dati desiderati. Il procedimento
per implementare l’associazione è riportato nei frammenti di codice che seguono.
Nel codice XAML riportato sopra è importante sottolineare la presenza dell’elemento DataContext.
DataContext ottiene o imposta il contesto dati per un elemento che partecipa a un’associazione
dati. Il suo significato è molto simile al concetto di Source visto in precedenza. Osservando la figura
5.7 e ricordando il concetto di logical tree, si nota come l’oggetto Expander riportato nel codice sia
“padre” di tutti i controlli textbox in esso contenuti. Dunque la proprietà di DataContext si
ripercuoterà su tutti i “figli” del controllo Expander. Basterà specificare, per ogni controllo, il
particolare percorso (Path) del dato da associare, all’interno del contesto indicato:
In questa riga di codice (sopra) è possibile vedere come la proprietà Text della TextBox venga
associata all’attributo NomeCorso (tabella tblCorsi, figura 5.8). Il percorso indicato (Path) è relativo al
DataContext indicato in precendenza.
All’interno del secondo Expander (“Informazioni Staff” in figura 5.8) è contenuto un controllo
particolare: il DataGrid.
Un DataGrid è un controllo versatile per la visualizzazione di più righe e colonne di dati che
possono essere editati e ordinati. Questo controllo è ottimizzato per il data binding di elementi
DataTable, ovvero tabelle, come in questo caso. Si riporta di seguito la definizione del DataGrid:
In particolare si nota:
L’uso del controllo DataGrid permette di realizzare una funzionalità molto utile (in termini di
usabilità dell’interfaccia) che vale la pena di accennare. Tale funzionalità è detta RowDetails. Essa
infatti permette di aggiungere un “dettaglio” ad ogni riga del DataGrid. Per chiarire meglio il
concetto si faccia riferimento alla figura 5.9.
36
Figura 5.9
Come è possibile vedere dalla figura 5.9, infatti, quando viene selezionata una riga del DataGrid
avviene l’apertura di un pannello che può contenere ulteriori dati dettagliati sull’elemento corrente
(riga). Per utilizzare questa funzionalità occorre scrivere le seguenti righe di codice XAML:
1 <DataGrid x:Name="ProjectsGrid">
2 <DataGrid.Columns>
3 ...
4 </DataGrid.Columns>
5 <DataGrid.RowDetailsTemplate>
6 <DataTemplate>
7 <Grid Margin="5">
8 ...
9 </Grid>
10 </DataTemplate>
11 </DataGrid.RowDetailsTemplate>
È possibile notare in riga 6 come venga utilizzato l’elemento DataTemplate che permette di definire
al suo interno il layout (in questo caso all’interno di una Grid) dei dati che si desiderano visualizzare
in RowDetails.
L’implementazione del data binding a livello d’interfaccia (e dunque di codice XAML) è conclusa. Si
considera ora la parte di data binding a livello di codice C# (e dunque nel code-behind
dell’interfaccia).
Il seguente frammento di codice contiene l’implementazione del data binding a livello di codice C#.
L’associazione e il caricamento dei dati avviene completamente all’interno del metodo Page_Loaded
(riga 13), ovvero quel metodo che viene eseguito quando viene intercettato l’evento di “pagina
caricata”.
37
16 this.MasterViewSource =
17 (CollectionViewSource)this.FindResource("MasterView");
18 this.DetailViewSource =
19 (CollectionViewSource)this.FindResource("DetailView");
20
21 MasterViewSource.Source = this.corsiData;
22
23 this.MasterView =
24 (BindingListCollectionView)this.MasterViewSource.View;
25 this.DetailView =
26 (BindingListCollectionView)this.DetailViewSource.View;
27 this.MasterView.CurrentChanged += new
28 EventHandler(MasterView_CurrentChanged);
29
30 var staffList = from s in db.tblStaffs
31 select new { s.Cognome, s.ID_Staff };
32
33 CollectionViewSource staffSource =
34 (CollectionViewSource)this.FindResource("staffLookup");
35
36 staffSource.Source = staffList;
37 }
38 ...
39 }
38
1 void MasterView_CurrentChanged(object sender, EventArgs e)
2 {
3 this.DetailView =
4 (BindingListCollectionView)this.DetailViewSource.View;
5 this.txtCurrentPosition.Text = (this.MasterView.CurrentPosition + 1)
6 .ToString() + " di " + (MasterView.Count).ToString();
7 }
La navigazione tra record viene resa possibile dalle funzioni di spostamento messe a disposizione
dalle viste (BindingListCollectionView). Si riportano di seguito le righe di codice utilizzate per
implementare lo spostamento tra record (“primo record”, “record precedente”, “record
successivo”, “ultimo record”):
Si nota che:
Vengono riportate di seguito le righe di codice che permettono l’aggiunta e la rimozione di record
relativi ai corsi e ai componenti dello staff che partecipano al corso corrente:
41
CAPITOLO 6
Conclusioni
L’obiettivo di realizzare un’applicazione per la gestione delle attività del laboratorio Mose è stato raggiunto
pienamente. La quasi totalità delle funzionalità è stata realizzata completamente. Le operazioni di
debugging e l’apporto delle modifiche finali sono in fase di realizzazione.
Attualmente l’applicazione è in fase di test presso un solo utente. A breve si prevede di estendere la fase di
test a tutti gli utenti che necessitano dell’applicazione. Una volta terminata la fase di test è previsto il
porting in produzione della versione finale.
42
Bibliografia
Adam Nathan - WPF 4 Unleashed - Pearson Education (US) – 2010
Joe Mayo – C# 3.0 with .NET Framework 3.5 Unleashed – Second Edition – Pearson Education (US) – 2008
http://msdn.microsoft.com/it-it/vcsharp/cc707833(en-us).aspx
http://msdn.microsoft.com/it-it/vcsharp/cc788742(en-us).aspx
http://msdn.microsoft.com/it-it/vcsharp/cc788743(en-us).aspx
http://msdn.microsoft.com/it-it/vcsharp/dd239277(en-us).aspx
http://msdn.microsoft.com/library/ms752347(VS.85).aspx
http://msdn.microsoft.com/it-it/library/aa970683(VS.85).aspx
http://blogs.msdn.com/b/pietrobr/archive/2007/09/07/parliamo-di-linq-parte-3.aspx
43