Windows Application Development
Windows Application Development
Windows Application Development
<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>
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
<StackPanel Orientation="Vertical">
WarpPanel Ovaj kontejner reda kontrole s lijeva na desno odozgor prema. Default horizontalna orijentacija, ali mogude ju je prikazati i vertikalno.
Header svojstvo HeaderContetnControl klase ima iste osobine kao i Content svojstvo, pa je mogude smjestiti kompleksan objekt.
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.
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.
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)
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:
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.
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.
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
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.
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)
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.
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.
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.
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.
Grupiranje podataka. Pored sortitranja i filtriranja mogude je takoer i grupirati podatke u pogledu upotrebom klase PropertyGroupDescription.
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.
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.
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:
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.
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.
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).
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.
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.
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:
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.
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.
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.
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.
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)