Sunteți pe pagina 1din 65

MINISTERUL EDUCAIEI AL REPUBLICII MOLDOVA

UNIVERSITATEA DE STAT DIN MOLDOVA


Facultatea de Matematic i Informatic Catedra Tehnologii de programare

TEZ DE LICEN Elaborarea unui manual electronic la disciplina Structuri de date i algoritmi

A elaborat: Palancica Pavel student al anului III, grupa I-32 Specialitatea Informatic Conductor tiinific: Seiciuc Eleonora dr., lector superior, Catedra Tehnologii de programare

Chiinu - 2011

SARCINA TEZEI
S se studieze manualele electronice, funciile de baz, tipurile i metodele de elaborare a acestora. S se cerceteze metodele de stocare a informaiilor i modurile de accesibilitate a utilizatorului la informaiile prezentate. S se aleag un manual electronic existent la disciplina Structuri de date i algoritmi, i s se selecteze coninutul relevant din cadrul acestuia, pentru realizarea unui nou manual electronic. n partea practic a tezei, s se implementeze un manual electronic propriu. Manualul va trebui s satisfac urmtoarele cerine funcionale: S aib un cuprins, unde denumirile temelor vor fi texte referine, la tastarea crora vom fi redirectai la pagina cu coninutul respective. S posede un index, adic o pagin unde s se afle conceptele de baz prezentate n manual i paginile respective unde pot fi gsite. Aceti indeci vor fi de asemenea texte-referin. S conin o funcie de cutare avansat a anumitor teme. Aplicaia trebuie, de asemenea, s posede butoanele funcionale de maximizare, minimizare i de nchidere a programului. La tastarea butonului ENTER, fereastra aplicaie trebuie s se transforme n modul full-screen sau, respectiv, s revin la poziia normal. La tastarea butonului ESC, aplicaia trebuie s se finiseze.
2

ADNOTARE
la teza de licen Elaborarea unui manual electronic la disciplina Structuri de date i algoritmi a studentului Palancica Pavel, grupa I-32, specialitatea Informatic. Cuvinte-cheie: manual electronic, obiect grafic, clas, interfa, interfa grafic, spaiu de nume, obiect, obiect grafic, palet de culori, evenimente Windows, flip-page. Teza const din introducere, patru capitole i concluzii. Primul capitol reprezint un studiu al situaiei actuale n domeniul cercetat. Sunt cercetate tipurile de manuale electronice , funciile de baz ale acestora, metodele de pstrare a informaiilor i cteva formate de manuale electronice existente. Al doilea capitol descrie succint disciplina Structuri de date i algoritmi. Sunt descrise succint principalele structuri de date i algoritmii de implementarea a acestora. Al treilea capitol descrie tehnologia cu care se va realiza aplicaia din cadrul tezei . Sunt explicate cele mai generale concepte din cadrul acesteia. De asemenea, este explicat pe scurt limbajul XAML limbajul folosit n cadrul WPF, pentru crearea interfeelor grafice utilizator. n al patrulea capitol este descris realizarea produsului soft final. Sunt descrise proiectele elaborate n cadrul soluiei, este prezentat codul celor mai importante clase i metode i sunt prezentate screenshot-uri cu exemple de interfa a utilizatorului. Am ales C# ca limbaj de implementare a aces tei teze, dat fiind faptul c acesta este relativ nou, pur obiectual, care a eliminat deficienele limbajelor C/C++ i Java i care e folosit de un numr tot mai mare de programatori. Teza de licen cuprinde 65 de pagini n format A4, conine 3 figuri, 5 tabele i 4 anexe.

CUPRINS
SARCINA TEZEI2 ADNOTARE.3 CUPRINS..4 INTRODUCERE......6 MANUALE ELECTRONICE..8 1.1 Calculatorul instrument didactic ........8 1.2 Tipuri de manuale electronice....9

I.

II.

STRUCTURI DE DATE I ALGORITMI.12 2.1 Tipuri de date abstracte .....13 2.1.1 Caracteristici......13 2.1.2 Avantaje.........14 2.1.3 Stiva...14

III.

PREZENTAREA TEHNOLOGIEI WPF.......18 3.1 Caracteristicile WPF......20 3.1.1 Interfa utilizator declarativ (Declarative UI)....20 3.1.2 Poziionare inteligent.......21 3.1.3 Grafic scalabil...21 3.1.4 Template-uri (abloane)................................................................22 3.1.5 Legarea (Binding)..........................................................................23 3.1.6 Stilizarea (Styling).24 3.1.7 Declanatoare (Triggers)...24 3.1.8 Animaie24
4

3.1.9 3D.25 3.1.10 De ce s utilizm WPF...25 3.1.11 Compararea WPF cu alte opiuni....26 3.1.12 Prile componente i versiunile .NET Framework...27 3.1.13 Caracteristici incluse n versiunile .NET Framework.28 3.1.14 Instrumente pentru WPF30 3.1.15 WPF n contrast cu Silverlight....32 3.2 Limbajul XAML32 3.2.1 Definiia XAML.33 3.1.1 Sintaxa XAML...35 3.1.2 Setarea proprietilor care nu sunt tipuri simple36 3.1.3 Proprietatea Content...37 3.1.4 Extensii de Markup38 IV. REALIZAREA MANUALULUI ELECTRONIC41 4.1 Proiectul WpfBookControls.......41 4.1.1 Modulul cu tipuri de date auxiliare.41 4.1.2 Controlul BookPage................................................................43 4.1.3 Controlul Book........................................................................47 4.2 Proiectul WpfAppTezaDeLicenta..49 4.2.1 Clasa StartWindow..49 CONCLUZII......54 BIBLIOGRAFIE...55 ANEXE...56

INTRODUCERE
Trim ntr-o lume dinamic, ce se afl n continu schimbare, la viteze greu de imaginat cu cteva decenii n urm. Cantitatea de cunotine acumulate de omenire pe parcursul existenei sale a ajuns n epoca contemporan la un volum care -l face practic inaccesibil integral unei singure persoane. nvmntul este i el cuprins n acest vrtej al schimbrilor, cu responsabiliti sporite, deoarece bagajul de cunotine minime ce trebuiesc transmise generaiilor ce urmeaz cuprinde o cantitate de informaie ce pare a se amplifica exponenial la intervale tot mai mici. Este o er a tehnologiilor avansate, a mplinirii celor mai interesante idei gndite de mintea omeneasc. Ultimul deceniu al secolului trecut a adus multe schimbri n diferite domenii. Una din modificrile substaniale, deosebit de utile, poate fi considerat generealizarea utilizrii calculatoarelor personale i accesibilitatea tot mai larg publicului. Ptrunderea acestor instrumente de hardware i de software n domeniul lucrrilor de birotic, de proiectare, n coli i institute n-a putut s nu reflecte i crearea cursurilor electronice, adic crearea ma nualelor electronice. Din acest motiv, programatorii care au lucrat pe aceste PC-uri cutau posibilitile de a realiza primele manuale electronice. Realizate de diferite firme creatoare de soft cu
6

renume mondial, in prezent exist diferite formate digitale de realizare a manualelor electronice, cum ar fi .pdf, .djvu, .chm i altele. De asemenea, un manual electronic se poate crea n limbajul de marcare html, aceasta se folosete mai des pentru realizarea documentaiei pentru diferite produse soft. Manualele electronice sunt instrumente eficiente de pstrare a informaiei din diversite domenii, permiindu-ne s stocm un volum destul de mare de date, ceea ce dac ar fi imprimat pe hrtie, ar duce la cheltuieli mult mai mari. Un manual electronic la o anumit disciplin, elaborat conform exigenelor moderne, este o surs excelent de studiere sau informare i de identificare rapid a informaiilor solicitate. Pe scurt, manualele electronice ne uureaz experiena prin oferirea unui mijloc sigur i eficient de pstrare a datelor i de acces la acestea.

I.

MANUALE ELECTRONICE

Folosirea calculatorului n procesul de nvmnt se dovedete a fi o necesitate n condiiile dezvoltrii n ritm accelerat a tehnologiei informaiei. Pentru noile generaii de elevi i studeni, a devenit o cerin conceptul de asistare a procesului de nvmnt cu calculatorul, n condiiile avalanei de informaii multimedia. Manualele electronice sunt aplicaii care reprezint un mod de pstrare a datelor n c alculator. Aceaste aplicaii faciliteaz accesul la aceste date, conin funcii avansate de cutare, cuprins, index, funcii de acces aleator la o anumit pagin, funcii de mrire/micorare a coninutului, funcii de creare a notielor i altele, n dependen de cerinele utilizatorilor.

1.1 Calculatorul instrument didactic


Se remarc mai multe modaliti de apariie a calculatorului n procesul de predare/nvare: Utilizarea calculatorului pentru tehnoredactarea computerizat a documentelor colare, cum ar fi cele care reprezint rezultate ale proiectrii didactice la nivel
8

micro, adic: planificri, proiecte de uniti de nvare, proiecte de lecie, ct i a unor documente de eviden colar cum ar fi cele legate de prezena la anumite activiti didactice sau notarea evoluiei elevilor la activitile de verificare i evaluare a cunotinelor. Utilizarea calculatorului ca mijloc de predare n cadrul leciilor de comunicare de noi cunotine, de recapitulare sau a prelegerilor n care calculatorul poate reprezenta suport al unor sinteze, imagini, figuri ce pot fi proiectate n scopul transmiterii de cunotine. n felul acesta elevii au posibilitatea s vizioneze o expunere concret i clar a teoremelor, pot s aib pe ecran imaginea unor fenomene sau procese simulate pe calculator. Realizarea unor calcule numerice, mai mult sau mai puin complicate, n scopul formrii deprinderilor de calcul sau al eliberrii de etapa calculatorie n rezolvarea unor probleme, prelucrarea unor date. Realizarea unor bnci de date, adic stocarea de informaii dintr -un domeniu oarecare ntr-o modalitate care s permit ulterior regsirea informaiilor dup anumite criterii. nvarea unui limbaj de programare. Realizarea unor laboratoare asistate de calculator.

1.2 Tipuri de manuale electronice

Odat cu dezvoltarea tehnologiilor informaionale a aprut un nou tip de manual manualele electronice. Acest tip de manual reprezint o treapt n evoluia instruirii asistate de calculator. Tipurile existente de manuale electronice sunt foarte diverse. Aceast diversitate se datoreaz, n primul rind, existenei diferitelor firme mari productoare de soft, cum ar fi Adobe, care a creat formatul de manual electronic cel mai cunoscut - .pdf (public document format). Interfaa unui manual electronic *.pdf este prezentat n Figura 1 de mai jos:

