Windows Application Development

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 33

2.

Kreiranje izgleda strane


to je layout? to su to kontenjeri te koji su njihovi layouti? Kako modificirati veliine delija grida? to je canvas Layout set pravila po kojima de kontrole biti rasporeene unutar kontenjera. Panel je osnovna klasa iz koje se nasljeuje dodatnih 6: Canvas DockPanel Grid StackPanel VirtualizingStackPanel Warp Panel Boundig Box prostor koji je zauzet od sadraja neke kontrole. Mogude ga je dodatno kontrolirati uz pomod padding i margin svojstava Grid je kontejner koji sadri tabelarnu strukturu i omogudava smjetanje sadraja u svaku od svoji delija. Rowdefinition i ColumnDefinition odreuje koliko kolona i redova de imati jedan odreeni grid. Ukoliko elimo da se irina i duina automatski prilagoava potrebno je upisati auto Ako atributi Width i Height imaju i oznaku * onda de se svi redovi koji imaju tu oznaku formirati proporcionalno jedan u odnosu na drugi. Canvas - ima jednostavni layout. Omogudava jednostavno pozicioniranje kontrola u odnosu na kontejner

<Canvas> <Button Canvas.Left="100" Canvas.Top="100" Content="Button" Height="23" Name="button1" Width="75" /> </Canvas>
Slika 1: Canvas

Dock Panel omoguduje da se odreen kontrola nalijepi za neku od ivica kontejnera. <DockPanel> <Button DockPanel.Dock="Top" Content="Button1" Name="button1" /> <Button DockPanel.Dock="Bottom" Content="Button3" Name="button3" /> <Button DockPanel.Dock="Left" Content="Button2" Name="button2" /> <Button DockPanel.Dock="Right" Content="Button4" Name="button4" /> <Button Content="Button5" Name="button5" /> </DockPanel>

Slika 2: Dock Panel

LastChildFill svojstvo koje nam pomae da zadnja kontrola zauzme cijeli preostali dio (button 5 slika 2). Vrijednosti su True (zauzima cijeli preostali prostor) i False (ne zauzima cijeli preostali prostor). Stack Panel reda kolone jednu za drugom prema odreenoj ili dodijeljenoj orijentaciji. Dostupne orijentacije su horizontalna i vertikalna , od kojih je vertikalna podrazumjevana-. <StackPanel> <Button Content="Button1" Name="button1" /> <Button Content="Button2" Name="button2" />
Slika 3: Stack panel

<Button Content="Button3" Name="button3" /> </StackPanel>

<StackPanel Orientation="Vertical">

Slika 4: Stack panel

WarpPanel Ovaj kontejner reda kontrole s lijeva na desno odozgor prema. Default horizontalna orijentacija, ali mogude ju je prikazati i vertikalno.

Slika 5: Warp Panel

Virtualizing Panel apstraktna klasa za kreiranje virtualne liste kontrola.

3. Kreiranje content kontrole


Na primjeru objasni to je to content kontrola? Sadraj je reprezentiran kroz Content. <Button Content=Click me Height=23 Name=button1 Width=75 /> Button je najede koriteni content kontrola. Moemo ju modificirati putem koda, XMAL ili properties panela. Ako bi ju modificirali programabilno vano je da ona mora imati name svojstvo postavljeno u XAML kodu. Content moe u sebi nosi samo jedan podatak. Ako elimo da Contetn svojstvo sadri neki kompleksniji sadraj moramo samo paziti da njeno Content svojstvo sadri samo jedan objekat. Contetn demo postaviti ako objekt kontejner, a zatim u njega smjestiti koliko god objekata elimo. Neke kontrole nemaju svrhu da nose neki sadraj i da ga dopune svojim osobinama. Najede koritena kontrola toga tipa je Border. Karakteristika ovakvih kontrolla je da umjesto naslijede ContentControl klasu zapravo nasljeuje Decorator. Header Content pored Content posjeduje i svojstvo Header.

Header svojstvo HeaderContetnControl klase ima iste osobine kao i Content svojstvo, pa je mogude smjestiti kompleksan objekt.

4. Rukovanje item kontrolama


Za razliku od Contetn kotrola, Item moe sauvati kolekciju podataka. List Box, Menu, Status bar nasljeuju klasu Items Control Kolekcija lanova ItemsControl nalazi se u svojstvu Items. Dodavanje lanova moe se vriti sekvencijalno ili putem ItemsSource svojstva List Box kontrola prikazana je u XAML-u tagom ListBox, a njeni lanovi ListBoxItem Item kolekcija ListBox kontrole sastoji se od ListBoxItem objekata. Svaki ListBoxItem je Contetn kontrola ListBox kontrola ostvaruje se atributom SelectionMode te on ima tri vrijednosti: Extended, Multiple i Single SelectionChanged dobiva informacije od o tome koji je lan odabran te imamo selectedIndex, selecteItem, selectedValue. Pridruivanje rukovaocem SelectionChanged dogaajem radimo sa istoimenim atributom. Lista svojstava za selekciju: SelectionMode (jedna ili vie stavki oznaena) SeletedItem(jedna stavka oznaena) SelectedItems(vie stavaka oznaeno) SelectedValue(preuzima vrijednost stavke) SelectedValuePath(ukazuje na svojstvo objekta koje ce biti tretirano kao vrijednost) ComboBox kontrola Kreiranje liste podataka kroz padajudi menu. Za kreiranje ComboBox koristi se ComboBox XAML tag, a za kreiranje stavki ComboBoxItem Punjenje item kontrole mogude je programabilno koritenjem kolekcije Items i metode Add. Lista gradova se moe pridodati kroz ItemSource

5. Dijeljenje logikih resursa unutar aplikacije


Aplikacije koje sadre slike, zvukove a ne spadaju u samu strukturu aplikacije to su resursi. Resursi se mogu definirati na razliitim nivoima, a dostupni nivoi su aplikacije, prozor ili strana i element. Napravimo Resources podelement elemenata i u njega smjestimo resurs.

Da bi navedeni resurs bio validan potrebno je da posjeduje x:Key. Vrijednost ovog atributa te identificirati u resurs ResourcesDictionary. U primjeru ispod smo implementirali kreirani resurs. Resurs smo implementirali u svojstvo Fill.

U atribut Fill postavili smo vitiaste zagrade, zatim StaticResource i klju resursa. Odjeljak u vitiastim zagradama se naziva Markup exstension. Resurse je mogude dodavati programabilno, ali je tada obavezno instancirati ResourcesDictionary kolekciju i dodati joj klasu. Statiki resurs oni se definiraju se tijekom kreiranja aplikacije i kada doe do startanje aplikacije vrijednosti postojedih kljueva ResourceDictionary objekta bivaju proitani. Ovo je dobro ako ne elimo mijenjati resurse tijekom izvravanja aplikacije. Dinamike resurse naknadno uitavamo, a i moemo ih mijenjati tijekom pokretanja aplikacije, a statike odmah po pokretanju i nema mijenjanja tokom aplikacije. Referencijranje resursa moe biti programabilno ili putem XAML koda. Ako to radimo putem XMAL koda obavezno je navesti o kojem tipu resursa je rije. Dinamiki:

Statiki:

FindeResource i TryFindeResource oba trae metode kroz kompletan opseg aplikacije. Ukoliko resurs ne postoji FindeResource izbacuje izuzetak, dok TryFindeResource vrada null vrijednost.

Metod SetResourceReference ovaj metoda prihvada dva parametra: svojstvo nad kojim se primjenjuj i klju resursa. Primjenjiv samo na dependency.

Direktan pristup Resources kolekciji

Upotreba eksternih Resource Dictionary. Jedan set resursa je mogude dijeliti na razini aplikacije, a mogude je da vie aplikacija dijeli jedan resurs. Resurs je mogude kreirati i runo putem GUI-ja.

6. Kreiranje korisnikog interfejsa korienje stilova


U cilju stilske konzistetnosti potrebno izabrati jedan model i upotrebljavati ga. Stilizacija spomenutog tipa je moguda u WPF-u i osvaruje se kroz resurse i style atribut elemenata. Kao i u sluaju resursa mogude je centralizirati stilovi, a zatim ih koristiti iz razliitih dijelova aplikacije. Za kreiranje centraliziranog stila koristimo Style tag i smjetamo ga u resurse. Svaki stilski tag sastoji se od kolekcije Setter elemenataa, svaki setter sadri dva atributa: Property predstavlja atribut kontrole na koji de stil biti primjenjen Value sadri vrijednost koja de biti pridruena atributu

Ako elimo primijeniti stil samo na neke atribute, ali ne na sve onda demo dodati x:key i dati mu vrijednost, a ta vrijednost de predastavljati njegovo ime.

U resurse je mogude staviti beskonano mnogo tipova, ali svaki mora da bude jedinstveno identificiran kljuem ili TargetType atributom. Da bi jedan stil naslijedio neki drugi potrebno je da mu dodamo atribut BasedOn i za vrijednost tog atributa postavimo referencu na postojedi stil. Kreirani stilovi mogu biti specijalizirani i apstraktni. Apstraktne je najbolje drati na to viem nivou hijerarhije kako bi to vedi broj kontrola mogao da im pristupi. Najbolje ga uvati u zasebnom dokumentu ili ak zasebnom projektu. Grupa stilova koja postoji na ovaj nain naziva se jo i Tema. Kod programabilnog unoenja svojstava string moramo eksplicitno navesti svojstva (kao npr. Brushes.Red, Colors.Red)

Stilovi. Njih je mogude prikazati progamabilno i putem XAML koda.

7. Izmjena izgleda kontrola korienjem ablona


Templejt omogudava korisniko definiranje/modificiranje izgleda kontrola upotrebom klase ControlTemplate. Da bismo kreirali templejt za odreeni tip kontrole, potrebno je da kreiramo poseban stil u rjeniku resursa. Ova stil mora da ima setter svojstvo Template u iju vrijednost smjetamo stilizaciju kontrola. U dio u kojem elimo da se pojavi sadraj kontrole dodajemo tag ControlPresenter. Kada bismo eljeli da stil pridruimo odreenoj kontroli, a ne svim onda ControlTemplate tag bude postavljen kao zaesbni tag u resource dictionaryju i da mu dodijelimo atribut x:Key. Ukoliko elimo za List napraviti ablon onda kreiramo kontenjer i oznaimo ga IsItemsHost. Drugi nain da postavimo ablon za Item kontrolu heste da modificiramo ItemsPanelTemplate. XAML koji preprezentira samu listu stavki naziva se ItemsPresneter. Tamo gdje stavimo ovaj element nadi de se lista svih stavki kontrole. Mora se nalaziti unutar ControlTemplate. Sistemski okida (triggers) i moemo ih takoer obraditi kroz stilove / ablone. WPF razlikuje tri vrste okidaa: Okida svojstva (Property Triggers) Okida dogaajima (Event Triggers) Okida nad povezanim podacima (Dana Triggers)

Da bismo kreirali stilski interaktivnost nad kontrolom potrebno je da koristimo okida svojstva. Unutar elemenata Style nalazi se Style.Triggers. Okida dogaaja omoguava da izazovemo modifikaciju kontrole u trenutku kada doe do nekog RoutedEvent dogaaja. Kada hodemo da aktiviramo okida u trenutku izazivanja nekog RoutedEvent dogaaja trebalo bi da u triggers element dodamo element EventTrigger. Actions atribut EventTrigger elementa predstavlja akcije ili akciju koju elimo da pridruimo dogaaju.

8. Dogaaji
Ako elimo ukratko da objasnimo rukovanje dogaajima u WPF-u moemo redi da je svaka kontrola u stanju da emitira jedan ili vie dogaaja. Mogude je koristiti jednog rukovaoca dogaajima za vie dogaaja, ali postavljanje vie istoimenih dogaaja u jednu kontrolu proizvodi neispravan tag i dovodi do greke: Dozvoljeno i ispravno:

Neispravno:

Rukovaoc dogaajem mogude je dodati i programabilno na sljededi nain:

Routed events. Primjedujemo da svi dogaaji kojima smo do sada rukovali u WPF-u imaju prefiks Routed. Kada kreiramo prezentacioni dio nekog WPF prozora sve kontrole koje se na njemu nalaze, smjetene su u strukturu tipa stablo (logiko stablo) Routed dogaaji se prosljeuju od elemenata najvieg nivoa sve do onog na najniem (koreonog). Ovakvo ponaanje naziva se Bubbling (jer dogaaj ispliva na povrinu) Pored Bubbling postoje jo dva naina ispaljivanja dogaaja: Direct I Tunneling. Direct podrazumijeva da dogaaj nede biti proslijeen sljededoj kontroli unutar logikog stabla dok Tunneling oznaava da de dogaaj biti proslijeen u drugom smjeru od koreonog elementa, ka aktualnom. Ovi naini ponaanja nazivaju se jo i strategija rutiranja (Routing Strategies) . ApplicationCommands je set ugraenih komandi koji sadre komandu Copy (kao i Cut i Paste). Pored njega WPF sadri jo etiri ugraena seta komandi: NavigationCommands MediaCommands EditingCommands ComponentCommands

NavigationCommands je set komandi koji se koristi ukoliko je wpf aplikacija web aplikacija i sadri naredbe za navigaciju (next page, stop, BrowseHome) MediaCommands sadri naredbe za rukovanje multimedijalnim sadrajima (Play, Stop). Editing Commands sadri naredbe za manipulaciju sadrajem kontrola (Align, ToggleBold) i ComponentCommands sadri naredbe za rukovanje samim kontrolama. Takoer postoji etiri pojma koja moramo upoznati prilikom rukovanja komandama. To su Comand, Command source, Command target i Command binding. Command predstavlja samu komandu. Jedna komanda je, zapravo, klasa koja je u stanju da obavjetava sistem o tome da li je dostupna ili ne, kao i da radi odgovarajudu radnju. Da bi se ovako neto ostvarilo u pozadini stoje metode dogaaji CanExecute i Executed. Command source je kontrola koja pokrede izvravanje komande, a Command target je kontrola na koju pokretanje komande ima utjecaj. Kreiranje korisniki definiranih komandi. Da bi jedna klasa bila tretirana kao komanda mora da implementria ICommand interfej ili da nasljedi RoutedCommand ili RoutedUICommand klasu.

9. WPF strategije testiranja


Tipovi testiranja Unit testovi najpopularniji test funkcionira na nain da izoliramo dio koda i testiramo da li se ponaa onako kako smo to eljeli. Integracioni testovi provjerava da li komponente meusobno surauju i ponaaju se onako kako je planirano. Regresioni testovi implementiramo novi kod u postojedi i testiramo regresionim testovima aplikaciju.

Unit Testing Framework predstavlja okruenje koje koristimo za testiranje poslovne logike i ponaanja. Ovo okruenje omogudava unit testove u Visual Studiju 2010. Kod koritenja unit testova bitno je znati to prosljeujemo metodi i to oekujemo da metoda vrati. Testiranja koritenjem Unit testova: Unit testovi osnovni testovi za vjebanje metoda jedne klase u okviru aplikacije Coded UI testovi njih koristimo da provjerimo funkcionalnost korisnikog interfejsa nae Windows aplikacije Database Unit testovi testiramo skladine procedure, funkcije ili trigere u naoj bazi.