Figura 1 Interfaa unui manual electronic n format *.pdf Pe parcursul ndepliniri tezei, se va crea un manual electronic propriu, care va avea aspectul unui cri adevrate (de hrtie), aceasta realizndu-se prin efectul de rsfoire a paginilor (engl. - flip-page). Acest manual va conine informaii la disciplina Structuri de date i algoritmi. Am ales disciplina dat, deoarece aceasta reprezint baza programrii, odat fiind nelese principiile fundamentale de programare, structurile de date frecvent utilizate i
10

algoritmii de implementare a acestora, le putem realiza cu uurin n orice limbaj ntr un timp relativ scurt. Cu toate c, n prezent, pentru majoritatea limbajelor de programare, au fost create diferite biblioteci de clase, funcii i algoritmi, precum i diferite framework-uri (de ex., Standard Template Library pentru C++, sau .NET Framework pentru C#, Visual Basic i alte limbaje), nelegerea modului n care acestea au fost implementate ne va face s fim mai buni specialiti n domeniul tiinei Calculatoarelor i Tehnologiilor Informaionale, lrgindu-ne orizonturile.

11

II. STRUCTURI DE DATE I ALGORITMI


Cursul la disciplina Structuri de date i algoritmi, care a fost utilizat pentru crearea unui manual electronic n cadrul acestei teze de licen, are urmtoarea structur: 1. Elemente de programare avansat n limbajul C 2. Fiiere 3. Proiectarea i dezvoltarea sistematic a programelor de mari dimensiuni 4. Recursivitatea n C 5. Metode generale de proiectare a algoritmilor i programelor 6. Structuri de date dinamice 7. Tipuri de date abstracte 8. Tehnici de cutare i sortare Deoarece toate cele 8 capitole se refer, ntr-o mare msur la limbajele C/C++ (ceea ce ine de operaiile de Input/Output, lucrul cu pointeri, structure, uniuni etc.) i, inind cont c volumul de date prezente n curs este destul de mare (peste 400 de pagini),
12

n acest capitol vom descrie un singur tip abstract de date, i anume Stiva, descriind operaiile de baz asupra acesteia, cum ar fi plasarea unui item sau extragerea unui item din vrful acesteia.

2.1 Tipuri de date abstracte

2.1.1 Caracteristici Conceptul de dat abstract reprezint gruparea ntr-o construcie de program unitar a unor date, mpreun cu operaiile prin care se prelucreaz aceste date, organizate ca func ii. Acest concept generalizeaz noiunea de tip: reprezint att mulimea valorilor tipului ct i operaiile care pot fi executate asupra lor. Un tip de date abstract (TDA) este o entitate manipulat doar prin operaiile ce definesc acel tip. Utilizatorul nu trebuie s aib acces direct la reprezentarea intern a obiectului, ci numai prin intermediul acestor operaii. Limbajul C nu suport direct datele abstracte.Tipurile abstracte pot fi totui simulate folosind fiiere independente. Acest mod are propriile sale limitri: nu se pot defini tablouri de tipuri abstracte i nu se pot transmite parametri avnd ca i tip un tip abstract.

2.1.2 Avantaje
13

Avantajele utilizrii tipurilor abstracte de date sunt:

1. Programele devin independente de modul de reprezentare a datelor (de exemplu, o mulime poate fi implementat printr -un tablou sau printr-o list ordonat, dar partea de program ce definete operatorii tipului abstract rmne neschimbat. 2. Se previne violarea accidental a datelor. Utilizatorul tipului abstract este forat s manipuleze datele doar prin intermediul operatorilor ce compun tipul abstract (se reduce riscul unei distrugeri a datelor).

2.1.3 Stiva Stiva este un tip special de list n care toate inseriile i suprimrile de noduri au loc la un singur capt (vrful stivei). Vom defini un tip abstract stiv cu urmtorii operatori: 1. Iniializarea stivei. 2. Verificarea faptului c stiva este plin. 3. Verificarea faptului c stiva este goal. 4. Introducerea unui element n vrful stivei. 5. Eliminarea unui element din vrful stivei. 6. Furnizarea elementului din vrful stivei fr a -l elimina.
14

Stiva va fi materializat printr-un tablou de numere reale (stiva), iar vrful stivei este indicat de variabila ind_top. Toate declaraiile i definiiile trebuie s fie coninute ntr-un singur fiier. Att stiva ct i ind_top sunt definite cu clasa de memorare static pentru a ascunde de utilizator detaliile de implementare a stivei. static double stiva[MAX]; /* stiva */ static int ind_top; /* virful stivei */ Funciile au implicit clasa de memorare extern. Ele pot fi apelate din alte fi iere, iar toate operaiile asupra stivei sunt realizate doar prin intermediul lor. Iniializarea stivei: void init(void) { int i; for (i=0; i < MAX; i++) stiva[i] = 0; /* toate elementele devin 0 */ ind_top = -1; /*varful stivei indica primul elem. ocupat */ } Verificarea faptului c stiva este plin: int plin(void) { return ind_top == MAX - 1; } Verificarea faptului c stiva este goal: int gol(void) {
15

return ind_top == -1; } Introducerea unui element n vrful stivei: void push(double nr) { if (plin()) /* daca stiva este plina */ { printf(Eroare: stiva este plina\n); exit(1); } /* noul element este introdus in virful stivei*/ stiva[++ind_top] = nr; } Eliminarea elementului din vrful stivei: void pop(void) { if (gol()) /* daca stiva este goala */ { printf(Eroare: stiva este goala\n); exit(1); } /* decrementeaza virful stivei*/ ind _top --; } Furnizarea elementului din vrful stivei (fr a-l elimina):
16

double top(void) { if (gol()) /* daca stiva este goala */ { printf(Eroare: stiva este goala\n); exit(1); } /* returneaza elementul din varf*/ return stiva[ind_top]; }

17

III. Prezentarea tehnologiei WPF


WPF este imens. De fapt, poate fi copleitor, deoarece are o mulime de pri dinamice care se interconecteaz reciproc. De aceea, cel mai scurt rspuns la aceast ntrebare, este c WPF este un API pentru construirea interfeelor grafice utilizator (UI ) pentru aplicaiile desktop cu ajutorul .NET Framework. Acum urmeaz explicaia detaliat. Pentru nceput, WPF este o abreviere pentru Windows Presentation Foundation. Fizic, este un set de asamblri .NET i instrumente ajuttoare. Are scopul de a ne oferi un API unificat pentru crearea interfeelor utilizator sofisticate, cu coninut bogat pentru Windows XP, Windows Vista, Windows 7 i generaiile ulterioare. WPF combin cele mai bune lucruri din web development, precum foile de stil i un limbaj de marcare pentru interfeele utilizator declarative, cu lucruri bune din aplicaii Internet cu coninut bogat (Rich Internet Applications), cum ar fi grafica vectorial scalabil, animaia i suportul media. Aceste trsturi bune sunt mpachetate cu cele mai bune trsturi ale dezvoltrii aplicaiilor Windows tradiionale trsturi precum integrarea puternic cu Sistemul de Operare (SO) i legarea datelor (data binding). n WPF, aceste concepte sunt consolidate i unificate. Chiar toate cele menionate, nu redau intreaga msur a WPF. Aceasta are alte faete, aa ca suportul pentru desenarea 3D, tipografia avansat i docume nte portabile similare cu PDF.
18

De asemenea, WPF este un API unificat. Multe din chestiile pe care le putem face n WPF, le puteam face i mai nainte. Totui, fcndu-le pe toate ntr-o singur aplicaie era extreme de dificil. WPF nu ne permite numai s aducem aceste trsturi mpreun, dar ne ofer un API consistent pentru a realiza aceasta. WPF este doar o parte a unei imagini mai la rgi. Trei biblioteci adiionale au fost create ca parte component a .NET 3.0. Toate aceste patru biblioteci au ace eai intenie de a oferi un API consistent, unificat pentru domeniul lor. n plus, combinnd oricare dintre aceste biblioteci ntr-o aplicaie, se pot produce nite rezultate impresionante. Cele trei biblioteci care au fost eliberate impreun cu WPF sunt redate n Tabelul 1. Windows Presentation Foundation este concentrat pe transmiterea WCF mesajelor. Acest API simplific enorm toate tipurile de comunicare i transmitere a mesajelor n reea. Cuprinde totul, de la servicii web la P2P i multe altele. O bibliotec puternic pentru construirea aplicaiilor care permit lucrul cu workflow (flux de lucru). Folosete un limbaj de marcare WF pentru declararea workflow-urilor ntr-o aplicaie i de aceea previde workflow-ul de a fi hard-coded. De asemenea, uureaz munca dezvoltatorilor de a crea task-uri workflow personalizate. Cel mai puin renumit din cele patru biblioteci, CardSpace ofer CardSpace un system de identificare comun, care poate fi utilizat de aplicaii desktop, site-uri web, i multe altele. Tabelul 1 Tehnologiile lansate mpreun cu WPF

Predecesorul imediat al WPF este Windows Forms, API-ul grafic disponibil dezvoltatorilor n .NET 2.0 i mai devreme. Windows Forms ofer un wrapper controlat
19

pentru accesarea funciilor grafice ale API-ului Windows tradiional. WPF difer fundamental prin faptul c ea construiete pe baza DirectX. API -ul DirectX era concentrat iniial pe multimedia i programarea jocurilor n particular. Ca atare, n WPF suntem capabili de a construi trucuri vizuale excepionale care erau practice imposibile n Windows Forms. Aceasta nseamn, de asemenea, c WPF va profita de accelerearea hardware cnd aceasta va fi disponibil. WPF mai are cteva similitudini cu Windows Forms (i chiar cu ASP.NET Web Forms). Microsoft ofer o bibliotec cu controale de baz aa ca casete de text i butoane. De asemenea, vom ntlni concept familiare, precum data binding i fiiere code-behind. Toate aceste concepte au fost rafinate i nbuntite pentr WPF.

3.1 Caracteristicile WPF


n acest paragraf se vor descrie succint principalele caracteristici ale WPF.

3.1.1 Interfa utilizator declarativ (Declarative UI) WPF ne permite s construim interfaa utiliznd un limbaj de marcare numit XAML (se pronun zammel, rimeaz cu cammel). Ne vom aprofunda n XAML n capitolul n care se creaz aplicaia, dar dac am lucrat vreodat cu HTML, suntem dj familiarizai cu aceste concepte. XAML este un limbaj de marcare mult mai bogat dect HTML, i are mai puin ambiguitate. Visual Studio, precum i ali membri ai familiei de produse Expression, sunt capabile de a genara XAML nativ. XAML ofer un mediu comun de a interaciona cu designerii.

20

3.1.2 Poziionare inteligent Aranjarea pe ecran a diverselor componente ale unei aplicaii poate fi complicat, iar ulterior poate fi complicat din cauza multitudinilor posibiliti de afiare, pe care le pot avea utilizatorii. WPF ofer un sistem de p aginare extensibil pentru a aranja vizual elementele unei interfee utilizator. Aceasta se poate rediminsiona i ajusta inteligent, n dependen de cum definim layout-ul (paginarea).

3.1.3 Grafic scalabil Grafica n WPF este bazat pe vectori, n contrast cu grafica bazat pe raster. Grafica vectorial este n mod inerent scalabil i, de obicei, necesit mai puin memorie dect o imagine raster comparabil. WPF nc mai are mult suport pentru grafica raster, ns vectorii sunt un mod excelent de a construi interfeele utilizator. Grafica vectorial a devenit deja popular pe web, n primul rnd din cauza Adobe Flash i, ntr-o proporie mai mic, datorit specificaiei graficii vectoriale scalabile (SVG Scalable Vector Graphics). Rezultatul final pentru dezvoltatorii WPF este c aplicaiile se redimensioneaz estetic, fr a-i pierde calitatea vizual.

Vector versus Raster Un grafic raster este o imagine care este pstrat ca o gril dreptunghiular de pixeli, iar fiecare pixel are atribuit o culoare. Cele mai multe formate de fiiere grafice cu care s untem familiari sunt doar varia ii ale acestei metode. Aceasta include formate precum GIF, JPEG, BMP i PNG.
21

Graficele raster sunt, de asemenea, numite bitmap-uri. (A nu se confunda cu formatul de fiier BMP. Termenul bitmap este un termen general, descriind un mod particular de a pstra datele de imagini). S presupunem c avem o imagine raster a unui cerc albastru pe un fundal alb care este de 100100 pixeli. Calculatorul ncarc acei 10.000 de pixeli n memorie i i afieaz pe ecran. Acestea sunt multe date pentru o imagine att de simpl. S ne imaginm c avem nevoie de aceea imagine, dar de dou sau de tri ori mai mare. Numrul de pixeli crete exponenial. Dac am fi putut pur i simplu s -i furnizm calculatorului dou dimensiuni, poziia i culoarea formelor, atunci, am fi avut mult mai puine date de care s avem grij. n acest fel, grafica raster este ineficient. Alt problem cu imaginile raster este c ele nu se redimensioneaz bine. Se obine o pierdere vizibil a calitii, n special atunci cnd mrim o imagine. S presupunem c dorim s dublm mrimea unei imagini a noastre de 100100. Pentru a mri dimensiunea la 200200, am avea nevoie de 390.000 de pixeli n plus. Aceti pixeli care lipsesc vor trebui s fie interpolai din cei existeni. Grafica vectorial, totui, este pstrat ca primitive geometrice. Structura de date pentru o imagine vectorial conine informaie suficient pentru calculator pentru a desena imaginea. O imagine vectorial a unui cerc albastru pe un fundal alb ar conine poziia x i y a cercului, raza acestuia i metadatele indicnd c cercul era albastru, iar fundalul alb. Cnd un calculator red aceast imagine, acesta deduce pixelii actuali on the-fly. Aceasta nseamn c nu este nici o diferen n calitate ntre imaginea vectorial de 100100 i imaginea de 100100, i c mrimea datelor necesare de a desena imaginea este substanial mai mic. O regul general este c grafica vectorial este bun pent ru imaginile geometrice sau cele din desene animate, iar raster e mai bun pentru fotografi i imagini realistice.

3.1.4 Template-uri (abloane)


22

WPF faciliteaz crearea elementelor reutilizabile pentru interfeele noastre utilizator. Exist dou tipuri de template-uri n WPF: controale template i data template. Controalele template ne permit de a redefini modul n care arat controlul. De exemplu, dac aplicaia noastr trebuie s aib toate list box-urile cu un fundal albastru i o margine roie, putem utiliza un template de control pentru a redefini apariia vizual a list box-urilor. Controalele template, de asemenea, uureaz munca designer-ilor. Ei pot s ofere look-ul unui list box printr-un control template, cu puin sau nici un impact asupra procesului de dezvoltare real. Data template-urile sunt similare, cu excepia c, n loc de a defini modul n care controlul arat, ele definesc modul n care anumite tipuri de date sunt redate. S ne imaginm c avem o aplicaie care are de a face cu oameni, precum un manager de contacte, i c noi reprezentm oamenii n cod prin instane ale unei clase Person. Putem crea un data template, care definete cum o instan a unei clase Person este redat n UI. De exemplu, o instan a clasei Person poate fi vizualizat ca un card business cu o imagine, numele, prenumele i numrul de telefon. Dac utilizm un asemenea data template, ori de cite ori o instan Person este legat de ctre careva element UI, aa ca un list box, WPF va folosi template-urile de date corespunztoare. n practic, vom afla c template-urile de date sunt ntr-adevr comode atunci cnd lucrm cu liste sau alte colecii de date.

3.1.5 Legarea (Binding) Atunci cnd vorbim despre binding n WPF, probabil ne duce gndul imediat la conceptul de data binding. Data binding a fost deja popular cu Windows Forms i ASP.NET Web Forms, i a demonstrat utilitatea sa acolo. Cu toate c WPF are trsturi semnificative de data binding semnificative n sensul c depete cu mult predecesorii
23

si aceasta ne permite, de asemenea, s legm declarativ alte chestii, cum ar fi comenzi, legturi cu tastele, animaii i evenimente. De exemplu, putem lega declarativ un control buton cu o comand Paste.

3.1.6 Stilizarea (Styling) WPF ntr-adevr strlucete atunci cnd trebuie s facem o aplicaie s arate frumos. Aceasta ne permite s crem astfel de lucruri cum ar fi s facem fundalul unui text box rou sau s nconjurm un buton cu o margine albastr subire. Stilurile n WPF sunt similare cu foile de stil n cascad pentru HTML. Cu toate c, nc o dat, stilurile WPF sunt mai bogate i au mai puin ambiguitate. Ele cuprind toate caracteristicile vizuale pe care le ateptm, aa ca umplerea, marginea, poziionarea, culoarea, .a.m.d. ns putem, de asemenea, utiliza stiluri pentru a declara proprieti nonvizuale. Stilurile sunt, de asemenea, uor de reutilizat, iar atunci cnd le combinm cu template-uri, suntem capabili s facem nite lucruri uimitoare.

3.1.7 Declanatoare (Triggers) Att template-urile, ct i stilurile n WPF suport noiunea de trigger-e. Un trigger ne permite s-i spunem WPF ceva de genul: Atunci cnd mouse-ul este deasupra unui buton, f fundalul purpuriu. Cu alte cuvinte, trigger-ele ne permit s dirijm declarative schimbrile de stare. De asemenea, le vom gsi utile atunci cnd vom crea animaii.

3.1.8 Animaie
24

Framework-ul pentru animaie n WPF este foarte impresionant, i mult mai impresionant dect ne-am putea imagina. Majoritatea proprietilor n WPF pot fi animate, i exist support pentr u linii de timp (timelines), cadre cheie (key frames) i interpolare. Animaiile uor se integreaz cu template-urile i stilurile. De exemplu, putem defini un stil pentru un buton care animeaz butonul atunci cnd micm mouse ul deasupra lui. Dezvoltatorii Flash i designer-ii vor fi impresionai cu funciile disponibile.

3.1.9 3D n sfrit, WPF permite unele modelri i 3D de baz i animaie. S -a menionat de baz, deoarece WPF nu e destinat pentru construirea aplicaiilor 3D de nalt performan. Nu vom construi jocuri 3D n WPF (Dac suntem interesai n asta, trebuie s-i dm o privire platformei Microsft XNA). Cu toate acestea, trsturile 3D sunt puternice i uor integrate n orice interfa utilizator.

3.1.10 De ce s utilizm WPF

WPF, la fel ca bibliotecile sale surori eliberate cu .NET 3.0, sunt API-uri binefactorizate i consistente. Ele unific multe concepte de programare i, n ansamblu, fac mai uoare o mulime de sarcini de programare complicate. Totui, WPF nu este neaprat alegerea corect pentru fiecare proiect. Unele aplicaii desktop ar fi mai uor de construit i de ntreinut utiliznd Windows Forms. ns, vom gsi multe benficii atunci cnd lucrm cu WPF. Orice programator Windows ar trebui s nceap a nva WPF, deoarece aceasta va ajunge la un punct cnd va nlocui complet Windows Forms.
25

Urmeaz cteva scenarii unde WPF ntr -adevr strlucete: Proiectul nostru necesit colaborarea cu designeri. Utilizarea XAML i instrumentelor de suport ale acestuia pot ajuta cu adevrat aici. Dup ce programatorii i designerii devin familiarizai cu instrumentele, echipa lor poate avea ctiguri extraordinare n eficien. Aplicaia noastr este contient de media. Dac avem nevoie s integrm video i audio n proiectul nostru, vom dori cu siguran s lum n considerare WPF. Hardware-ul anticipat pentru aplicaia noastr are suport pentru DirectX 9 sau mai mare. WPF este construit deasupra la DirectX , iar aplicaiile noastre vor beneficia de accelerare hardaware. Aplicaia noastr necesit suport pentru tipografie avansat. WPF are suport pentru OpenType i multe alte funcii care nu sunt disponibile cu Windows Forms. n sfrit, ca dezvoltatori, putem face mai multe n mai puin timp. Chiar dac nu suntem preocupai de toate detaliile WPF, vom fi capabili s construim software de calitate cu mai puin efort.

3.1.11 Compararea WPF cu alte opiuni Dac suntem numai programatori .NET, ntr-adevr avem numai dou alte opiuni de considerat: Windows Forms i ASP.NET. Deja s -au comparat WPF i Windows
26

Forms pe parcursul acestui capitol. Unicele avantaje reale pe care Windows Forms le are sunt biblioteca sa imens de controale i suport third -party semnificativ. WPF nc este noul copil la bloc, iar mulimea de instrumente i materiale nc nu au avut timp s fie construite. Compararea WPF cu ASP.NET implic puin mai multe. ntrebarea aici se centreaz ntr-adevr pe implementare i distribuie. WPF este, la moment, limitat la platform Windows, i, evident, nu exist aa limitare ntr-o aplicaie web. WPF necesit .NET Framework 3.0 sau mai superior, precum i un mijloc de implementare a aplicaiei. Dac aplicaia noastr este centralizat, necesitnd una sau mai multe component server, va trebui probabil s reducem semnificativ complexitatea, alegnd s dezvoltm o aplicaie web. n afara lumii .NET, unele din aceleai caracteristici sunt disponibile cu Adobe Flash, n primul rind cnd este vorba de media i animaie. Istoric, Flash ntr-adevr a fost util numai n contextul Web. Totui, platform Adobe Air utilizeaz Flash pentru a dezvolta aplicaii desktop cross -platform. Cu toate acestea, Flash nc mai are unele dezavantaje notabile. Mediul de dezvoltare nu este la fel de robust ca .NET , cu toate c, indiscutabil, Flash tinde s fie mai mult pritenos pentru designer. Bibliotecile de controale pentru Flash sunt mult mai limitate i greu de folosit. Este posibil ca AIR va deveni un adevrat concurrent al WPF.

3.1.12 Prile componente i versiunile .NET Framework Fiecare versiune a .NET Framework conine motorul comun de execuie (CLR common language runtime) ca component sa de baz, i include component adiionale, precum bibliotecile cu clase de baz (base class libraries) i alte biblioteci managed. Aici vom descrie componentele cheie ale versiunilor .NET Framework, vom discuta despre
27

versiunile CLR de baz i mediile de dezvoltare asociate, i vom identifica versiunile care sunt instalate pe Windows. Figura 2 ilustreaz istoria versiunilor i care versiuni sunt instalate pe Windo ws.

Figura 2 Versiunile de .NET Framework

3.1.13 Caracteristici incluse n versiunile .NET Framework

Versiunea .NET Framework 1.0

Versiunea CLR 1.0

Versiunea Visual Studio

Descrierea

Visual Studio Conine prima versiune a CLR i prima .NET versiune a base class libraries. ADO.NET. Aceast versiune a fost
28

1.1

1.1

Visual Studio Include update-uri pentru ASP.NET i .NET 2003

ulterior nnoit de 2 ori, cu Service Pack 1 (Sp1) i SP2. Aceast versiune a introdus, de asemenea, execuia side by-side, care permite aplicaiilor pe un singur PC s ruleze pe diferite versiuni ale CLR. A introdus o nou versiune a CLR cu adaosuri la base class libraries, inclusiv 2.0 2.0 Visual Studio tipuri generice, colecii generice, i .NET 2005 adaosuri semnificative la ASP.NET. Aceast versiune este ulterior nnoit cu SP1 i SP2. Aceast versiune este n principal .NET 3.0 2.0 Visual Studio Framework 2.0 cu adugarea WPF, .NET 2005 WCF, WF i CardSpace. A fost ulterior nnoit cu SP 1 i SP 2. A adugat noi caracteristici, aa ca site Visual Studio .NET 2008 uri Web AJAX-enabled i LINQ. SP1 a adugat .NET Framework Client Profile, Dynamic Data i un mic set de nbuntiri adiionale. Include o nou versiune de CLR, a base Visual Studio .NET 2010 class libraries extinse, i noi trsturi, precum Managed Extensibility

3.5

2.0

Framework (MEF), dynamic language runtime (DLR) i contracte de cod.

29

3.1.14 Instrumente pentru WPF La elaborarea acestei teze, am lucrat, n primul rind, cu Visual Studio 2010. n mod specific, am utilizat ediia Express, care este oferit gratis de firma Microsoft. Visual Studio 2010 ofer support nativ pentru aplicaii WPF. Ediia Express a Visual Studio 2010 este disponibil la

www.microsoft.com/express/, mpreun cu alte resurse. Este posibil de construit aplicaii WPF i cu versiunile precedente, adic Visual Studio 2008, Visual Studio 2005 (cu toate c n cazul Visual Studio 2005, va trebui s instalm nite extensii Visual Studio, care n-au ajuns n realease-ul final al acestuia). De asemenea, putem utilize SharpDevelop (cunoscut i ca #develop). Este, de asemenea, un mediu integrat de dezvoltare (IDE Integrated Development Environment) open-source pentru .NET, i are suport pentru construirea aplicaiilor WPF n .NET 3.0. Este un IDE solid, ns este destul de greu s atingem nivelul de suport pentru WPF oferit de Visual Studio. Al doilea instrument major pentru crearea aplicaiilor WPF de la Microsoft este Expression Blend. Blend targheteaz designerii mai degrab dect programatorii. Lucreaz cu aceleai fiiere ca i Visual Studio, aa c un designer care utilizeaz Blend i un programator care folosete Visual Studio, pot lucre ambii la aceleai proiecte, soluii i fiiere. Blend este oarecum comparabil cu IDE-ul pentru Adobe Flash. Vom gsi aici instrumente de desenare, linii de timp pentru animaii, palete i alte funcii centrale pentru designeri. n ciuda scopului acestuia, se recomand ca i programatorii s devin familiarizai cu Blend. Blend este, de asemenea, unul din primele produse de la Microsoft scrise cu WPF. Un produs third-party exist pentru proiectarea interfeelor WPF Aurora, creat de Mobiform Software. Acesta furnizeaz un set asemntor de caracteristici ca i
30

Expression Blend. O trstur notabil este c designerul Aurora poate fi integrat n alt aplicaie WPF. Deci, dac avem nevoie de a oferi un editor XAML n aplicaia noastr, putem s utilizm acest produs. Expression Design este alt produs de la Microsoft. Acesta este destinat crerii coninutului grafic bazat pe vectori, similar cu Adobe Illustrator sai Inkscape. Expression Design poate fi folosit pentru crearea de logo-uri, icon-uri i ilustraii pentru utilizarea cu WPF. Poate produce grafic ca XAML, care poate fi apoi ncorporat direct n WPF. Expression Design difer de Blend, prin faptul c scopul primar al Blend este pur i simplu crearea interfeelor utilizator. Multe alte aplicaii pentru producerea artei 2D i 3D au acum plug-in-uri disponibile pentru transformarea i exportarea n XAML (XAML este limba nativ a WPF). Unele din aplicaiile care au plug-in-uri disponibile sunt Adobe Fireworks, Adobe Illustrator, Inkscape, Maya, Blender i Lightware. n afar de instrumentele 3D menionate pn acum, este disponibil cel puin un editor specific WPF ZAM 3D, creat de Electric Rain. ZAM 3D este foarte similar cu produsul Swift3D pentru Flash. Este mai abordabil dect majoritatea editoarelor 3D i este probabil cel mai bun loc pentru a ncepe pentru dezvoltatorii interesai n WPF. Un instrument final care merit menionat este Kaxaml. Acesta este un editor XAML lightweight, care ofer un live preview. Aceasta nseamn c putem vedea cum WPF va reda markup-ul nostru n timp ce scriem. Este un instrument foarte util de avut la ndemn, i la momentul de fa este gratuit. Multe alte instrumente, utilitare, biblioteci de controale, i aa mai departe, sunt disponibile n fiecare zi. Unele sunt produse comerciale third -party, altele sunt create de comunitatea de programatori i sunt gratuite. Pentru simplicitate, vom utilize Visual Studio 2010, care ofer toate cele necesare, inclusiv funcia WYSIWYG (what-you-seeis-what-you-get).

31

3.1.15 WPF n contrast cu Silverlight Silverlight este o platform pentru dezvoltarea aplicaiilor internet cu coninut bogat (RIA - Rich Internet Applications), pe cnd WPF are tendina primar pentru aplicaiile desktop. Silverlight este un competitor direct pentru Adobe Flash i pune un accent puternic pe media, compatibilitate cross-platform, precum i pe mrimea mic pentru download i instalare. La fel ca Flash, Aplicaiile Silverlight sunt gzduite ntr-un browser. Microsoft a proiectat intenionat Silverlight ca s fie foarte asemntor cu W PF,cu toate c acestea sunt dou produse separate. De fapt, un nume iniial pentru Silverlight fusese WPF/E sau Windows Presentation Foundation / Everywhere. Dezvoltatorii familiari cu o tehnologie, vor avea un punct de pornire cu cealalt. La fel ca WPF, Silverlight folosete XAML pentru declararea interfeelor utilizator. n versiunea 1.0, o aplicaie Silverlight const numai din fiiere textuale care conin JavaScript i XAML. Totui, Silverlight 2.0, va suporta un runtime mai robust i o bibliotec de clase de baz similar cu standardul .NET BCL. Vom putea scrie aplicaii Silverlight n limbajul nostrum .NET preferat i s le compilm la asamblri pentru distribuire. Silverlight 2.0 va arta mult mai mult ca WPF, ns trebuie s fim contieni c exist diferene semnificative. Este aproape sigur c Silverlight nu va suporta toate caracteristicile WPF. De asemenea, codul scris pentru Silverlight poate necesita schimbri semnificative nainte de a fi compilat pentru o aplicaie standard .NET. Trebuie s avem n vedere ntotdeauna c runtime-ul pentru Silverlight este diferit de CLR.

3.2 Limbajul XAML

32

XAML, sau Extensible Aplication Markup Language (limbaj de marcare al aplicaiei extensibil), este un limbaj bazat pe XML creat de Microsoft. Este fundamenta l pentru WPF la fel ca HTML pentru dezvoltarea web.

3.2.1 Definiia XAML XAML (pronunat zammel) este limbajul folosit pentru crearea interfeelor utilizator n WPF. Este un limbaj bazat pe XML similar cu HTML, MXML, sau XUL. XAML are aplicabilitate reuit i n afara definirii interfeelor utilizator. De fapt, este chiar posibil de a reprezenta date cu XAML, precum un table de iruri sau o instan a unui obiect. XAML este utilizat, de asemenea, de Windows Workflow Foundation (WF) pentru definirea de workflow-uri. n sensul cel ma general, XAML este un limbaj pentru serializarea instanelor obiectelor .NET ntr -un format lizibil omului. Chiar dac Visual Studio 2010 ofer un editor WYSIWYG cu support drag-anddrop pentru producerea i manipularea XAML, va trebui adesea s editm marcajul direct. Vom scrie XAML-ul nostrum cu mina aproape n ntreaga aplicaie. Extensia de fiier implicit este .xaml. XAML poate fi sau compilat, sau interpretat, n dependen de cum este utilizat. Unele funcii, precum ncadrarea codului C# sau VB n XAML, lucreaz numai cnd XAML este compilat. Atunci cnd crem o aplicaie WPF cu Visual Studio, XAML-ul folosit n aplicaie este compilat n executabilul rezultat. Totui, putem crea fiiere .xaml care intenioneaz s fie interpretate on-the-fly (nu este implicat nici o compilare). Aceste fiiere XAML sunt gzduite de obicei ntr-un browser web. Crearea unui program simplu hello world se poate realiza n felul urmtor:

1. Deschidem un editor de text preferat, cum ar fi Notepad sau Notepad++ 2. Crem un document textual simplu i introducem urmtorul cod:
33

<Page xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml> <TextBlock Text=Hello World! /> </Page>

3. Salvm documentul li l numim HelloWorld.xaml 4. Facem dublu-click pe fiierul nou creat i ar trebui s se deschid ntr -un browser web. Dac s-a deschis automat cu alt aplicaie, va trebui s lansm mai nti browser-ul (Internet Explorer sau Mozilla Firefox), apoi s tragem fiierul n browser. Astfel, am creat prima aplicaie WPF, utiliznd XAML. HelloWorld.xaml este un exemplu de XAML interpretat, deoarece noi nu am compilat aplicaia ntr-un executabil. Aplicaiile compuse numai din XAML sunt foarte limitate, iar n viaa real vom folosi mai degrab XAML npreun cu C# sau VB. n HelloWorld.xaml, observm c elementul rdcin este tag-ul Page. Exist i alte posibiliti, cel mai frecvent fiind tag-ul Window. Cnd crem XAML, elemntul nostru rdcin ntotdeauna definete dou spaii de nume. Spaiul de nume implicit se mapeaz specific n WPF, iar prefixul x: este pentru caractersiticile mai generice ale XAML. Dup cum s-a menioonat, XAML poate fi utilizat pentru reprezentarea oricror tipuri de date; am utilizat spaiul de nume implicit pentru a spune c reprezentm date despre WPF. Spaiul de nume x: reprezint un context mai larg. Poat s par ceva napoiat, ns n general nu se utilizeaz spaiul de nume x la fel de mult precum cel implicit. Aceste alias-uri pentru spaiile de nume reprezint o convenie, adoptat de Microsoft. Spaiile de nume n XAML sunt adesea confundabile dac nu am lucrat cu ele mai nainte. Ele au aceeai funcie ca i spaiile de nume n .NET, el ofer un domeniu pe ntru nume unice. Este similar ideii de a avea doi oameni numii John Smith. Pentru a -i distinge,
34

trebuie s-i numim John Smith din Chicago i John Smith din Boston. Includerea locului de unde ei vin este analog cu spaiul de nume. Atunci cnd dou lucruri se numesc la fel, i nu le putem distinge, se numete coliziune de nume.

3.2.2 Sintaxa XAML Ca o regul general, un element n XAML este o instan a unui obiect, iar atributele reprezint proprietile acelui obiect. Marcajul din Lisingul reprezint codul unui simplu buton pe o pagin.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Button x:Name="blueButton" Width="100" Height="40" Background="Blue" Content="Click Me" /> </Page>

Elementul rdcin corespunde unei instane a Page, mai precis System.Windows. Controls.Page, iar orice se afl n spaiul de nume System.Windows.Controls, este un control WPF. Elementul Button corespunde unei instane a clasei System.Windows.Controls. Button. La rndul lor, atributele elementului Button reprezint propritile unei instane obiect. De aceea, am setat valorile pentru proprietile Width, Height, Background i Content. Avem, de aeemenea, atributuk x:Name, care stric regula aici. x:Name nu este o propietate a clasei Button. n schimb, este un atribut special care ofer un identificator unic obiectului pentru a-l accesa n cod. Este la fel ca i cum am crea o variabil de tipu l Button cu numele blueButton. Elementul Button din exemplul precedent este echivalent cu urmtorul cod C#:
35

Button blueButton = new Button(); blueButton.Width = 100; blueButton.Height = 40; blueButton.Content = "Click Me"; blueButton.Background = new SolidColorBrush(Colors.Blue);

Proprietatea Background este puin mai complex dect celelalte. Este important ca elemental XAML la care dorim s ne referim, n cod sau oriunde n XAML, s posede o valoare unic pentru x:Name. Atribuirea unei valori lui x:Name este ca i cum am crea o variabil i i-am atribui instana unui obiect. 3.2.3 Setarea proprietilor care nu sunt tipuri simple n calsa Button, Width i Height sunt tipuri simple de date. WPF convertete valoarea string 100 la un double implicit. Totui, multe proprieti ale controalelor nu sunt tipuri de date simple. Unele proprieti sunt obiecte care ele nsui au o mulime de proprieti. n exemplu de mai sus, proprietatea Background a butonului este de tipul SolidColorBrush. n XAML, putem pur i simplu s declarm Blue i va merge. Exist multe locuri n XAML unde tipuile frecvent utilizate, precum SolidColorBrush, pot fi reprezantate de o valoare string simpl, pe care WPF tie cum s o trateze. n cazul SolidColorBrush, putem scrie orice culoare care este prezent n clasa System.Windows.Media.Colors, sau putem scrie o reprezentare hexagesimal a culorii similar cu cele utilizate n HTML sau CSS. Urmtoarele fragmente XAML sunt echivalente:
<Button Background="#FF0000FF" /> <Button Background="Blue" />

Totui, n unele situaii, aceast prescurtare nu este suficient pentru a -i spune WPF ceea ce dorim. n acele cazuri, putem folosi sintaxa elementelor proprietate. Sintaxa elementelor proprietate este o sintax alternativ folosit pentru a atribui valori de tipuri complexe. n locul setrii propritii Background folosind un atribut, putem folosi un element copil. Urmtorul fragment demostreaz utilizarea acestei sintaxe alternative pentru setarea fundalului la albastru:
<Button> <Button.Background>

36

<SolidColorBrush Color="Blue" /> </Button.Background> </Button>

Elementul copil este referit ca un element proprietate. Elementele proprietate au forma <ClassName.PropertyName />. Prima parte este numele clasei, urmat de un punct, urmatp de numele proprietii. Coninutul elementului copil este valoarea pe care dorim s o setm. Cnd utilizm un element proprietate, trenuie s fim mai explicii i s-i spunem WPF c dorim ca valoarea s fie o instan a SolidColorBrush cu proprietatea Color setat la albastru. Se recomand de autiliza prescurtarea ori de cite ori este posibil. Marcajul succinct este mai uor de citit i face intenia XAML mai clar.

3.2.4 Proprietatea Content Multe din controalele WPF pe care le ntlnim au o proprietate numit Content. Aceasta este una special. n listingul de mai jos, se seteaz coninutul unui buton la a valoare string, Click Me. Totui, putem de asemenea seta proprietatea Content implicit, folosind un element copil. De exeplu, urmtoarele elemente XAML sunt echivalente:
<Button Content="Click Me" /> <Button>Click Me</Button>

Ambele butoane vor fi redate la fel n WPF. Ce este interesant, este faptul c Content este de fapt, de tipul object. Aceasta nseamn c putem face coninutul unui buton mult mai mult dect un simplu string. De exemplu, se prea poate c vom dori s desenm un cerc galben n interiorul butonului. Putem utilize urmtorul XAML:
<Button> <Ellipse Width="24"

37

Height="24" Fill="Yellow" /> </Button>

Putem, de asemenea, s setm propritatea Content explicit:


<Button> <Button.Content> <Ellipse Width="24" Height="24" Fill="Yellow" /> </Button.Content> </Button>

Totui, fcnd asta, este mai mult de scris i nu facem nimic pentru a mri lizibilitatea sau mentenabilitatea codului. Mai mult ca att, convenia de a seta implicit propritatea Content este aproape universal adoptat.

3.2.5 Extensii de Markup Uneoeri, trebuie s specificm valori n markup-ul nostru care sunt sau dificil de exprimat n XAML sau n afara domeniului procesorului XAML. XAML posed o funcie numit markup extensions, i aceasta ne permite s tratm aceste situaii. De exemplu, s presupunem c avem o culoare specific pe care dorim s o utilizm ca fundal pentru cteva butoane ntr-o aplicaie WPF. Am putea seta proprietatea Background pentru fiecare buton pentru a folosi aceeai culoare, ns ar deveni laborios dac vom avea nevoie vreodat s schimbm acea culoare. Cu WPF, putem pstra culoarea cu o cheie n resursele unei aplicaii. Acum puytem seta fundalul butoanelor n culoarea pe care am stocat-o n resurse. Daca dorim s schimbm culoarea, trebuie s facem asta numai ntr -un singur loc. Acesta este un scenario plcut, ns cum se poate de tratta aceasta n XAML. Vom folosi o extensie de marcaj.
38

n scenariul precedent, XAML-ul cu extensia de marcaj poate arta astfel:


<Button Background="{StaticResource ResourceKey=myColor}" Content="Click Me" />

Extensiile de marcaj sunt identificate prin prezena acoladelor ({}) . Primul cuvnt n markup extension i spune WPF ce fel de extensie este. Numele extensiei este opional urmat de un set de parametri numii. n acest caz, extensia este pentru a primi o resurs partajat dintr-o bibliotec de resurse. Numele extensiei este StaticResourse, iar noi furnizm o valoare de myColor pentru parametrul ResourceKey. Multe extensii au un parametru implicit. Putem omite numele parametrului i semnul egal. De exemplu, am putea rescri fragmenul cu ResourceKey=:
<Button Background="{StaticResource myColor}" Content="Click Me" />

ResourceKey este parametrul implicit pentru StaticResource. n unele cazuri, vom avea mai mult de un parametru. Dac va fi aa, tebuie s separm perechile nume/valoare prin virgule. Modelul general este:

{ExtensionName Param1=Value1, Param2=Value2, Param3=Value3} Cea mia frecvent greeal n lucrul cu extensii markup este de a include ghilimele n jurul valorilor. Nu se permite s avem ghilimele ntre parantezele acolade. Aceasta face parser-ul confuz. Aceasta nseamn , de asemenea, c valorile parametrilor nu pot conine spaii albe. Multe extensii de markup sunt construite n WPF, iar noi putem chiar s scriem pe ale nostre (totui, nu se obinuiete de a face aa). Vom descrie extensii specifice n urmtorul capitol ; totui, Tabelul 2 ofer un rezumat foarte scurt a celor mai semnificative extensii.
39

Numele Binding StaticResource

Descrierea Extensia folosit pentru legarea datelor. Aceasta e foloosit pentri a primi datele din resursele unei aplicaii. Nu se ateapt ca resursele statice s se schimbe ct timp aplicaia ruleaz.

DynamicResource Similar cu StaticResource, cu excepia c datele n resurs se pot schimba n timpul execuiei. x:Null x:Type X:Array Se utilizeaz pentru a specific o valoare null n XAML. Aceast extensie e folosit pentru a furniza un obiect System.Type. Aceasta permite de a defini un vector de obiecte n XAML. Tabelul 2 Extensiile markup frecvente n WPF

40

IV. REALIZAREA MANUALULUI ELECTRONIC


Manualul electronic a fost realizat n 2 etape: mai nti a fost important un proiect existent, de tip Class Library, cu numele WpfBookControls, care conine clasele BookPage, Book i alte structuri i enumerri adiionale, apoi a fost creat proiectul principal, cu numele WpfAppTezaDeLicenta, unde s-au utilizat controalele din primul proiect i a fost integrat coninutul disciplinei Structuri de date i algoritmi n aplicaie.

4.1 Proiectul WpfBookControls


Proiectul WpfBookControls este un proiect de tip bibliotec. Modul n care acesta a fost creat, permite de a fi uor reutilizat n alte aplicaii, sau de a fi extins, adugndu-i-se posibiliti noi, i apoi utilizat. n acest paragraf se va descrie modul de implementare a acestuia (Vezi ANEXA 1).

4.1.1 Modulul cu tipuri de date auxiliare


41

Iniial, a fost creat fiierul UtilityItems.cs, care conine dou enumerri, o clas static i o structur, dup cum urmeaz:
public enum CornerOrigin { TopLeft, TopRight, BottomLeft, BottomRight }; public enum PageStatus { None, Dragging, DraggingWithoutCapture, DropAnimation, TurnAnimation }

Semnificaiile acestora sunt evidente, datorit denumirilor sugestive. Urmeaz clasa LinearGradientHelper, care are umtoarea structur:
static class LinearGradientHelper { public static void ComputePoints(double controlWidth, double controlHeight, double x, double y, double r1, double r2, CornerOrigin fromCorner, out Point startPoint, out Point endPoint) { } public static void ComputePointsFromTop(double controlWidth, double controlHeight, double x, double y, double r1, double r2, CornerOrigin fromCorner, out Point startPoint, out Point endPoint) { } }

Aceasta se utlizeaz cnd se dorete calcularea coordonatelor paginilor atunci cnd acestea sunt rsfoite. Aceasta este necesar, deoarece paginile folosesc un gradient, care va trebui s-i schimbe coordonatele n dependen de poziia paginii. Mai jos avem structura PageParameters, care se utillizeaz pentru pstrarea parametrilor unei pagini. Aceasta conine 14 cmpuri private, fiecare avnd proprietile setter i getter corespunztoare. Constructorul cu un parametru iniializeaz aceste date.
Struct PageParameters { private double _page0ShadowOpacity; private double _page1RotateAngle; private double _page1RotateCenterX; private double _page1RotateCenterY; private double _page1TranslateX; private double _page1TranslateY; private PathFigure _page1ClippingFigure; private PathFigure _page2ClippingFigure; private Point _page1ReflectionStartPoint; private Point _page1ReflectionEndPoint; private Point _page0ShadowStartPoint; private Point _page0ShadowEndPoint; public Point Page0ShadowEndPoint private Size _renderSize; public PageParameters(Size renderSize) {

42

_page0ShadowOpacity = 0; _page0ShadowEndPoint = new Point(); _page0ShadowStartPoint = new Point(); _page1ClippingFigure = new PathFigure(); _page1ReflectionEndPoint = new Point(); _page1ReflectionStartPoint = new Point(); _page1RotateAngle = 0; _page1RotateCenterX = 0; _page1RotateCenterY = 0; _page1TranslateX = 0; _page1TranslateY = 0; _page2ClippingFigure = new PathFigure(); _renderSize = renderSize; } }

4.1.2 Controlul BookPage Controlul BookPage motenete de la System.Windows.Controls.ContentControl, ceea ce nseamn c acest control poate avea orice coninut text, imagini, fotografii, video, animaii, i are partea de design, vezi ANEXA 2, iar clasa definit n code-behind, este definit n dou fiiere i are urmtoarea strucur: Fiierul BookPage.xaml.cs
namespace WpfBookControls { partial class BookPage : System.Windows.Controls.ContentControl { private const int animationDuration = 500; private const double gripSize = 30; internal CornerOrigin origin = CornerOrigin.BottomRight; public PageStatus Status { } private Point CornerPoint { } public bool IsTopLeftCornerEnabled public bool IsTopRightCornerEnabled public bool IsBottomLeftCornerEnabled public bool IsBottomRightCornerEnabled { } { } { } { }

43

public static readonly RoutedEvent PageTurnedEvent; public static DependencyProperty CornerPointProperty; public static DependencyProperty IsTopLeftCornerEnabledProperty; public static DependencyProperty IsTopRightCornerEnabledProperty; public static DependencyProperty IsBottomLeftCornerEnabledProperty; public static DependencyProperty IsBottomRightCornerEnabledProperty;

private void ApplyParameters(PageParameters parameters) { } void anim_Completed(object sender, EventArgs e) { } void anim_CurrentTimeInvalidated(object sender, EventArgs e) { } private void OnMouseDown(object sender, MouseButtonEventArgs args) { } private void OnMouseUp(object sender, MouseButtonEventArgs args) { } private void OnMouseMove(object sender, MouseEventArgs args) { } private void OnMouseLeave(object sender, MouseEventArgs args) { } private static int ComputeAnimationDuration(UIElement source, Point p, CornerOrigin origin) { } private static double ComputeProgressRatio(UIElement source, Point p, CornerOrigin origin) { } private bool IsOnNextPage(Point p, UIElement source, CornerOrigin origin) { } private void DropPage(int duration) { } public void TurnPage() { } private void TurnPage(int duration) { } public void AutoTurnPage(CornerOrigin fromCorner, int duration) { } } }

n Tabelul 3 de mai jos sunt descrise datele membre ale clasei de mai sus: Denumirea animationDuration Descrierea Constant ce definete perioada de autorsfoire a unei pagini (n milisecunde). gripSize Constant ce definete lungimea laturii patratului invizibil din fiecare col al paginii, deplasarea mouse -ului pe suprfaa acestuia declannd un eveniment. origin Definete originea colului de unde va fi tras foaia la
44

rsfoire. Implicit, va fi Dreapta-Jos. Status Proprietate de tip PageStatus, care define te starea paginii. Initial va avea valoarea PageStatus.None. CornerPoint Proprietate de tip Point, care definete coordonatele punctului dintr-un oarecare col al paginii. IsTopLeftCornerEnabled Proprietate de tip bool, care ne indic dac colul Stnga-Sus este activ. Sunt definite nc trei astfel de proprieti pentru fiecare col, cu numele respective. PageTurnedEvent CornerPointProperty Evenimentul static care se produce rsfoirea paginii. Proprietate dependen, care mpreun cu alte patru astfel de proprieti, precum i evenimentul precedent, se vor nregistra n constructorul static (dependency properties se declar ntotdeauna statice, el permit uor ca s se lege unele evenimente cu triggere, alte evenimente etc.)

Tabelul 3 Datele membre ale clasei BookPage

n Tabelul 4 de mai jos sunt descrise metodele clasei BookPage din fiierul BookPage.xaml:

Denumirea ApplyParameters anim_Completed

Descrierea Aplic noii parametrii pentru pagina curent. Se apeleaz atunci cnd pagina ncepe s fie rsfoit, sau este oprit, apelind funcia precedent, apoi schimbnd starea crii.

anim_CurrentTimeInvalidated Similar cu cea precedent, ns apeleaz i alt funcie,


45

care

calculeaz

coordonatele

paginii,apoi

se

redeseneaz. OnMouseDown Se apeleaz atunci cnd mouse-ul are butonul clickstnga apsat. OnMouseUp Se apeleaz atunci cnd mouse-ul elibereaz butonul click-stnga. OnMouseMove Se apeleaz atunci cnd mouse-ul se mic n preajma colului paginii. OnMouseLeave Se apeleaz atunci cnd mouse-ul prsete aria colului paginii. ComputeAnimationDuration ComputeProgressRatio DropPage TurnPage Funcii auxiliare, ce se folosesc la calcule n timpul animaiei unei pagini. Se apeleaz cnd pagina se oprete Aceast funcie are dou suprancrcri. Primul tip are un parametru duration, care exprim ct timp va dura rsfoirea unei pagini. Al doilea o apeleaz pe prima cu valoarea variabilei animationDuration, care este de 500 milisecunde. AutoTurnPage Creaz animaie efectului de rsfoire a unei pagini.

Tabelul 4 Funciile clasei BookPage n fiierul BookPage.Compute.cs, clasa BookPage mai conine trei metode: una pentru resetarea paginii, alta pentru calcularea coordonatelor paginii i ultima pentru a verifica nite parametri ai pagii.

46

4.1.3 Controlul Book Ca orice alt control din WPF, acesta posed partea de design (vezi ANEXA 3) i partea funcional. Clasa Book motenete de la ItemsControl, ceea ce nseamn c poate conine o colecie de itemi. Aceasta este definit n fiierul Book.xaml.cs, care are urmtoarea structur: Fiierul Book.xaml.cs
public partial class Book : ItemsControl { private PageStatus _status = PageStatus.None; private int _currentSheetIndex = 0; internal object GetPage(int index) { } private void OnLoaded(object sender, RoutedEventArgs args) public void AnimateToNextPage(bool fromTop, int duration) { } public void AnimateToPreviousPage(bool fromTop, int duration) { } public int GetItemsCount(){ } private void RefreshSheetsContent(){ } private void OnLeftMouseDown(object sender, MouseButtonEventArgs args) { } private void OnRightMouseDown(object sender, MouseButtonEventArgs args) { } private void OnLeftPageTurned(object sender, RoutedEventArgs args) { } private void OnRightPageTurned(object sender, RoutedEventArgs args) { } public BookDisplayMode DisplayMode { } public BookCurrentPage CurrentPage { } private void AnimateToLeftSheet(){ } private void AnimateToRightSheet(){ } public void MoveToNextPage(){ } public void MoveToPreviousPage(){ } public enum BookDisplayMode { Normal, ZoomOnPage } public enum BookCurrentPage { LeftSheet, RightSheet } } }

n interiorul clasei, avem definite dou enumerri: BookDisplayMode i BookCurrentPage. Semnificaia lor este evident. Descrierea datelor membre ale clasei Book este reprezentat n Tabelul 5.

47

Denumirea _status _currentSheetIndex

Descrierea Definete starea unei pagini. Iniial este Status.None. Definete pagina indexul paginii curente. Iniial este zero. Tabelul 5 Cmpurile clasei Book

n Tabelul 6, se descriu funciile principale din clasa dat, mpreun cu descrierea lor.

Denumirea GetPage

Descrierea Funcie intern ce returneaz o pagin cu indexul dat ca parametru. Initializeaz controlul la ncrcare. Animeaz trecerea la urmtoarea pagin.

OnLoaded AnimateToNextPage

AnimateToPreviousPage Animeaz trecerea la pagina precedent. GetItemsCount RefreshSheetsContent OnLeftMouseDown OnRightMouseDown OnLeftPageTurned Retuneaz numrul total de itemi inclui n control. Reactualizeaz coninutul paginilor. Funcia ce trateaz evenimentul apsrii click -stnga. Funcia ce trateaz evenimentul apsrii click -dreapta. Funcia ce ce se apeleaz atunci cnd se dorete rsfouirea la stnga. OnRightPageTurned Funcia ce ce se apeleaz atunci cnd se dorete rsfouirea la dreapta. DisplayMode CurrentPage Proprietate ce returneaz modul de afiare curent. Proprietate ce returneaz pagina curent.
48

AnimateToLeftSheet AnimateToRightSheet MoveToNextPage MoveToPreviousPage

Aceste patru funcii au corpul asemntor, fiecare putnd fi utilizat pentru tipuri diferite de animaii spre stnga, respectiv, spre dreapta.

Tabelul 6 Funciile clasei Book

4.2 Proiectul WpfAppTezaDeLicenta


Acest proiect reprezint programul principal, care se ncarc atunci cnd soluia este rulat. El este compus din mai multe pagini XAML, care stocheaz informaia propriu-zis. Informaia este reprezentat prin imagini .JPG, toate fiind amplasate logic n mape i submape, pentru o mai bun claritate i uurin n dezvoltarea ulterioar

4.2.1 Clasa StartWindow Aceasta este clasa care se ncarc atunci cnd este lansat programul. Ea este un control WPF, compus din 2 pri partea de design (Vezi ANEXA 4), i partea funcional, care este descris n continuare. n Visual Studio 2010, modul Design, controlul dat va arta astfel:

49

Figura 3 Interfaa aplicaiei vzut n Visual Studio 2010 Funcionalitatea clasei StartWindow este redat mai jos:
public partial class StartWindow : Window { public StartWindow() { InitializeComponent(); Width = 800; Height = 600; this.WindowStartupLocation = WindowStartupLocation.CenterScreen; } private void ButtonNext_Click(object sender, RoutedEventArgs e) { if (myBook.CurrentSheetIndex < myBook.GetItemsCount() / 2) myBook.CurrentSheetIndex++; } private void ButtonPrevious_Click(object sender, RoutedEventArgs e) { if (myBook.CurrentSheetIndex > 1) myBook.CurrentSheetIndex--;

50

} protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); try { if (e.Key == Key.Escape) { { this.WindowState = WindowState.Minimized; Environment.Exit(0); } } else if (e.Key == Key.Left) { myBook.AnimateToPreviousPage(true, 500); if (Int32.Parse(pageNumber.Text) > 1) { pageNumber.Text = (Int32.Parse(pageNumber.Text) - 2).ToString(); } myBook.Focus(); } else if (e.Key == Key.Right) { myBook.AnimateToNextPage(true, 500); if (Int32.Parse(pageNumber.Text) < 431) { pageNumber.Text = (Int32.Parse(pageNumber.Text) + 2).ToString(); } myBook.Focus(); } else if (e.Key == Key.Enter) { if (this.WindowState == WindowState.Maximized) { this.WindowState = System.Windows.WindowState.Normal; } else { this.WindowState = WindowState.Maximized; } } } catch (Exception) { } } private void ButtonMinimize_Click(object sender, RoutedEventArgs e) { this.WindowState = WindowState.Minimized; } private void ButtonMaximize_Click(object sender, RoutedEventArgs e)

51

{ if (this.WindowState == WindowState.Maximized) { this.WindowState = System.Windows.WindowState.Normal; } else { this.WindowState = WindowState.Maximized; } } private void ButtonCloseApplication_Click(object sender, RoutedEventArgs e) { Environment.Exit(0); } private void ButtonCuprins_Click(object sender, RoutedEventArgs e) { myBook.CurrentSheetIndex = 2; pageNumber.Text = "5"; } private void ButtonCauta_Click(object sender, RoutedEventArgs e) { SearchWindow.Show(); } }