INSTALACIJA instaliramo Extension Manager do kojeg dolazimo sljededom putanjom: Tool > Extension Manager. Tamo se nalazi pokaziva u koji jednostavno ukucamo NUnit.(NUnit je program za testiranje koji bi trebali instalirati u sluaju da nemamo Proffesional i Ultiamate inaice Visual Studija 2010. Tvrdnje (assertions) metode koje nam govore da li se metoda izvrava korektno ili ne.

Expected predstavlja oekivanu vrijednost Actual je vrijednost koje je zapravo u kodu Message predstavlja poruku koja de se ispisati ukoliko ova dva nisu jednaka.

Neke metode koje slue za testiranje: AreEqual, IsEqual, AreSame, IsTrue, Fail. Svaka klasa koja sadri test mora biti predvoena atributom *TestFixture+. Ona mora imati pristupni modifikator public i podrazumijevani konstruktor bez parametra. UI Automation Framework slui za interaktivno testiranje komponenti korisnikog interfejsa. Simulira koritenje ulaznih ureaja (mi, tipkovnice). Vrlo je ne efinaksan nain kada mi sami testiramo neku aplikaciju. Zato se ovdje pojavljuju UI Automation. Automation Peer predstavlja automtiziranu reprezentaciju neke kontrole korisnikog interfejsa. Svaka WPF kontrola ima po odgovarajudoj AutomationPeer klasu i predstavlja se tako to se ipred automation peer stavi ime te kontrole. (pr.ToolBox >> ToolBoxAutomationPeer). Sve ove klase implementiraju grupu istih metoda (GetChildren, GetPrent, GetPattern, GetName). GetPattern metoda slui da povratite podrazumijevanu implementaciju interfejsa svakog ablona implementirno odgovarjudim automation peer-om. ExpandeCollapse ovaj ablon koristimo za kontrole koje moemo proiriti i skupiti, kao to je kontrola za meni. Invoke ovaj pablon koristimo za kontrole koje moemo da pozovemo npr. nekim dogaajem. Takva kontrola je pr. Button Toggle ovaj ablon koristimo za kontrole kojima moemo mijenjati stanja.

UI Automation se sastoji od dva dijela: provajdera i klijenta. Provajderi implementiraju kontrolne paterne koji podravaju metode, svojstva i dogaaje kako bi kreirali odreenu funkcionalnost koju de imati kontrola.

10. Debagovanje XAML-a


Debagovati moemo sa alatom Tree Visualizer (debagira probleme sa rederovanjem ali i dana bidings dogaaja) Brakepoint su toke prekida koje omoguduju da se naa aplikcaij zaustavi na odreenoj poziciji. Tree Visualizer moemo koristiti za istraivanje WPF objekata i promatranja zavisnosti objekata. Visual Studio 2010 moe koristiti informacije o debagovanju neke aplikacije korak po korak da bi WPF tracing bio mogud moramo ga pre svega omoguditi na sljededi nain Tools > Options > Debugging > Output window. Postoji nekoliko naina pradenja: All, Critical, Error, Warnin, Informactio, Activity, Tracing. Da bismo obradili neobraene izuzetka, moramo kreirati event handler za koji elimo da se izvri svaki puta kada god imamo neki izuzetak koji nije rukovan od strane naeg koda.

Za WPF koristiti demo Application-DispatcherUnhandledExpection event handler (aktivira se automatski svaku puta kada se aplikaciju srui, a nakon to je generiran neobraeni izuzetak). Ovom event handleru posljeen je argument EventArgs koji sadri informacije o tom izuzetku: Excpection ovo je stvarni izuzetak generiran od strane aplikacije Dispatcher on pokazuje na UI nit Handled obrauje da li ej blok ved rijeio izuzetak. e.Handled ima podrazumijevanu vrijednost false, to znai da aplikacija i dalje ima neobraen izuzetak

Da bismo omogudili DispatcherUnhandledxceptionEventArgs moramo ukljuiti prostor System.Windows.Threading.

11. Sigurnosne opcije WPF-a


CLR i .NET Framework nude razliite klase i servise koji omogudavaju razvijaocima da na jednostavan nain napiu sigurnu aplikaciju, kao to su: Security Restriction Policy (SRP) CAS Parcijalno i full povjerenje (Partial and Full trust) UAC

Priliko razvijanja Windows klijent aplikacije ede de se koristiti parcijalno povjerenje i UAC nego SRP i CAS. Code Access Security CAS Klijentovo raunalo daje aplikacije razliitih resursa na raposlaganje: File System, Registry, Printing Service. Kako se ovo ne bi zlorabilo uvodi se NET Framework sigurnosni mehanizam CAS. Prije nego aplikacija pristupi raunalu mora imati CAS dozvolu. Ova dozvola se nalazi u okviru klase CodeAccessPermission. CAS provjerava s koje je zone aplikacija pokrenuta i koje dozvole moe imati s obzirom na zonu: MyComputer LocalInternet Internet Truseted Sites Untrusted Sites

Dozvole koje se mogu omoguditi ovim zonama FullTrust pokrenute iz zone MyComputer i ima sve mogude privilegije LocalInternet ima pristup resursima, ali ne kljunom resursu Registry Internet Set dozvola ogranien pristup resursima klijentske maine.

User Access Control

UAC nam pomae da sprijeimo maliciozni softver ili spyware da napravi neke promjene bez dozvole u naoj apliaciji. UAC to omogudava ubacivanjem dijaloga u kojem se trai dozvola ili administratorske ifra prije pokretanja aplikacije. Najsigurniji nain jeste da se oni daje najmanje privilegije, i za FullTrust potrebno je potvrditi. U stanju najmanje privilegije administratori se zove Protected (zatieni administratori), a u njihovom nadograenom stanju zovu se Elevated. UAC omogudava dvije vrste privilegija (korisnikih interfejsa): Consent UI (mogu pokrenuti aplikaciju sa najmanjom koliinom privilegija, ali se mogu sami nadograditi da rade administratorske zadatke) Credential UI (korisnici ne mogu sami da povedaju privilegije ved morajut to traiti od administratora)

3 vrste dizajna ablona: Strukturni ablon abloni ponaanja Gradivni abloni

12. Povezivanje
WPF povezivanje vie kontrola na jedan izvor podataka naziva se Dana Biding. Prilikom povezivanja kontrola povezuju se njihova svojstva. U procesu povezivanja etiri komponente imaju svoju ulogu: izvorni objekt, ciljani objekt, svojstvo ciljanog objekta, svojstvo izvornog objekta. Svako svojstvo kojim se izvrava povezivanje mora biti dependecy. Postoje 4 tipa povezivanja: Jednosmjerno (OneWay) Dvosmjerno (TwoWay) Jednosmjerno ka izvoru (OneWayToSource) Pojedinano (OneTime)

Jednosmjerno znai da de sve izmjene na izvornom objektu biti prikazane (reflektirane) na ciljnom objektu.

Dvosmjerno izmjene de biti vidljive u bilo kojoj kontroli i reflektirati se na drugu.

Jednosmjerno ka izvoru (oneWayToSource) mislimo na proces koji je obrnut od jednosmjernog, sve izmjene napravljene na ciljanoj biti de reflektirane na zvornu. OneTime dogaa se samo jednom, prilikom inicijalizacije izvorne kontrole. Povezivanje se mogu izvriti na vie naina: programabilno, putem XAML-a i putem GUI-ja. Ako povezujemo putem XAML-a u Markup extensionu za svojstvo trebalo bi da navedemo izvorni objekt kao i svojstvo s kojim se povezujemo.

U kontroli textBox2 Markup extension sadri dva kljuna elementa za Binding Element name je naziv ijeg se svojstvo preuzima Path naziv preuzetog svojstva

Da bismo instancirali klasu u XAML-u trebalo bi da prvo navedemo prostor imena u kojem se klasa nalazi (ak iako je dio istog prostora imena unutar koga se nalazi sam XAML dokument) Da bismo uveli prostor imena Window elementu trebalo bi da unutar Window.Resources elementa izvrimo instancijranje klase.

Naziv klase MyClass kao Key atribut navodi se instanca myUser a zatim se kao ostali atributi navodr svojstva klase FirstName, LastName Poto je klasa instancirana kao resurs, izvor takoer moemo nadi u resursia (StatiResource myUser). Kao Path navodimo svojstva klase koje elimo da poveemo

WPF ima mogudnost auriranja na 4 ratiita naina: Default, Explicit, LostFocus, PropertyChanged. Default je podrazumijevano auriranje za odreeno svojstvo (nemaju sva svojstva kontrola isti sistem auriranja)

Explicit znai da promjene nede biti aurirane, sve dok runo ne aktiviramo UpdateSource metod. LostFocus se dogaa kada kontrola izgubi fokus, a PropertyChanged kada doe do izmjene povezanog svojstva. PropertyChanged obino najbre dovodi do auriranja povezan kontrole.

13. Povezivanje podataka


Upitni jezik koji se koristi prilikom povezivanja XML dokumenta naziva se x. Da bi se XML pridruili XAML elementu moramo upotrijebiti klasu XmlDataProvider Podaci se pridruuju XAML elementu svojstvom DataContext.

14. Konverzija podataka i povezivanja svojstava


Auriranje povezanih svojstava moe se dogoditi u nekom specifinom trenutku: kada kontrola izgubi fokus, kada doe do promjene svojstva ili kada se eksplicitno naglasio da hodemo pokrenuti auriranje. Ove tri vrijednosti su dio Biding objekta i definirane svojstvom UpdateSourceTrigger. Dozvoljene vrijednosti su: LostFocus, PropertyChanged i Explicit. Kada je svojstvo UpdateSourceTrigger postavljeno na LostFocus sadraj de bit auriran nakon to povezana kontrola izgubi fouks. PropertyChanged aurira povezane kontrole u trenutku kada doe do izmjene povezanog svojstva. To znai da ukoliko je povezano svojstvo Text, TextBox kontrole, svaka izmjena u tom tekstu rezultirati de auriranjem povezanih kontrola. Explicit zahtjeva da unutar pozadinskog koda izvrimo auriranje povezanih kontrola runo uz pomodu UpdateSource metode. Konverzija podataka. Prilikom povezivanja moemo povezati bilo koje svojstvo sa bilo kojim drugim svojstvom, nema ogranienja. U najvedem broju sluajeva WPF podrazumijeva konverziju (default conversion) izmeu stringa kojim je tip reprezentiran u XAML kodu i izvornog tipa. Povezivanje vie svojstava u jedno naziva se multibinding. Ako hodemo da neka kontrola prilikom preuzimanja podataka koristi neku konverziju trebalo bi da Coverter svojstva povezivanja pridruujemo odgovarajudi konverter. Konverter klasa moe biti bilo koja klasa, sve dok implementira interfejs IValueConverter. Ovaj interfejs sadri dva metoda koje je neophodno implementirati: Convert i ConvertBack.

Kreiranje multibinding povezivanja. XAML omogudava da poveemo vie kontrola u jednu i ova opcija se naziva multibinding. Za ovo nam je takoer potrebna klasa za konverziju, ali ovoga puta ta kasa de implementirati IMultiValueConverter interfejs. Razlika je u ulaznom tipu kod IMultiValueConverter je niz objekata, a ne samo jedan objekat. MultiBiding sadri Biding elemente i svaki od njih ukazuje na jednu kontrolu i njeno svojstvo, putem atributa ElementName i Path.

15. Validacija podataka


Isravnost podataka je jako vana prilikom povezivanja podataka. Da bi se omogudila validacija obavezno je koristiti validaciona pravila. Validaciona pravila su klase koje nasljuju klasu Validation.Rules. Kada napravimo validacionu klasu pridruujemo joj Bindingu na kojem elimo da bude prijenjena kroz Binding.ValidationRules kolekciju. ValidationRule je apstraktna klas koja, prilikom nasljeivanja, zahtjeva implemenataiju Validate metode. Za vradanje pozitivnog rezultata, dovoljno je da prosljedimo ValidationResult.ValidResult enumeraciju, dok je za negativan rezultat neophodno kreirati novi objekt klase ValidationResult. Ukoliko neki od lanova ValiationRules kolekcije vrati rezultat kao greku, onda se dodaju u Validation.Errors kolekciju. Kada elimo da se greka validacije prikae drugaije od podrazumijevanog naina trebalo bi da se modificira njezni Validation.Error.Template svojstvo kontrole na kojoj se validacija izvrava. Kada doe do validacije greaka ona biva smjetena u kolekciju validacionih greaka za kontrolu (ValidationErrors). Ako hodemo da identificiramo poruku izazvane greke trebalo bi da pronemo greku u ovoj kolekciji i zatim prikaemo njezn ErrorContent svojstvo.

Da bi nad jednom klasom mogla da bude izvrena validacija, neophodno je da ona implementira interfejs IdataErrorInfo. Implementacijom ovog interfejsa klasa implementira string svojstvo Error i string indekser.

16. Povezivanje kolekcija sa items kontrolama


Prilikom povezivanja items kontrola ne povezujemo samo jednu vrijednost kao to smo to radili s content kontrolama ved vie vrijednosti, tonije kolekcije. Podatak prije svega mora biti kolekcija odnosno mora posjedovati IEnumerable interfejs. Ovo je ved dovoljan preduslov da podatak bude jednomjerno povezan na kontrolu, odnosno, da kontrola bude ispunjena iz kolekcije. Neophodno je implementirati INotifyCollectionChanged. Predefiniran klasa koja implementira ovaj interfejs je ObservableCollection. Pridruivanje izvora moe se napraviti programabilno ili putem XAML-a. Ukoliko poelimo da imamo dvije kontrole: ComboBox i ListBox i elimo da oba dvije prikazuju iste podatke obavezno je implementirati ObservableCollection<string>. Povezivanje putem DataContext svojstva. Ovo svojstvo nam omogudava da svu djecu poveemo na jedan izvor podataka. Da bi odabrane kontrole utjecale na izvor potrebno je da kontrola mora sadravati atribut IsSynchronizedWithCurrentItem sa vrijednodu koja je postavljena na true. Povezivanje sa LINQ. WPF omogudava povezivanje sa LINQ-om. Uz pomod LINQ-a filtriraju se podaci iz niza, a zatim se prikazuju unutar ComboBox i ListBox. Pogled kolekcija definira se kroz klasu CollectionView. Da bi programabilno kreirali pogleda, trebalo bi da instanciramo CollectionView klasu i proslijedimo joj izvor podataka kao konsruktorski parametar. Ako je izvor podataka List tipa, trebalo bi da umjesto klase CollectionView upotrebimo klasu ListCollectionView. Pogled kolekcija mogude je implementirati putem XAML-a kroz CollectionViewSource element. Ovaj element, sa jedne strane, povezujemo sa izvorom podataka, a zatim ga pridruujem ItemsSource svojstvu kontrole. Filtracija pogleda kolekcije. Prilikom prolaska podataka kroz pogled, mogude je svakom od njih individualno pristupiti i odluiti da li de on biti emitiran u kontroli ili ne. Prilikom prelaska kroz kolekciju tokom pristupa svakom njezinom lanu, aktivira se dogaaj Filter CollectionViewSource klase. Ovaj dogaaj izlae aktuelnu stavku kolekcija i svojstva Accepted. Na osnovu izloene stavke (Item svojstva FilterEventArgs klase). Unutar rukovaoca dogaajem izloena su Accepted i Item svojstva. Item svojstva sadri aktualni objekat a Accepted boolean koji oznaava da li de stavka biti prikazana ili ne. Ako napiemo Accepted = true stavka de biti prikazana. Ako napiemo Accepted = false, nede. Ako ne napiemo nita stavka nede biti prikazana.

Grupiranje podataka. Pored sortitranja i filtriranja mogude je takoer i grupirati podatke u pogledu upotrebom klase PropertyGroupDescription.

20. Implementacija User Assistance


Korisnika podrka podrazumijeva bilo koji element korisnikog interfejsa, koji je implementiran kako bi se korisniku pruio pomod i time omogudio bolje snalaenje u aplikaciji. Context Sensitive Help predstavlja informaciju o trenutnom stanju koju aplikacija omoguduje korisnicima, za rjeavanje problema sa kojim se korisnik suoava. WPF ne omoguduje ni jednu klasu za implementaciju Context-Sensitive pomodi i da bismo implementirali pomod u okviru WPF aplikacije korstidemo prostor imena namjenjen System.Windows.Forms.Help. Mogude je omoguditi dva tipa help fajlova: .chm (Command help files) i HTML (hyper text markup langage). Help klasu omoguduje Help aplikacija, pozivajudi statiku metodu ShowHelp. Da bismo implementirali Context sensitive, iskoristiti demo komandu klase ApplicationCommand, ApplicationCommand.Help koja je spojena sa F1 tipkom i kada pritisnemo na njega dobijemo Help. Da bismo napravili Context-Sensitive pomod moramo da izvrimo dva glavna zadatka: 1. Neophodno je da dodijelimo naim kontrolama Help temu a) Najprije demo dodijeliti podrazumijevani Help file naoj aplikaciji.