Deoarece metodele de mai sus au fost incluse mpreun cu corpurile lor, vom descrie succint pe fiecare din ele. Constructorul implicit iniializeaz aplicai cu dimensiune de 800600 ( pentru a putea rula pe diferite tipuri de calculatoare, inclusiv cele cu rezoluia minim) i este centrat pe desktop. Funciile ButtonNext_Click i ButtonPrevious_Click realizeaz rsfoirea paginilor nainte, respective, napoi. n funcia protected override void OnKeyDown(KeyEventArgs e) se realizeaz tratarea evenimentelor aprute la tastarea unor butoane de la tastatur, cum ar fi Sgreat-Sus sau Enter. Funciile ButtonMinimize_Click, ButtonMaximize_Click i, respectiv, ButtonCloseApplication_Click, realizeaz funcionalitatea butoanelor standarte, prezente aproape n orice aplicaie Wondows. De remarcat c aceste butoane reprezint controale
52

custom, deoarece cele standard au fost scoase din cadrul aplicaiei, inclusiv a fost scoas i bara standart din partea de sus a aplicaiei. Funcia ButtonCuprins_Click deschide cartea la pagina de Cuprins, pentru a cuta manual tema dorit. Funcia ButtonCauta_Click va deschide o mic fereastr, n care se va efectua cutarea automat a unei teme, sau termen dorit.

53

CONCLUZII
n cadrul tezei de licen au fost obinute urmtoarele rezultate: Au fost analizate manualele elctronice i tipurile acestora.

Au fost stabilite funciile de baz ale unui manual electronic.

A fost descris succint tehnologia WPF i au fost evideniate avantajele i dezavanatajele acesteia fa de alte tehnologii.

Au fost analizate metodele de reprezentare a coninutului unui manual electronic i au fost stabilite avantajele i dezavantajele fiecre ia.

S-a elaborat proiectul unui manual electronic la disciplina Structuri de date i algoritmi.

A fost programat i depanat manualul electronic proiectat.

Manualul elctronic poate fi utilizat att pentru pregtirea pentru examen la disciplina Fundamentele programrii n limbajul C, ct i la disciplina Structuri de date i algoritmi

Manualul poate fi reutilizat, ncrcat cu alt coninut, precum i extins prin adugarea iunor funcionaliti i efecte noi.
54

BIBLIOGRAFIE
1. Pro C# 2010 and the .NET 4 Platform Fifth edition, Andrew Troelsen, Apress, 2010

2. Sams Teach Yourself WPF in 24 Hours, Rob Eisenberg and Christopher Bennage, Sams, 2009

3. Pro C# 2008, Christian Nagel, Bill Evjen, Jay Glynn, Morgan Skinner and Karli Watson, Wrox, 2008