b) Dodajemo CommandBiding kontroli koja rukuje sa Helpom, Help komandi i osigurava Executed dogaaje:

2. Nakon toga je potrebno da konfiguriemo aplikaciju da prikazuje kreirani Help fajl Da bismo prikazali sadraj Help fajla, koristidemo Help.ShowHelp metodu.

Sintaksa Showhelp metode

ToolTip. ToolTip je mali prozor koji iskoi svaki puta kda korisnik pree preko tog elementa za koji je definiran taj ToolTip. Definiramo ToolTip za odgovarajudu kontrol postavljajudi neke od sljededih sadraja ToolTip: FrameworkContetnElement.ToolTip koristi se za kontrole FrameworkContetnElement.

FrameworkElement.ToolTip koristi se za kontrole iz FramworkeElement klase.

Pomodu ToolTip mogude je odrediti razliita svojstva, pa tako primjerice koliko dugo de biti prikazan ToolTip, nakon koliko vremena de se prikazati i sl.

Unutar ToolTip mogu se kako smo rekli definirati i drugi elementi, tako na slijededi nain moemo ubaciti sliku u okviru naeg ToolTipa:

22. Rukovanje slikama


U WPF-u klasa kojom se reprezentira slika je klasa Image. Da bismo jednu sliku uitali u rojekt i prikazali unutar prozora kroz XAML kod potrebno je da upotrijebimo Image element. Svojstvo Source ovog elementa predstavlja putanju do slike. Source moe imati vrijednost apsolutne putanje do slike (slika moe biti bilo gdje na lokalnom disku ili mrei) ili relativne putanje. Ukoliko elimo koristiti relativnu putanju onda je najbolje da sliku kopiramo negdje unutar foldera aplikacije, pa je tada najbolje koristiti choose image koja se nalazi unutar Propertis panela Image objekat.

Pored Image, postoje jo dvije klase sa slinim karakteristikama : ImageBrush i ImageDrawing i obje se obino ne koriste kao samostalni objekti, ved vie kao podrka postojedim objektima. ImageBrush smo u prethodnoj lekciji ved imali prilike da koristimo kao Fill svojstvo objekta. Enkoding i dekoding slika. WPF ne moe enkodirati i dekodirati ico format. Da bismo izvrili dekodiranje potrebno je da instanciramo odgovarajudi dekoder za format koji dekodiramo. Kreiranu istancu zati moemo da pridruimo Source svojstvu Image elementa.