4. Visual C# 2010 Recipes: A Problem-Solution Approach, Allen Jones and Adam Freeman, Apress, 2010

5. Pro WPF Programming, Chris Andrade, Shawn Livermore, Mike Meyers and Scott Van Vliet, Wrox, 2007

6. http://www.codeproject.com/KB/GDI-plus/TurnThePage.aspx

7. http://www.wpfbookcontrol.codeplex.com/

8. http://www.wpftutorial.net/

9. http://windowsclient.net

10. http://infoscience.3x.ro/c++.html

55

ANEXA 1 Structura proiectelor create n cadrul tezei de licen

56

ANEXA 2 Codul fiierului BookPage.xaml

<ContentControl x:Class="WpfBookControls.BookPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="OnLoaded" BorderBrush="Red" BorderThickness="1" MouseDoubleClick="OnMouseDoubleClick" MouseMove="OnMouseMove" MouseDown="OnMouseDown" MouseUp="OnMouseUp" MouseLeave="OnMouseLeave" > <Grid x:Name="mainGrid"> <!--Page 2 begin--> <ContentPresenter x:Name="page2" /> <!--Page 2 end--> <Canvas Opacity="1" x:Name="nextPageShadowCanvas" Visibility="Hidden"> <Canvas.Background> <LinearGradientBrush x:Name="nextPageShadow" StartPoint="0 0" EndPoint="0 0"> <GradientStop Color="Transparent" Offset="0" /> <GradientStop x:Name="nextPageShadowCanvasOffset1" Color="Black" Offset="0" /> <GradientStop x:Name="nextPageShadowCanvasOffset2" Color="Transparent" Offset="1" /> <GradientStop Color="Transparent" Offset="1" /> </LinearGradientBrush> </Canvas.Background> </Canvas> <Grid> <Grid.Clip> <CombinedGeometry x:Name="clippingPage0" GeometryCombineMode="Exclude"> <CombinedGeometry.Geometry1> <RectangleGeometry /> </CombinedGeometry.Geometry1> <CombinedGeometry.Geometry2> <PathGeometry> <PathFigure IsClosed="True" /> </PathGeometry> </CombinedGeometry.Geometry2> </CombinedGeometry> </Grid.Clip> <!--Page 0 begin--> <ContentPresenter x:Name="page0" /> <!--Page 0 end--> </Grid> <Canvas Opacity="1" x:Name="gridShadow" Visibility="Hidden"> <Canvas.Background> <LinearGradientBrush x:Name="pageShadow" StartPoint="0 0" EndPoint="0 0"> <GradientStop Color="Transparent" Offset="0" /> <GradientStop Color="Black" Offset="0" /> <GradientStop Color="Transparent" Offset="1" /> </LinearGradientBrush> </Canvas.Background> </Canvas> <Grid x:Name="rectangleVisible"> <Grid.RenderTransform>

57

<TransformGroup> <TranslateTransform x:Name="rectangleTranslate" /> <RotateTransform x:Name="rectangleRotate" /> </TransformGroup> </Grid.RenderTransform> <Grid.Clip> <PathGeometry x:Name="clippingFigure"> <PathFigure IsClosed="True" /> </PathGeometry> </Grid.Clip> <!--Page 1 begin--> <ContentPresenter x:Name="page1" /> <!--Page 1 end--> <Canvas Opacity="0.7" x:Name="canvasReflection" Visibility="Hidden"> <Canvas.Background> <LinearGradientBrush x:Name="pageReflection" StartPoint="0 0" EndPoint="0 0"> <GradientStop Color="Black" Offset="0" /> <GradientStop Color="White" Offset="0.35" /> <GradientStop Color="Transparent" Offset="1" /> </LinearGradientBrush> </Canvas.Background> </Canvas> </Grid> </Grid> </ContentControl>

58

ANEXA 3 Codul fiierului Book.xaml

<ItemsControl x:Class="WpfBookControls.Book" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfBookControls" ClipToBounds="False" Loaded="OnLoaded" Width="500" Height="300" > <ItemsControl.Resources> <DataTemplate x:Key="defaultDataTemplate"> <Grid> <ContentControl Content="{Binding .}" /> </Grid> </DataTemplate> </ItemsControl.Resources> <ItemsControl.Template> <ControlTemplate TargetType="{x:Type local:Book}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="50*" /> <ColumnDefinition Width="50*" /> </Grid.ColumnDefinitions> <local:BookPage Grid.Column="0" Name="sheet0" IsTopRightCornerEnabled="false" IsBottomRightCornerEnabled="false" MouseDown="OnLeftMouseDown" PageTurned="OnLeftPageTurned" /> <local:BookPage Grid.Column="1" Name="sheet1" IsTopLeftCornerEnabled="false" IsBottomLeftCornerEnabled="false" MouseDown="OnRightMouseDown" PageTurned="OnRightPageTurned" /> </Grid> </ControlTemplate> </ItemsControl.Template> <ItemsControl.RenderTransform> <TransformGroup> <ScaleTransform x:Name="scale" ScaleX="1" ScaleY="1" /> <RotateTransform Angle="0" /> <TranslateTransform x:Name="translate" X="0" Y="0" /> </TransformGroup> </ItemsControl.RenderTransform> </ItemsControl>