Ako hodemo sliku da enkodiramo u neki format, koristimo odgovarajudi enkoder kroz sljededu sintaksu (u primjeru slika iz XAML koda snima se na fajl sistem u png formatu):

Kreiranje korisniki definiranih slika. Slike moemo preuzeti sa fajl sistema ili ih kreirati programabilno. Postoji vie stvari koje treba imati na umu prilikom programabilnog definiranja slike. Visina i irina, Stride(korak) ova informacija predstavlja ukupan broj bajtova koje de zauzeti jedan red slike. Sliku kreiramo na osnovu priloenih informacija metodeom Create, klase BitmapSource.

Kreirani Bitmapsource objekat pridruujemo Source svojstvu Image elementa:

24. Rukovanje dokumentom


WPF omoguduje rukovanje dokumentom te poznaje dva tipa dokumenta: Fixed i Flow dokument. Fixed je uvijek jednak u odnosu na okruenje u kojem se nalazi, za razliku od Flow koji mijenja svoju veliina u odnosu na svoje okruenje. Fixed documents. Pregled Fixed dokumenta realizira se uz pomod DocumentViewer kontrole u WPFu. Ovako kontrola sadri kontrole za oznaavanje stranica, zumiranje i tampanje i koristi se za pregled XPS dokumenata (Xml Paper Specification) dokumenta. Uz pomod DocumentViewer kontrole nije mogude snimati niti modoficirati dokument. Dokument koji demo kreirati unutar DocumentViewer moe se uitati ili kreirati programiranjem. Da bi mogli uitati XPS dokument potrebno je uitati biblioteku ReachFramework. Kada uitamo ReachFramework biblioteku biti de nam omogudeno koritenje prostor imena: System.Windows.Xps.Packaging odnosno klase XpsDocument.

DocumentViewer je XAML kontrola i kao takva ima svojstva kontrole (klasa Control), ali takoer dosta svojstava specifinih za sadraj vlastite kontrole. Npr. Finde stavlja fokus na polje za pretragu dokumenta, FirstPage postavlja dokument na poetnu stranu, a GoToPage otvara stranu dokumenta proslijeenu kao parametar. Flow dokumenti. Flow dokument je dokument iji se sadraj dinamiki modificira prema okruenju u koje je implementiran. Flow dokument je predstavljen klasom FlowDocument a da bi smo ga mogli pregledati koristimo neku od sljedede tri kontrole: FlowDocumentReade, FlowDocumentPageViewer i FlowDocumentScrollViewer. Od tri navedene opcije FlowDocumentReader ima najvie opcija koje moe koristiti. Ova kontrola sadri pejzaing, zoom i pretragu. Najjednostavniji i najbri nain da u FlowDocumentReader smjestimo FlowDocument jeste da u njega direktno unesemo FlowDocument element. FlowDocumentScrollViewer ima sa strane kliza, FowDocumentPageViewer ima mogudnost prikaza stranica i zumiranja. Koritenje Flow Document klase u kombinaciji sa RichTextBox kontrolom. Ako elimo manipulirati sadrajem moemo koristiti RichTextBox kontrolu. Da bismo upotrijebili RichTextBox kao kontenjer za FlowDocument iz primjera jednostavno promijenite tag pod nazivom myRTB u RichTextBox tag. Da bismo uitali tekst u kontrolu koristimo klasu TextRange. Ova klasa sadri Save i Load metodu. Ispisivanje dokumenta. Da bismo ispisali dokument bez kontrole nad samim procesom ispisivanja koristimo klasu PrintDialog. Da bismo ispisali jedan FlowDocument objekt koristimo njegovu DocumnetPaginator.

26. Autoring kontrola


Kada kaemo autoring kontrola zapravo mislimo na kreiranje vlastitih kontrola. Svaka kontrola ima mogudnosti da u sebi nosi bogatu grafiku strukturu jer je Content svojstvo zapravo objekt. Sadraj kontrole moemo mijenjati uz pomod njegovog atributa Style. ablon podataka (DataTemplate) su jedan on naina modificiranja izgleda kontrola. Oni podrazumijevaju da se modifikacija kontrole izvri nad samim njenim podacima i obino se koristi u Items kontrolama prilikom povezivanja. abloni (Templates) su jo jedan korak iznad stilizacije kontrola putem stilova. Ono omoguduju potpunu izmjenu kontrola. U kombinaciji sa Triggers oni ine modnu kombinaciju za potpuno restrukturiranje kontrola. Autoring kontrola. Gore spomenuti i opisani naini omogudavaju izmjenu ablona. U sluaju da je potrebno napraviti kontrolo od poetka onda koristimo tri modela UserControl, Control i FrameworkElement. Najjednostavniji nain da se izvri kreiranje nove kontrole jesu putem UserControl klase. Iako ima velike mogudnosti jednom kada ju kreiramo nije ju vie mogude modificirati uz pomod ablona i ablona podataka (ControlTemplate i DataTemplate). No ako se pojavi takva potreba onda se moramo spustiti jo nie i iskoristiti klasu Control i FrameworkElement. Koritenje UserControl klase

je najjednostavnija varijanta autoringa vlastite kontrole. Neto sloenije je koritenje Control klase. Najnii oblik autoring kontrola podrazumijeva nasljeivanje FrameworkElement klase. Kontrola koja nasljeuje FrameworkElement moemo kreirati na dva naina: Direct rendering i Custom element composition. Direct rendering podrazumijeva prepisivanje metoda dogaaja OnRender. Metoda OnRender biva aktivirana prilikom svakog iscrtavanja kontrole, pa u njega zato smjetamo kompletnu logiku za iscrtavanje. Ovaj metoda kao parametar prosljeuje DrawingContext objekta nad kojim izvravamo iscrtavanje. Svojstva i dogaaji. Dependecy svojstvo. Niti jedna kontrola nije mogude bez njezinih svojstava i dogaaja. Svaka kontrola posjeduje set svojstava i ta svojstva se realiziraju kao Dependecy svojstva. DependecyProperty nije uistinu svojstvo klase ved objekt koji prezentira svojstvo klase u listi svojstva. Dependecy svojstvo za MyProperty.

Dependecy svojstvo je statiki readonly objekt kreiran uz pomod Register metode. Kada hodemo preuzeti vrijednost ili pridruiti vrijednosti iz Dependecy svojstva koristimo metode GetValue i SetValue. Poto je Dependecy svojstvo definirano kao statiko polje, da bi bilo dostupno kroz svojstvo obine klase potrebno je da obino svojstvo bude definirano tako da prilikom poziva samo preusmjeri podatke u dependecy svojstvo ili iz njega. Svojstvo mora imati isti naziv kao i dependecy svojstvo.

Dependecy svojstvo zahtjeva mnogo koda, Visual Studio omogudava da se taj kod automatski generira. Upie se porpd i dva puta se klikne tab. Parametar iz register metode je jednostavan. U primjeru u predavanju moemo izbaciti UIPropertyMetadata. Ali ukoliko elimo da Dependecy svojstvo sadri i dodatne karakteristike kao to je aktivacija dogaaja na izmjenu vrijednosti podrazumijevana vrijednost svojstva aktivacija dogaaja na unos nepravilne vrijednosti i sl. tada je ovaj parametar neophodan. Attached svojstva. Objekti u WPF-u mogu izloiti i omoguditi drugim objektima da dinamiki implementiraju njihova svojstva. Ako se podsjetimo lekcije sa layoutima sjetidemo se da u Gid layoutu koji je sadravao vie kolona ili redova prebacivali kontrolu iz jedne u drugu deliju Grida svojstvom Grid.Row ili programabilno Grid.SetRow. Recimo button nema Grid.Row svojstvo, ali nam je ono dostupno putem RegisterAttached metode. Dogaaji kontrola (RoutedEvents). Dogaaji su pored svojstva jako bitni elementi objekta. Iako se u WPF-u mogu koristiti obini dogaaji, praktirciraju se rutirani dogaaji. Da bismo implementirali

vlastiti dogaaj u kontroli trebalo bi da koristimo RoutedEvent klasu i RegisterRoutedEvent metoda EventManager klase. Ova procedura je vrlo slina Dependency svojstvu. Primjedujemo RoutingStartegy parametar (Routing dogaaj mogu da se izvre u tri oblika Bubble, Tunnel i Direct pri emu Bubble alje dogaaje u roditeljsku kontrolu sve dok jedna od kontrola kao parametar e.Handled ne postavi vrijednost na True ili se jednostavno doe do korijena logikog stabla; Tunnel ista logika, ali u suprotnom smjeru, dok Direct podrazumijeva samo kontrola koja je izazvala dogaaj).

27. Kreiranje i upotreba korisniki definiranih kontrola


Kada niti jedna kontrola ne moe da zadovolji nae zahtjeve tada koristimo kreiranje vlastitih kontrola. To radimo uz pomod UserControl. To je najjednostavniji i najbri nain kreiranja kontrole. Da bismo ju kreirali odemo unutar projekta i odaberemo Add-User Control. Kontrola kreirana na ovaj nain sadravati de XAML kod i pozadinski C# kod. Svojstva i dogaaji korisniki definiranih kontrola. U primjeru iz ove lekcije kreirala se aplikacija koja povedava vrijednost za 1 ili smanjuje, i istovremeno ima odreena ogranienja tj. svoj minimum i maksimum. Problem ove aplikacije to se trenutna vrijednost ne moe povezati sa vrijednodu neke druge kontrole. Implementacija svojstva. Ako napravimo svojstvo unutar kontrola, ono de biti vidljivo izvan kontrole i dostupno kroz Properties panel za primjer koji sam gore ukratko opisao u odjeljku Other postoji Value. Ako odemo do toga vidjeti demo da nismo u mogudnosti to povezati iz razloga jer to nije Dependecy svojstvo. Da bi bilo povezivo potrebno ga je postaviti kao Dependecy svojstvo. Dpendecy svojstvo ima problem to nema ugraenu kontrolu. To demo obaviti uz pomod Callback funkcija i svojstava. Callback de se aktivirati prilikom svake promjene svojstva (PropertyChangedCallback) ili metoda koji de izvriti validaciju/sanaciju vrijednosti unutar kontrole (CoerceValueCallback). Da bismo aktivirali taj dogaaj koji je ugraen u svojstvima trebalo bi da pridruimo ovaj dogaaj metapodacima. Odnosno da aktiviramo prekoraeni Register metoda. Ovaj metoda prihvada pored ostalih podatak i instancu klase FrameworkPropertyMetadata. Pored dogaaja izmjene svojstva ponekad kreiramo Coerce Callback metoda. Ovaj metoda koristimo kada hodemo da kreiramo neko ogranienje za unesenu vrijednost.

28. Hosting Windows Forms kontrola


Iako je WPF tehnologija namijenjena za kreiranje bogatih WPF aplikacija, ona nije kompatibilna sa Windows Form tehnologijom. Imajudi u vidu ovu problematiku kreatori WPF-a su omogudili implementaciju WF (Windows Forms) kontrola u WPF aplikaciju i nazvati tu opciju hostingom Windows Forms kontrola. Kada kaemo hosting Windows Form kontrola zapravo mislimo koritenje neke od njih. Ovo podrazumijeva koritenje kroz XAML ili pozadinski kod. WF nisu dio WPF-a pa nisu prepoznatljive XAML-u. Da bismo uspjeli ugraditi ovakvu kontrolu moramo prvo obavijestiti WPF o tome da demo koristiti WF klase, a zatim i eksplicitno naglasiti da demo izvriti implementaciju kontrole na odreenom mjestu. Prostori imena koji su nam neophodni da bismo koristili WF nalaze se u bibliotekama koje nisu referencirane, te je prvo potrebno referencirati ove biblioteke u projekat.

Ove biblioteke su: System.Windows.Forms.dll i WindowsFormsIntegration.dll. Rukovanje hostovanom WF kontrolom. Kada je kontrola kreirana i postavljena u kontejner, ostaje problem komunikacije s njom i manipulacija njezinim sadrajem. Treba samo kontroli postaviti svojstvo x:Name. Rukovanje dogaajima i svojstvima hostovane kontrole. Za vedinu WF kontrola WPF izvrava mapiranje svojstava. U primjeru u predavanju prikazano je kako se napravi selekcija tj. kada se oznai red da prikazuje sve prije redove.

29. Rukovanje Attached svojstvima


Attached svojstvo je svojstvo koje moemo pridruiti nekom objektu, iako ga taj objekt nema. Ugraena i najede koritena svojstva Attached svojstva su ona na Layout elementima (Grid, DockPanel i Canvas) i mi smo ih ved koristili za pozicioniranje kontrola. Najede se ono koristi na kontenjerima. Button je pozicioniran uz pomod Button kontrole, kako je prikazano dolje na primjeru.

Tri WPF kontrole kod kojih je najizraenija upotreba Attached svojstva su Grid, DockPanel i Canvas. Grdi sadri Row, RowSpan, Column i ColumnSpan svojstva. DockPanel sadri Dock svojstva, a Canvas sadri Top, Left i ZIndex. Koritenje ugraenih Attached svojstva. Attached svojstva koriste se u XAML tako to se unese naziv klase, a zatim naziv svojstva. Programamabilno koritenje Attached svojstva. U XAML kodu se zapravo aktivira metoda Get ili Set nad objektom koji je vlasnik svojstva i prosljeuje mu se objekt kome je svojstvo pridrueno i vrijednost svojstva. Implementacija vlastitih Attached svojstava. Ako hodemo da kreiramo vlastito Attached svojstvo trebalo bi da izvrimo dva koraka. Da kreiramo Dependency svojstvo a onda i odgovarajudu metodu (Accessore). Prvi dio kreiranja svojstva je njegova registracija. Ova procedura je ista kao i registracija obinog Dependecy svojstva s time to se ne poziva metoda registry ved metode RegistryAttached.

Attached Behaviors. Attached svojstva su dobra koja omogudavaju pristup nekom objektu od strane drugog objekata samo na osnovu pridruenog svojstva. (Attached Property). Ali postoji mogudnost da uz pomod istog svojstva stimuliramo dogaaj na ciljnom objektu i rukovati s njima ne objektu koji je vlasnik svojstva. Ovaj koncept se ostvaruje uz pomod Attached svojstva i njegovih metapodataka.

Tonije metapodatak Callback metode DependecyPropertyChange. Koncept se naziva Attached Behaviors.

30. Implementacija Drag & Drop funkcionalnosti


Drag & Drop se odigrava izmeu dvije kontrole: izvorne i ciljne. Izvorna kontrola je ona iz koje se podatak preuzima, a ciljna je tamo gdje podatak zavrava. Kompletan proces oslanja se na rukovanje Clipboardom. Pored kontrola izmeu kojih se izvrava prevlaenje, bitni akteri u ovom procesu su klase DataObject i DragDrop. DataObject je klasa ija instanca predstavlja objekt koji de biti transportiran kroz Drag & Drop proces. Drag. Prvi korak u Drag & Drop procesu je Drag. Njega moemo uhvatiti kroz Click ili MouseDown dogaaj. Koristimo Preview dogaaj (dogaaj koji podrazumijeva Tunneling tipa rutiranja). Prvi korak je klik lijeve tipke mia koja oznaava poetak. Moemo ga uhvatiti kroz Clik ili MouseDown. Preuzimanje aktualne pozicije mia:

Prethodno je potrebno upisati slijededi kod: Point dragStar; Drugi korak je raunanje pomicanje mia tj. dali moemo objekt smatrati drag & drop.

Prvo provjerava da li stinuta lijeva tipka mia. Ako je tipka mia stisnuta onda poinje raunati pomicanje, ako zadovoljava odreene parametre onda moemo redi da je rije o drag & drop akciji. Sada kada znamo da je akcija zapoela, moemo pokrenuti odgovarajudi metod koji de smjestiti prevuenu vrijednost u Clipboard.

U MouseMove metodu ove podatke demo koristiti da bismo kreirali DataObject instancu i pokrenuli prevlaenje metodom DoDragDrop klase DragDrop.

Kratko objanjenje: Prvo smo kreirali DataObject instancu. Ovo je neophodno da bismo pokrenuli prevlaenje jer metod koji to ini prihvada ba ovakav objekt kao parametar. DataFormats.StringFormat de nam redi o kakvom tipu podataka se radi. Vano je za napomenuti da je mogude prenijeti bilo koji tip podataka. U metodu DoDragDrop prosljeen je izvor prevlaenja (TextBox kontrola), podaci DataObject i DragDropEffect. DragDropEffect nije nita drugo nego nain na koji demo prikazati kursor u procesu prevlanje. Da bismo uhvatili trenutak kada su prevueni podaci iznad kontrole koristimo dogaaje DragEnter i Drop. DragEnter se aktivira kada je krsor sa prevuenim podatkom preao iznad ciljne kontrole, a Drop onog ternutka kada je tipka mia oputen.