59

ANEXA 4 Codul fiierului StartWindow.xaml

<Window x:Class="WpfAppTezaDeLicenta.StartWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:WpfBookControls;assembly=WpfBookControls" xmlns:local="clr-namespace:WpfAppTezaDeLicenta" Title="StartUpWindow" Height="Auto" Width="Auto" WindowStyle="None" Background="Azure" WindowStartupLocation="CenterScreen" Icon="a.ico"> <Window.Resources> <Style x:Key="GelButton" TargetType="{x:Type Button}"> <Setter Property="Background" Value="Black" /> <Setter Property="Height" Value="40" /> <Setter Property="Foreground" Value="White" /> <Setter Property="Margin" Value="3" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid> <Rectangle Name="GelBackground" RadiusX="9" RadiusY="9" Fill="{TemplateBinding Background}" StrokeThickness="0.35"> <Rectangle.Stroke> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="White" /> <GradientStop Offset="1" Color="#666666" /> </LinearGradientBrush> </Rectangle.Stroke> </Rectangle> <Rectangle Name="GelShine" Margin="2,2,2,0" VerticalAlignment="Top" RadiusX="6" RadiusY="6" Stroke="Transparent" Height="15px"> <Rectangle.Fill>

60

<LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#ccffffff" /> <GradientStop Offset="1" Color="Transparent" /> </LinearGradientBrush> </Rectangle.Fill> </Rectangle> <ContentPresenter Name="GelButtonContent" VerticalAlignment="Center" HorizontalAlignment="Center" Content="{TemplateBinding Content}" /> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Rectangle.Fill" TargetName="GelBackground"> <Setter.Value> <RadialGradientBrush> <GradientStop Offset="0" Color="Lime" /> <GradientStop Offset="1" Color="DarkGreen" /> </RadialGradientBrush> </Setter.Value> </Setter> <Setter Property="Foreground" Value="Black" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Rectangle.Fill" TargetName="GelBackground"> <Setter.Value> <RadialGradientBrush> <GradientStop Offset="0" Color="#ffcc34" /> <GradientStop Offset="1" Color="#cc9900" /> </RadialGradientBrush> </Setter.Value> </Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="RoundedGelButton" BasedOn="{StaticResource GelButton}" TargetType="Button"> <Setter Property="Width" Value="100" /> <Setter Property="Height" Value="100" /> <Setter Property="Grid.Row" Value="2" />

61

<Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid> <Ellipse Name="GelBackground" StrokeThickness="0.5" Fill="Black"> <Ellipse.Stroke> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#ff7e7e7e" /> <GradientStop Offset="1" Color="Black" /> </LinearGradientBrush> </Ellipse.Stroke> </Ellipse> <Ellipse Margin="15,5,15,50"> <Ellipse.Fill> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#aaffffff" /> <GradientStop Offset="1" Color="Transparent" /> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> <ContentPresenter Name="GelButtonContent" VerticalAlignment="Center" HorizontalAlignment="Center" Content="{TemplateBinding Content}" /> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Rectangle.Fill" TargetName="GelBackground"> <Setter.Value> <RadialGradientBrush> <GradientStop Offset="0" Color="Lime" /> <GradientStop Offset="1" Color="DarkGreen" /> </RadialGradientBrush> </Setter.Value> </Setter> <Setter Property="Foreground" Value="Black" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Rectangle.Fill" TargetName="GelBackground"> <Setter.Value> <RadialGradientBrush> <GradientStop Offset="0" Color="#ffcc34" /> <GradientStop Offset="1" Color="#cc9900" />

62

</RadialGradientBrush> </Setter.Value> </Setter> <Setter Property="Foreground" Value="Black" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> </Grid.ColumnDefinitions> <Button Name="ButtonOfficeStyle" Height="20" Width="20" Style="{StaticResource RoundedGelButton}" HorizontalAlignment="Left" Content="D" Margin="3,3,0,3" Grid.Row="0" Grid.Column="0"> </Button> <DockPanel Height="Auto" Width="Auto" Grid.Row="0" Grid.Column="1"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"></ColumnDefinition> <ColumnDefinition Width="Auto"></ColumnDefinition> <ColumnDefinition Width="Auto"></ColumnDefinition> </Grid.ColumnDefinitions> <Button Name="ButtonMinimize" Grid.Column="0" Height="20" Width="Auto" Style="{StaticResource GelButton}" VerticalAlignment="Top" HorizontalAlignment="Right" Content=" Min " Click="ButtonMinimize_Click"> </Button> <Button Name="ButtonMaximize" Grid.Column="1" Height="20"

63

Width="Auto" Style="{StaticResource GelButton}" VerticalAlignment="Top" HorizontalAlignment="Center" Content=" Max " Click="ButtonMaximize_Click"> </Button> <Button Name="ButtonCloseApplication" Grid.Column="2" Height="20" Width="Auto" Style="{StaticResource GelButton}" VerticalAlignment="Top" HorizontalAlignment="Center" Content=" Close " Click="ButtonCloseApplication_Click"> </Button> </Grid> </DockPanel> <DockPanel Height="Auto" Width="Auto" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"> <DockPanel.Background> <LinearGradientBrush StartPoint="0 0.4 " EndPoint="1 0.6"> <GradientStop Offset="0" Color="DarkGray" /> <GradientStop Offset="0.5" Color="White" /> <GradientStop Offset="1" Color="DarkGray" /> </LinearGradientBrush> </DockPanel.Background> <Viewbox Margin="5" Name="aaaa"> <Grid Width="Auto" Height="Auto"> <Grid.RowDefinitions> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> </Grid.ColumnDefinitions> <controls:Book x:Name="myBook" Grid.Column="1" Grid.ColumnSpan="2" Margin="15"> <controls:Book.ItemTemplate> <DataTemplate> <Border BorderThickness="4" BorderBrush="Gray"

64

Background="#FFE5E1EB"> <ContentControl Content="{Binding .}" /> </Border> </DataTemplate> </controls:Book.ItemTemplate> <local:FrontPage></local:FrontPage> <local:BlankPage></local:BlankPage> <local:BlankPage></local:BlankPage> <local:Cuprins1></local:Cuprins1> <local:Cuprins2></local:Cuprins2> <local:Page1></local:Page1> <local:Page2></local:Page2> <local:Page3></local:Page3> <local:Page4></local:Page4> <local:Page5></local:Page5> <local:Page6></local:Page6> <local:Page425></local:Page425> <local:Page426></local:Page426> <local:Page427></local:Page427> <local:Page428></local:Page428> <local:Page429></local:Page429> <local:Page430></local:Page430> <local:Page431></local:Page431> <local:BackPage></local:BackPage> </controls:Book> <Button x:Name="EmptyButtonAutoPrevious" Grid.Column="1" Content="&lt;" HorizontalAlignment="Left" VerticalAlignment="Center" VerticalContentAlignment="Center" Background="LightGray" Opacity="0.5" Height="50" Click="ButtonAutoPrevious_Click" /> <Button x:Name="EmptyButtonAutoNext" Grid.Column="2" Content="&gt;" HorizontalAlignment="Right" VerticalAlignment="Center" VerticalContentAlignment="Center" Background="LightGray" Opacity="0.5" Height="50" Click="ButtonAutoNext_Click" /> </Grid> </Viewbox> </DockPanel> </Grid> </Window>

65

S-ar putea să vă placă și