Iako je TextBox prodrazumijevano omoguden za prevlaenje, ova opcija nije moguda kod ostalih kontrola prije nego to je eksplicitno omogudimo svojstvom AllowDrop:

Sljededa tabela sadri listu enumeracije kojima se oznaavaju efekti u procesu prevlaenja:

U sljededoj tabeli nalazi se lista dogaaja do kojih dolazii u proceu privlaenja:

31. Rukovanje animacijama


WPF sadri podrku za rukovanje animacijama. Animacija je uzrokovana nekim dogaajem. Taj dogaaj moe biti aktivacija tastera mia iznad kontrole, prelaskom mia iznad kontrole, unos vrijednosti u kontrolu. Easing kada taster krene sa lijeve i strane i nakon nekog vremena uspori. To je jo Ease out. Ease in je suprotan od out i on ubrzava na poetku. Postoji nekoliko razliitih klasa za animiranje DoubleAnimation, ThickessAnimation, ColorAnimation, PointAnimation. Sve su one nastale od jednog te istog tipa AnimationTimeline odnosno Animatable (osnovni tip). Spomenuta klasa se moe pokrenuti programabilno ili putem XAML-a. Kada koristimo putem XAML-a obino ih pridruimo za neki specifini dogaaj putem okidaa Trigger. Tada moramo koristiti Storyboard objekt koji de biti nosilac jedne ili vie animacija i u njega smjestiti odreenu animaciju. Da bismo ovo ostvarili potreban nam je okida, zatim Storyboard i konano DoubleAnimation. Triger demo kreirati kroz Triggers osobinu. Treba nam EventTrigger jer de reagirati na doaaj.

Zatim kreiramo BeginStoryboard i u njega smjetamo Storyboard podelement.

declarationRatio predstavlja decimalnu vrijednost izmeu 0 i 1 i oznaava postotak vremena animacije biti proveden na njezinom usporavanju. Ista stvar samo suprotnog kretanja tijeka je AccelerationRatio. Storyboard.Targetname je attached svojstvo koje predstavlja kontrolu nad kojom de biti izvrena animacija. Storyboard.TargetProperty je svojstvo koje de biti animirano. To predstavlja krajnju toku animacije. From predstavlja poetnu toku animacije. Duration predstavlja vrijeme trajanje animacije. Naizgled udni tip vrijednosti zapravo nije nita drugo do TimeSpan objekt koji predstavlja sate, minute i sekunde. AutoReverse vrada animaciju na poetnu toku. Ovo je jako korisna opcija jer

bi u suprotnom morali hvatati dogaaj zavretka animacije i tada aktivirati novu animaciju. repeatBehavior svojstvo koje omogudava da se animacija ponovi odreeni broj puta. Animaciju kretanja tastera postigli smo animacijom njegovog attached svojstva Canvas.Left. U praksi kada hodemo da animiramo kretanje, veliinu ili rotaciju objekta na sceni koristimo transformaciju. Transformacija je objekt koji predstavlja modifikaciju nekog objekta. Transformacija podrazumijeva tri tipa: rotaciju, translaciju i skaliranje. Svaka WPF kontrola sadri svojstvo RenderTransform. Programabilna kontrola animacije. Kreiranje animacije programbilno zahtjeva instanciranje odreen animirane klase i pridruivanje transformacije RenderTransform svojstvu ciljanog objekta, a zatim animiranje sam transformacije.

Popis easign funkcija sa karakteristikama Funkcija (klasa) backEase CircleEase CubicEase ElastiEase ExponentialEase PowerEase QuadraticEase QuarticEase QuinticEase SineEase Opis Klasa na kratko zaustavlja animaciju prije nego to zapone animacija u drugoj putanji Klasa kreira efekt odskakivanja Klasa kreira animaciju koja se moe ubrzavati ili usporavati koritenjem krune funckcije (circular function) Klasa kreira animaciju koja podsjeda na oprugu koja se klati naprijed nazad dok ne doe u stanje mirovanja Kreiranje animaciju koja se moe ubrzavati ili usporavati koritenjem eksponencijalne formule Klasa kreira animaciju koja se moe ubrzavati ili usporavati koritenjem formula f(t) = tp, gdje je p jednako svojstvu Power Klasa kreira animaciju koja se moe ubrzavati ili usporavati koritenjem formula f(t) = t2 Klasa kreira animaciju koja se moe ubrzavati ili usporavati koritenjem formula f(t) = t4 Klasa kreira animaciju koja se moe ubrzavati ili usporavati koritenjem formula f(t) = t5 Klasa kreira animaciju koja se moe ubrzavati ili usporavati koritenjem formule.

32. Rukovanje okidaima


Karakteristino za svojstva koja modificiramo uz pomod okidaa jeste da to da de njihovo izmjenjeno stanje trajati upravo onoliko koliko traje i sama izmjena svojstva. WPF razlikuje etiri vrste okidaa: EventTrigger koristi se u kombinaciji sa dogaajima PropertyTrigger na osnovu promjene vrijednosti nekog svojstva moemo izvriti izmjenu nekog drugog svojstva MultiTrigger reagira na izmjene vrijednosti vie svojstava istovremeno Dana Trigger i MultiDataTrigger reagira na izmjene na povezanim podacima

PropertyTrigger. Property okidae dodjeljujemo kontroli putem njezinog Style svojstva. Style svojstvo sadri kolekciju Triggers koji dodjeljujemo jedan ili vie okidaa. Sami okidai sadre svojstvo koje sluaju u njegovu vrijednost (Property i Value) i sadri Setter objekte u kojima se postavljaju ciljane vrijednosti svojstva.

TriggerEnter i TriggerExit. Ako elimo pokrenuti neki akciju pored izmjene svojstava tada koristimo EnterActions i ExitActions svojstva Triggera. EventTrigger. On se razlikuje od Property jer ne prihvada kolekciju Seter objekata ved kolekciju objekta tipa Action odnosno Delegate. Event Trigger ne moramo pridruivati Style atributu ved ga moemo pridruiti direktno Triggers kolekciji samog objekta, kao u prethodnom primjeru.

MultiTrigger. Ukoliko elimo aktivirati dva uslova (pr. ako je kursor iznad nje) i ako je pozadinska boja crvena, tada koristimo MultiTrigger. Data trigeri i vizaulizacija podataka. Okidai podataka omogudavaju kontroli da reagiraju na specifian podatak prilikom povezivanja sa izvorom podataka. Recimo elimo prikazati listu podatak i ako se u toj listi pojavi neki specifini grad elimo da on bude oznaen drugaijom bojom. Kada

elimo da izvrimo aktivaciju okidaa na osnovu pridruenih podataka, koristimo DataTrigger i pridruujemo ga kolekciji Triggers.

33. uvanje stanja aplikacije


uvanje podeavanja. Microsoft podrazumijeva koritenje standariziranog XML fajla u ovu svrhu i taj fajl se naziva App.config. Fajl prisutan i u web aplikacijama naziva se Web.config. Microsoft je podeavanje aplikacije podijelio u dvije kategorije: Appliaction Settings i User Settings. Ideja koja soji iza ovi podeavanja bude dostupna korisniku ved da bude fiksirana na nivou aplikacije i izmjenjiva sam pute dirketne izmjene App.config.fajla. App.config file sadri Application i User podeavanja. Savko podeavanje uva se u fajlu Setting elementa koji sadri atribute name, serializeAs i value. Automatsko generiranje App.config fajla se dogaa onog trenutka kada unesemo prvo podeavanje u aplikaciju. Microsoft ima poseban sistem koji prevodi podeavanja iz App.config fajla u itljivu i editabilnu formu i reprezentira ih kroz Settings dokument. Settings fajl ima svoj adekvatni pozadinski cs fajl. Ovaj fajl ima obino sufiks Designer, i sadri tipizaciju za podeavanja koja postavljamo u Settings fajlu. Setting fajl sadri tabelu sa svim Settings vrijednostima aplikacije. Vrijednosti su Name, Type, Scope, Value. Svako od podeavanja koje se nalaze u tablici Settings definirani su kroz kolonu Name (myUserSetting i connString) i biti de dostupni unutar aplikacije pod tim imenom. Kolona Type predstavlja tip vrijednosti. Kolona Value nosi vrijednost podeavanja. Scope kolona predstavlja opseg podeavanja. Ako je vrijednost kolone User, znai da se radi o User podeavanju, dok je u suprotnom rije o Application podeavanju. Rukovanje podeavanjima. Settings.Designer.cs ovaj fajl sadri klasu Settings koja nasljeuje AppliactionSettingsBase klasu. S obzirom da moemo dodavati koliko elimo Settings fajlova u projekt ponovimo da naziv klase ne mora biti Settings. ApplicationSettingsBase sadri klase metoda za rukovanje fajlom sa podeavanjima od kojih je za nas najbitniji Save. Da bismo programabilno doli do odreenog podeavanja, koristimo klasu sa podeavanjima (podrazumijevano Settings), zatim slijedi instanca i konano sam naziv podeavanja.

Ukoliko elimo da izmjenimo neko podeavanje, koristimo isto svojstvo, samo to ovaj put dodjeljujemo vrijednost.

Nakon ove izmjene unutar kompletne aplikacije, podeavanje myUserSetting bi prezentiralo vrijednost Hello. Ipak ukoliko bismo iskljuili aplikaciju i ponovno ju ukljuili podeavanje bi se vratilo na staru vrijednost.

Osim snimanja mogude je i resetiranje uz pomod metode za to. Znali ono de obrisati podeavanja i onda de biti ponovno kreirano sa podeavanjima preuzeto iz fajla app.config

Kada elimo da uitam podeavanja iz User.config fajla u memoriju, koristimo meto Reload. Tada de se sve izmjene, koje smo na podeavanjima izmijenili vratiti na posljednju snimljenu verziju.

33. Rukovanje aplikacijom


Svaka WPF aplikacija izvrava se kroz klasu Application. Svaka WPF aplikacija kontrolirana je jednom instancom Application klase. Njeno instanciranje moemo izvriti progrmabilno ili kroz XAML kod. Application klasa se podrazumijevano instancira kroz XAML kod, a sistem gengrira fajlove App.xaml i App.xaml.cs X:Class definira XAML dokument kao App klasu. Unutar Application elementa nalazi se StartupUri atribut. On oznaava koja de grafiki atribut biti prvi pokrenuti prilikom pokretanja aplikacije. Svojstva Current i MainWindow. Windows svojstvo sadri kolekciju svih instanciranih prozora unutar aplikacije. Svali lan kolekcije je objekt klase Window i omogudava rukovanje prozorom. Primjer: Button kontrola i kada kliknemo automatski se otvore tri nova prozora. (rukovanjeAplikacijom1) Button kontola i kada se klikne unutar istog prozora napie se Hello, ali pri tome sve ostalo nestane. (rukovanjeAplikacijom2) Dogaaj aplikacije. Svaka aplikacija posjeduje i neke dogaaje. Prvi dogaaj je prilikom pokretanja aplikacije (StartUp dogaaj). Primjer: Prilikom pokretanje aplikacije pojavi se MessageBox koji prikazuje naziv. Nakon kada kliknemo ok ostaje samo MainWindow koji se otvara uvijek prilikom otvaranja. (rukovanjeAplikacijom3) Ovdje smo mijenjali naslovnu traku u dokumentu pute propertis svojstva (rukovanjeAplikacijom4)

Aktivacija i deaktivacija aplikacije. Iako moe imati vie aktiviranih aplikacija aktivna se smatra samo ona koja se nalazi na najvioj poziciji u na Desktopu. Ova dva dogaaja mogude je uhvatiti kroz Activate i Deactivate klase Application. Zaustavljanje rada aplikacije. Shutdown mode sadri tri vrijednosti o o o OnExplicitShutDown biti de prekinuto kada posljednji prozor bude zatvoren OnLastWindowClose zatvaranjem glavnog prozora aplikacija de biti prekinuta OnMainWindowClose aplikacija nede biti prekinuta nakon zatvaranja prozora, ved je moramo eksplicitno prekinuti.

Aplikacija moe biti prekinuta sa radom kada doe do prekidanja korisnike sesije na operativnom sistemu (logg off, Shutdown, Sleep, Hibernate). Za to se koristi onSessionEnding. Ukoliko prekinemo sesiju ono moe blokirati izvravanje sesije. Primjer: Imamo primjer koji nam prikazuje ponaanje raunalu u sluaju ForceShutDown. Exit dogaaj. Posljednji dogaaj u ivotu aplikacije je Exit dogaaj. Do njega dolazi u trenutku kada aplikacija zavri sa radom. SplashScreen. SplashScreen je neto to de se prikazati prilikom uitavanja programa dok se program ne upali. To radimo na nain da uitamo sliku desnom tipkom mia, zatim Add Existing Item. Uitamo sliku i nakon to smo ju uitali izmijenimo njezino svojstvo ili Build Action u SplashScreen. 35. Objavljivanje aplikacije Dva osnovna oblika aplikacije Stand alone Windows desktop aplikacija i web browser aplikacija. Gledajudi u odnosnu na prava aplikacija moe biti Full Trust (aplikacija ima puna prava na klijentskom raunalu) Partial Trust (nedostatak bilo kojeg prava) Stadn alone aplikaciju moemo objaviti na nekoliko naina: Kopiranjem ClickOne Installerom Windows Installerom Stand alone ClickOne Installerom. ClickOnce omogudava korisniku da na vrlo jednostavan nain instalira neku aplikaciju (windows form ili windows konzolnu aplikaciju). Ako elimo dodatne opcije onda idemo desnom tipkom mia u solution exploreru na Propertis. Kartica Publish slui da izmjene. Aplikaciju moemo objaviti klikom na Publish ili Publish Wizard. Prerequisites i Updates. Perequisties su sve dodatne komponente koje nae aplikacija zahtjeva da bi funkcionirala (pr. odreena verzija Frameworka). Updates sadri opcije za to na koji nain de se vriti auriranje aplikacije (prije pokretanja, nakon, koja je minimalna verzija potrebna da bi nova funkcionirala) Objavljivanje Stand Alone aplikacije koritenjem Windows Installera. Windows Installer je poseban tip Visual Studio projketa koji sadri tehnologiju za instalaciju razliitih tipova aplikacije na razliite

naine. Da bismo kreirali jedan Windows installer trebalo bi da kreiramo novi setup projekta tipa Visual Studio Installer.

36. Napredna podeavanja Windows Installera


U solution Exploreru postoji vie ikonica koje omogudavaju podeavanje razliitih komponenti instalacija. To su Properties Panel, File System Editor, Registry Editor, File Types Editor, User Interface Editor, Custom Actions Editor i Lunch Conditions Editor. Registri Editor. Omogudava postavljanje kljueva i vrijednosti u registri. Svi podaci koje unesemo u ovaj editor biti de smjeteni u Windows Editor prilikom instalacije na klijentsko raunalo. File Types Editor. Aplikaciju koju kreiramo moe rukovati specifinim fajlovim (recimo npr. da smo kreirali neki teks editor i elimo imati svoju ekstenziju fajlova. To demo dobiti na nain da u Setupu projekta definiramo ekstenziju). User Interface. Postoji itav niz linearnih koraka koje korisnik mora prodi da bi zavrio instalaciju. U okviru tih koraka mogao je da izabere samo ciljani folder. Svi ti koraci nisu fiksni i korisnik moe sam da izabere koje de od njih da odabere i prilagodi sebi. Install i Administrative Install su setovi koji de biti prikazani obinom korisniku ili administratoru prilikom instalacije programa.

Slika 6: Podrazumijevani interfejs

Proces je prikazan u tri stadijuma: Strat, Progress i End. U bilo koji dio procesa instalacije moemo ubaciti neki od ugraenih dijaloga, opcijom konteksong menija Add Dialog. Pomodu kontekstnog menija i Move UP i Move Down moemo mijenjati pozicije.

Custom Action Editor. Sastoji se od etiri foldera Install, Commit, Rollback i Uninstall. Svaki od ovih foldera predstavlja jedan dogaaju unutar instalacije. Kod ovih foldera moe se nai nijedan, jedan ili vie programa. Lunch Conditions. Aplikacija koju elimo da distriburiamo ponekad zahtjeva odreene predispozcije. Postoji pet predispozicija koje moemo dodati instaleru: File Launch Condition, Registry Launch Condition, Windows Installer Launch Condition, .NET Framework Launch Condition i Internet Information Services Launch Condition. File Lunch Condition. Provjerava postojanje odreenog fajla u ciljanom sistemu. Da bismo provjerili fajlove na sistemu potrebno je dodati Launch i Search. Search nod provjerava postojanje odreenog elementa dok Launch nod izvrava neku logiku u odnosu na rezultat pretrage. Registry Launc Condition. Provjerava postojanje stavke u registryju. Definiranje uslova fukcionira po istom principu kao i definiranje uslova za provjeru postojanje fajlova. Windows Installer Launch Condition i Internet information Services Launch Condition. Provjeravaju postojanje ove dvije aplikacije na platformi. Windows Installer provjerava postojanje odreenog instalacijskog paketa na ciljanom raunalu, a Internet Information Services demo provjeriti ukoliko aplikacija koju instaliramo sadri web komponente (ASP.NET aplikacija)

You might also like