You are on page 1of 343

Windows Phone fejleszts lpsrl lpsre

Kszlt a Microsoft Magyarorszg megbzsbl

rvai Zoltn Fr Attila Gerg Farkas Blint Flp Dvid Komjthy Szabolcs Turczy Attila Velvrt Andrs

Windows Phone fejleszts lpsrl lpsre

Jedlik Oktatsi Stdi Budapest, 2012

A szerzk a knyv rsa sorn trekedtek arra, hogy a lert tartalom a lehet legpontosabb s napraksz legyen. Ennek ellenre elfordulhatnak hibk, vagy bizonyos informcik elavultt vlhattak. A knyvben lert programkdokat mindenki sajt felelssgre alkalmazhatja. Javasoljuk, hogy ezeket ne les krnyezetben prbljk ki. A felhasznlsbl ered esetleges krokrt sem a szerzk, sem a kiad nem vonhat felelssgre. A forrskdok elrhetk a https://devportal.hu/wp7/konyv oldalon keresztl. Az oldalakon elfordul mrka- valamint kereskedelmi vdjegyek bejegyzjk tulajdonban llnak.

A knyv vagy annak brmely rsze, valamint a benne szerepl pldk a szerzkkel kttt megllapods nlkl nem hasznlhatk fel zleti cl oktatsi tevkenysg sorn! A knyv tudsanyaga llamilag finanszrozott kzp- s felsoktatsban, illetve szakmai kzssgek oktatsban brmely clra felhasznlhat.
2011 Microsoft. Minden jog fenntartva. A knyv papr alapon megvsrolhat a Jedlik Oktatsi Stdi honlapjn keresztl: http://joskiado.hu/termek/windows_phone_fejlesztes_lepesrol_lepesre.html

Szerkesztette: Novk Istvn Szakmai lektor: Novk Istvn Anyanyelvi lektor: Dr. Bonhardtn Hoffmann Ildik Bort: Varga Tams

Kiad: Jedlik Oktatsi Stdi Kft. 1215 Budapest, v u. 8-12. Internet: http://www.jos.hu E-mail: jos@jos.hu Felels kiad: a Jedlik Oktatsi Stdi Kft. gyvezetje

Nyomta: LAGrade Kft. Felels vezet: Szutter Lnrd ISBN: 978-615-5012-13-6 Raktri szm: JO-0338

Tartalomjegyzk

Tartalomjegyzk
Elsz ............................................................................................................... 13 1. Bevezets a Windows Phone platform-ba .................................................. 15
A Windows Phone Platform ............................................................................................... 15 Windows Phone hardver kvetelmnyek........................................................................... 16 A Windows Phone platform kpessgei ............................................................................ 16 Alkalmazs fejleszts Silverlight alapokon ....................................................................... 19 Ismerkeds a XAML-lel ..................................................................................................... 19 XAML alap felhasznli felletek..................................................................................... 21 Hello Windows Phone......................................................................................................... 22 sszefoglals...................................................................................................................... 26

2. Felhasznli lmny tervezse Windows Phone-on ...................................... 27


A Windows Phone jelensg ............................................................................................... 27 Ikonografikus s infografikus felletek ............................................................................. 28 A METRO Dizjn Nyelv ....................................................................................................... 29 Ismers megjelens .......................................................................................................... 29 Tiszta s pehelyknny..................................................................................................... 29 Digitlis eredetisg ............................................................................................................ 30 Gynyr tipogrfia ........................................................................................................... 30 llandan mozgsban....................................................................................................... 30 A tartalom az elsdleges ................................................................................................... 30 Design vezrelt fejleszts................................................................................................... 31 Tartalom s informcis architektra ................................................................................ 32 Hasznlhatsg s ergonmia .......................................................................................... 32 Eszttika s vizulis lmny.............................................................................................. 32 Csinld magad! ................................................................................................................... 33 A dizjn szrakoztat! ....................................................................................................... 33 Innovci tervezs kzben ................................................................................................ 33 A problma megrtse ...................................................................................................... 33 Magasabb termkminsg ................................................................................................ 33 Tervezs Sketchflow-val ................................................................................................... 34 lmny vagy alkalmazs .................................................................................................... 35 Ismerjk meg a felhasznlinkat! ...................................................................................... 35 Relevns tartalom ............................................................................................................. 36 Szemlyes alkalmazsok .................................................................................................. 36 Hasznos, jl hasznlhat, kvnatos ................................................................................. 36 Gyakorlati Dizjn ................................................................................................................. 36

Mozgs s animci ......................................................................................................... 36 Windows Phone 7 specifikus komponensek tervezse ..................................................... 37 Vezrlk hasznlata ......................................................................................................... 39 rintkpernys alkalmazsok tervezse ......................................................................... 41 sszefoglals ..................................................................................................................... 42

3. Alkalmazsfejleszts Windows Phone-on ..................................................... 43


Alapvet WP7 vezrlk ...................................................................................................... 44 Parancsvezrlk ............................................................................................................... 49 Szvegmegjelentsi vezrlk .......................................................................................... 55 Szvegbeviteli vezrlk .................................................................................................... 58 Listavezrlk .................................................................................................................... 62 Adatkts ............................................................................................................................ 65 Erforrsok ....................................................................................................................... 65 Tbb vezrl ktse egyazon forrshoz ........................................................................... 68 Adatkts UI-elemek kztt .............................................................................................. 70 Az adatok megjelensnek testreszabsa adatsablonokkal ........................................... 72 A vezrlk kinzetnek testreszabsa vezrlsablonokkal ............................................ 74 Az alkalmazs llapotainak ltrehozsa VisualState-ek segtsgvel ............................ 78 Animcik hozzadsa ..................................................................................................... 81 Tmk hasznlata ............................................................................................................... 83 sszefoglals ..................................................................................................................... 84

4. Halad alkalmazsfejleszts Windows Phone-on .......................................... 85


Trkpek kezelse .............................................................................................................. 85 Feliratkozs a szolgltatsra ............................................................................................ 85 A Bing Maps vezrl hasznlata ....................................................................................... 86 Pushpinek......................................................................................................................... 89 Rtegek alkalmazsa ....................................................................................................... 90 Egyb szolgltatsok ........................................................................................................ 93 Navigci ............................................................................................................................ 97 Oldalak ............................................................................................................................. 97 Adattvitel az oldalak kztt ............................................................................................. 99 Navigcis metdusok...................................................................................................... 99 BackStack ...................................................................................................................... 100 Az alkalmazs kiegsztse navigcis vezrlkkel ....................................................... 101 Pivot s Panorama ........................................................................................................... 103 Klnbsgek................................................................................................................... 104 Silverlight Toolkit for Windows Phone7 ......................................................................... 105 Telepts ........................................................................................................................ 105 Fontosabb vezrlk ........................................................................................................ 106 Pldaprogram ................................................................................................................. 109 sszefoglals ................................................................................................................... 111

5. Az alkalmazs letciklusa ............................................................................ 113


8

Tartalomjegyzk Multitasking ....................................................................................................................... 113 A feladattemezs elmletben ........................................................................................ 114 A multitasking megvalstsa WP 7.5 platformon............................................................ 115 llapotok kezelse ............................................................................................................ 117 letciklus-esemnyek kezelse ...................................................................................... 117 Az alkalmazs llapotnak mentse s helyrelltsa ..................................................... 119 Folyamatok a httrben .................................................................................................... 125 Elmleti ttekints ........................................................................................................... 125 Zenelejtszs integrlsa sajt alkalmazsokba ............................................................. 126 Figyelmeztetsek s riasztsok kezelse........................................................................ 132 Adatok letltse a httrben............................................................................................ 133 sszefoglals.................................................................................................................... 135

6. Alapvet telefonos funkcik hasznlata ...................................................... 137


A pldaalkalmazs ltrehozsa........................................................................................ 138 Launcherek........................................................................................................................ 142 PhoneCallTask................................................................................................................ 142 SmsComposeTask .......................................................................................................... 143 EmailComposeTask ........................................................................................................ 144 WebBrowserTask............................................................................................................ 144 MediaPlayerLauncher ..................................................................................................... 145 SearchTask ..................................................................................................................... 146 Chooserek ......................................................................................................................... 147 SavePhoneNumberTask ................................................................................................. 147 PhoneNumberChooserTask ............................................................................................ 148 CameraCaptureTask ....................................................................................................... 149 PhotoChooserTask ......................................................................................................... 149 Adatok megosztsa alkalmazsok kztt ....................................................................... 150 Contacts.......................................................................................................................... 151 Appointments .................................................................................................................. 152 Kamera hasznlata taszk nlkl ...................................................................................... 153 sszefoglals.................................................................................................................... 161

7. Tovbbi telefonos funkcik hasznlata........................................................ 163


Az rintkperny kezelse ............................................................................................. 163 Alapvet rintsi esemnyek .......................................................................................... 163 Multitouch manipulcik .................................................................................................. 166 A nyers rintsi adatok kezelse ..................................................................................... 169 Helymeghatrozs ............................................................................................................ 173 Helyzetmeghatrozs ....................................................................................................... 176 A gyorsulsmr hasznlata ........................................................................................... 176 A giroszkp hasznlata ................................................................................................... 179 Az irnyt hasznlata ...................................................................................................... 180 Az rzkelk egyttes hasznlata a Motion API segtsgvel ......................................... 183

sszefoglals ................................................................................................................... 185

8. Adatkezels ................................................................................................ 187


Isolated Storage ............................................................................................................... 187 Application Settings ......................................................................................................... 188 IsolatedStorageFileStream .............................................................................................. 194 Isolated Storage gyakorlat .............................................................................................. 196 nll feladatok ............................................................................................................. 200 IsolatedStorage Tool ..................................................................................................... 200 Loklis adatbzisok hasznlata Windows Phone 7-en .................................................. 202 Linq To SQL ................................................................................................................... 202 DataContext ................................................................................................................... 203 Mapping ......................................................................................................................... 203 Adatbzis ltrehozsa .................................................................................................... 204 Adatbzis ltrehozsa II. ................................................................................................ 206 Adatok felvitele INSERT .............................................................................................. 210 Adatok lekrdezse SELECT ...................................................................................... 210 Adatok mdostsa UPDATE ...................................................................................... 211 Adatok trlse DELETE ............................................................................................... 211 Az adatbzis biztonsga ................................................................................................. 212 Adatbzis kezels gyakorlat ........................................................................................... 212 sszefoglals ................................................................................................................... 215

9. Kommunikci szerverrel............................................................................ 217


A kommunikci mdjai .................................................................................................. 217 Webszolgltatsok hasznlata ........................................................................................ 218 A webszolgltatsok mkdse...................................................................................... 218 Webszolgltats egy mintaalkalmazsban ..................................................................... 219 Webes tartalom letltse ................................................................................................. 224 Adatelrs az OData protokollon keresztl .................................................................... 226 Adattrols Windows Azure-ban ..................................................................................... 230 Fjlok (blob-ok) ............................................................................................................... 231 Vrakozsi sorok (queue-k) ............................................................................................ 234 Tblk (table-k) .............................................................................................................. 236 razs ............................................................................................................................ 239 Felhasznl-hitelests szerveroldalrl .......................................................................... 240 sszefoglals ................................................................................................................... 243

10. Lapkk s rtestsek ................................................................................ 245


Nhny plda a lapkk s rtestsek hasznlatra ...................................................... 246 A lapkk tulajdonsgai ..................................................................................................... 246 Mret .............................................................................................................................. 246 Kiszgezs s elrendezs .............................................................................................. 247 Statikus s dinamikus lapkk .......................................................................................... 247 A lapkk felptse ......................................................................................................... 247

10

Tartalomjegyzk Msodlagos lapkk ......................................................................................................... 248 Deep Linking ................................................................................................................... 249 Lapkk ltrehozsa s frisstse alkalmazsunkbl ...................................................... 249 A ShellTile API ................................................................................................................ 249 Lapka frisstse ............................................................................................................... 249 Msodlagos lapka ltrehozsa ........................................................................................ 253 Msodlagos lapka trlse ............................................................................................... 254 Lapkk frisstse Background Agent-ek segtsgvel ................................................... 254 Lapkk frisstse ShellTileSchedule segtsgvel ......................................................... 258 Idzts belltsa az elsdleges lapkra ........................................................................ 258 Idzts belltsa egy msodlagos lapkra .................................................................... 260 Idzts trlse................................................................................................................ 260 A felugr rtestsek ........................................................................................................ 260 A Push Notification szolgltats...................................................................................... 261 A Push Notification szolgltats mkdse ..................................................................... 262 Lapkk frisstse Push Notification-k segtsgvel ........................................................ 263 rtestsek megjelentse Push Notification-k segtsgvel .......................................... 267 Raw zenetek fogadsa a Push Notification szolgltatson keresztl............................. 268 Push Notification-nk s a Windows Azure ................................................................... 269 sszefoglals.................................................................................................................... 270

11. Jtkok a Mango vilgban ....................................................................... 271


Windows Phone a motorhztet alatt ........................................................................... 271 Grafikus programozsi s XNA alapok ........................................................................... 272 A kp kialaktsa ............................................................................................................. 272 A jtkciklus .................................................................................................................... 277 Egy XNA program felptse ........................................................................................... 277 Sprite-ok ......................................................................................................................... 281 Bemenetek kezelse ....................................................................................................... 283 tkzsek detektlsa .................................................................................................... 285 Animcik ....................................................................................................................... 286 XNA s Silverlight integrci ........................................................................................... 291 Silverlight s XNA egytt a gyakorlatban......................................................................... 291 sszefoglals ................................................................................................................. 299

12. Marketplace .............................................................................................. 301


APPHUB ............................................................................................................................ 301 Kszlken trtn hibakeress s regisztrci ............................................................ 301 Alkalmazsok teleptse ................................................................................................. 303 ChevronWP7 .................................................................................................................. 304 Publikls .......................................................................................................................... 305 Screenshot kszts ........................................................................................................ 310 Windows Phone Marketplace Test Kit ............................................................................. 311 Ikonok ............................................................................................................................. 313

11

Marketplace Task ............................................................................................................. 314 Trial Mode ......................................................................................................................... 316 sszefoglals ................................................................................................................... 317

13. Teljestmny ............................................................................................. 319


A tipikus teljestmny-problmkrl ............................................................................... 319 A CPU s a GPU feladata ................................................................................................. 320 Csillagok, csillagok....................................................................................................... 320 Lass betltds kezelse .............................................................................................. 323 Az elrendezs (layout) kltsgeinek cskkentse ........................................................... 323 Splash Screen ................................................................................................................ 324 Inicializcis teendk elhalasztsa ................................................................................. 324 Httrszlak alkalmazsa ............................................................................................... 324 Elre elvgzett munka .................................................................................................... 325 Kis sszefoglals ............................................................................................................ 326 Akadoz animcik okai, megoldsa.............................................................................. 326 Frame Rate Counters ..................................................................................................... 328 Redraw Regions ............................................................................................................. 329 Hasznljuk a GPU-t! ....................................................................................................... 330 Cache vizualizci .......................................................................................................... 331 Beptett animcik s a GPU ........................................................................................ 332 UI, Compositor s Input szlak ....................................................................................... 332 Hossz vlaszid kezelse .............................................................................................. 333 ltalnos tippek................................................................................................................ 334 Listk ................................................................................................................................. 334 Szubjektv teljestmny .................................................................................................... 335 Tilt effektus ..................................................................................................................... 336 A folyamat jelzse .......................................................................................................... 337 Kztes animcik ........................................................................................................... 337 Amikor a lassabb gyorsabb(-nak tnik) ........................................................................... 337 Memria-optimalizls ..................................................................................................... 338 A memria foglals kijelzse .......................................................................................... 339 Optimalizls .................................................................................................................. 339 Windows Phone Performance Analysis .......................................................................... 339 sszefoglals ................................................................................................................... 343

12

Elsz
Amikor els hordozhat telefonomat 18 vvel ezeltt megkaptam, az mg egy kisebb diplomatatska mretvel egyezett meg. Egyetlen dolgot lehetett vele csinlni: telefonlni. Mg csak telefonknyve sem volt, nekem kellett elkeresni a szmokat a noteszombl s beptygni azokat egy-egy telefonhvs sorn. Szinte hihetetlen mrtk vltozson estek azta t a mobil kszlkek! Ma leginkbb az okostelefon megjellst hasznljuk azoknak a tenyrben elfr szinte kizrlag rintkpernys mini csodknak a megnevezsre, amelyek szmtgpek, s a telefonls lehetsge csupn egyike tucatnyi kpessgeiknek. Olyan eszkzk, amelyeken internetet is elr alkalmazsokat tudunk futtatni. Az autk szerelmesei kztt vannak olyanok, akik szeretik gpjrmvket maguk btyklni. A replgpmodellek megszllottjai kztt vannak olyanok, akik maguk is gpeket ptenek. Ugyangy az okostelefonok felhasznli kztt is tbben akadnak, akik sajt alkalmazsokat szeretnnek kszteni, s ezek piaci sikerbl akr meg is lni. Ez a knyv az alkalmazsfejlesztknek kszlt, tbb korbbi kezdemnyezshez hasonlan a magyarorszgi Windows Phone szakmai kzssg aktv munkjval jtt ltre. Olyan szakemberek rtk, akik korbban mr megmutattk, hogy rtenek a platform hasznlathoz s programozshoz. Ebben a knyvben azokat az ismereteiket is tadjk, amelyek segtenek a Windows Phone fejlesztsbe frissen bekapcsold rdekldknek megismerni a platform legfontosabb alapelemeit, s egyttal betekintst is adnak annak mkdsbe s hasznlatba. rvai Zoltn (1. s 2. fejezetek), Farkas Blint (9. s 10. fejezetek), Fr Attila Gerg (5. s 11. fejezetek), Flp Dvid (3. s 7. fejezetek), Komjthy Szabolcs (4. s 6. fejezetek), Turczy Attila (8. s 12. fejezetek), valamint Velvrt Andrs (13. fejezet) mindannyian rengeteg energit fordtottak arra, hogy ismereteiket megosszk a fejlesztkzssggel. Olyan magyar nyelv knyvet hoztak ltre, amelyben szemlyes tapasztalataikon, a platformhoz kapcsold lmnyeiken keresztl mutatjk be a Windows Phone alkalmazsfejleszts alapvet eszkzeit s fogsait. A knyv s a hozztartoz programozsi pldk a weben is elrhetk a Devportal.hu oldalon. Novk Istvn Budapest, 2011. december

13

1. Bevezets a Windows Phone platform-ba


Az utbbi vek egyik legjelentsebb technolgiai robbansnak lehettnk tani az okostelefonok, illetve az okoskszlkek piacn. vente okostelefonok millii tallnak gazdra! Ezek az eszkzk naprl napra egyre inkbb htkznapjaink rszv vlnak. Sokszor trsknt, letnk, digitlis identitsunk egyfajta kiterjesztseknt gondolunk rjuk. A vilgot helyezik keznkbe, brmi, brmikor elrhetv vlik. A telefonok tudjk, hol vagyunk, kik vagyunk, kik a bartaink, mit szeretnk csinlni s kivel, mikor hol kellene lennnk, s maximlisan igyekeznek minket kiszolglni. Nem csoda ht, hogy a Twitter, a Facebook, a Flickr s mg szmtalan online s folyamatos jelenltet ignyl szolgltats vilgban ezek az eszkzk robbansszer fejldsen mentek t s hatalmas kereslet mutatkozik irntuk, amely vrl vre csak n. A Microsoft egyike volt az elsknek az okostelefonok piacn. A Windows Mobile termkcsald hossz utat jrt be mg ha ez az t igencsak rgs is volt. Ez a mobil opercis rendszer azonban elssorban zleti hasznlatra kszlt, azzal a gondolattal, hogy az asztali Windows-t vihetjk a zsebnkben. Az j ignyeknek, a fogyaszti piacnak azonban ezek az elvek s ez a termk nem tudott megfelelni, a konkurrens termkekkel nem volt kpes felvenni a versenyt. A Microsoft - ezt a tnyt felismerve szemmel lthatlag nem erltette tovbb ezt a vonalat, s alapjaiban j opercis rendszerrel, a Windows Phone-nal jelent meg a piacon. Ezt a termket a megvltozott, j ignyekhez igaztva terveztk, gyakorlatilag a nullrl indulva. Az okostelefonok j piaca nemcsak a felhasznlk szmra jelentenek izgalmas, j lehetsgeket, hanem a fejlesztcgek szmra is. Az elmlt vekben szmos mesbe ill sikertrtnetet hallhattunk olyan cgekrl, akik a semmibl, 1-2 v alatt meghatroz szereplkk nttk ki magukat. gy nem csoda, hogy az okostelefonok megjelensvel egyfajta fejleszti aranylz trt ki. Sajnos az id elrehaladtval egyre nehezebb sikertrtneteket rni, de a Windows Phone jabb ilyen lehetsget jelent! A Microsoft, a Windows Phone s sajt alkalmazsboltja (Marketplace) megjelensvel j piacot nyit a vllalkoz szellem fejlesztk szmra, s jabb lehetsgeket knl, hogy jabb sikertrtnetek szlethessenek.

A Windows Phone Platform


A Windows Phone megjelensben merben jszer, az eddigi mobil opercis rendszerektl eltr dizjnnal s szellemisggel rendelkezik. A Windows Phone klnlegessge, hogy a Microsoft kszlket nem, csupn mobil opercis rendszert fejleszt, ezzel lehetsget biztostva a kszlk gyrti szmra sajt termkpalettk kialaktsra. A gyakorlott fejlesztk ezeket a sorokat olvasva biztosan felhrdlnek s elgondolkodnak, hogy ez vajon mekkora fragmentcit jelenthet a kszlkek piacn, az alkalmazst hny klnbz eszkzre s hardver konfigurcira kell elkszteni. Az Apple a fragmentci kikszblsre rendkvl egyszer stratgit alkalmaz: a kszlkeket maga gyrtja. A Google ezzel a krdssel nem nagyon foglalkozik, illetve a knyv rsnak pillanatig nem sokat foglalkozott. A Google platformjn (Android) a fejlesztk szmra komoly kihvst jelent az alkalmazsok felksztse a fragmentcira, sokszor knyszerlnek olyan dntseket hozni, hogy bizonyos kategria alatt nem tmogatnak telefonokat. A Microsoft valahol a kett kztti utat vlasztotta. Habr sajt eszkzt nem dobott a piacra, de nagyon pontos specifikcit rt el a telefon hardveres kpessgeit illeten. Az a telefon lehet Windows Phone, amely az elrt hardver kvetelmnyeket maradktalanul kielgti.

15

1. Bevezets a Windows Phone platform-ba

Windows Phone hardver kvetelmnyek


A Windows Phone kszlkeknek szmos hardveres elrsnak kell megfelelnik: Fizikai gombok: A Windows Phone kszlkeken ktelezen jelentkez hardveres gombok, amelyek szorosan kapcsoldnak az opercis rendszer s a navigcis mechanizmus mkdshez. Kijelz: A kijelznek legalbb 800 x 480-as felbontssal kell rendelkeznie. A kijelznek tmogatnia kell a kapacitv technolgit s minimum 4 pontos rintst meg kell tudnia klnbztetni. A kszlknek hlzati kommunikci tekintetben mobil adathlzatok kezelst, valamint Wi-Fi-t kell tmogatnia. Operatv memria tekintetben legalbb 256 MB memrival kell rendelkeznie a kszlknek. (A gyrtk dnt tbbsge 512MB-ot tesz a kszlkeibe.) Adatok trolsra minimum 8GB-os flash trolegysggel kell rendelkeznie a kszlknek. Mholdas navigci tekintetben Assisted-GPS tmogats szksges. Vissza gomb (Back): Az alkalmazson belli navigcit, illetve fut taszkok kztti vltst szolglja. Kezd oldal gomb (Home): A Start kpenyre navigl brhonnan, brmely alkalmazsbl. Keres gomb: Minden esetben a beptett Bing kerest hozza fel. 7.1-ben ez a viselkeds nem mdosthat.

Hlzati jellemzk:

Memria:

Navigci: Mozgsrzkels: A telefon mozgsnak, dntsnek s egyb pozciinak kvetsre gyorsulsmrt kell bepteni. Irnyt Giroszkp (jval pontosabb pozci/llapot meghatrozsra kpes, mint a gyorsulsmr) Hts kamera Ellapi kamera

A Windows Phone ltal tmogatott egyb opcionlis hardverek listja:

A Windows Phone platform kpessgei


A Windows Phone platform alapveten ngy rszbl tevdik ssze: 1. Futtatkrnyezet 2. Integrci a felhvel 3. Marketplace portl szolgltatsok 4. Fejleszteszkzk

Futtatkrnyezet
A Windows Phone alkalmazsok izolltan, n. sandboxban (homokoz) futnak, elssorban biztonsgi okok miatt. Az alkalmazsok ennek ksznheten nem frhetnek hozz kontrolllatlanul tetszleges erforrshoz, ezt a futtatkrnyezet szigoran ellenrzi. Sajt termkek fejlesztse sorn kt platform kzl vlaszthatunk: Silverlight, illetve XNA.

16

A Windows Phone Platform Silverlight felhasznlsval ltvnyos, mdiakzpont alkalmazsokat fejleszthetnk, melyek komponensei jl integrldnak a Windows Phone Metro stlus ltvnyvilgval. A Silverlightnak ksznheten csupn a kreativitsunk szabhat hatrt a felhasznli lmnynek, felhasznli felleteknek. XNA segtsgvel menedzselt kd ktdimenzis sprite alap, illetve komoly hromdimenzis modellekre pl jtkokat is rhatunk. XNA felhasznlsval fejleszthetnk Xbox-ra, Windows-ra s Windows Phonera is jtkot, csupn kisebb mdostsokat kell vgrehajtanunk. Az XNA API szmos jtkfejlesztsben felmerl gyakori problmra (textra s modell betlts, fny s rnykhatsok, transzformcik, stb.) knl kompakt megoldst, gy a fejlesztk valban a jtk logikjra koncentrlhatnak. XNA-val a fejleszts gyors s produktv. A 7.1-es Mango opercis rendszer klnlegessge, hogy a kt technolgia kztt az tjrhatsg biztostott. gyazhatunk XNA tartalmat Silverlightos felletekbe s viszont. Windows Phone-nal ismerked fejlesztk szmra a fejlesztsi lmny olyan, mintha a .NET keretrendszeren dolgoznnak. Ennek oka az n. Base Class Library (BCL), amely a .NET platformon a jl ismert s leggyakrabban hasznlt alapknyvtrak jelents rszt tartalmazza, mint pldul szlkezels, gyjtemnyek vagy ppen a Linq. Ennek ksznheten a mr korbban elsajttott rtkes tuds hordozhat a kt platform kztt. Mg a BCL, a Silverlight, illetve az XNA ismers koncepcikat hozott t az asztali Windows-os PC-k vilgbl, addig szmos j elem is megjelent, hiszen egy j platformrl, egy mobil eszkzrl beszlnk. Ennek megfelelen menedzselt API-k biztostjk a telefon klnbz szenzoraihoz, opercis rendszerszint kpessgeihez (kapcsolatok, email klds, letciklus menedzsment) a hozzfrst. Az 1-1 brn a futtatkrnyezet felptst lthatjuk.

1-1 bra: A futtatkrnyezet felptse

Integrci a felhvel
A Windows Phone alapveten egy kliens oldali eszkz, s mint ilyen, limitlt erforrssal, szmtsi kapacitssal s tudshalmazzal rendelkezik. A felhben azonban folyamatosan fut szolgltatsok rhetk el, hogy azok a telefon tudst s kpessgeit kiterjeszthessk. rtestsek: A mai mobil eszkzk kapacitsa, az akkumultor zemideje s egyb erforrsai nem engedik meg, hogy prhuzamosan alkalmazsok tucatjai kommunikljanak klnbz szolgltatsokkal s egyb komponensekkel. A Windows Phone-ok tmogatjk az n. rtestseket (push notifications). Ezek a felhben fut szolgltatsok zeneteket kldenek a telefonok fel, ha valamilyen j informci ll rendelkezsre az alkalmazs s a felhasznl szmra. Ezek az rtestsek megjelenhetnek az alkalmazs sajt lapkin, vagy ppen kln rtestsknt is. Trkpszolgltatsok: A felhben pozcionlsi s trkpszolgltatsok is elrhetk. Ezek WiFi, cellainformcik, illetve GPS adatok segtsgvel biztostjk a pontos helymeghatrozst. 17

1. Bevezets a Windows Phone platform-ba Kzssgi hlzatok: A Windows Phone nagyon fontos rszt jelentik a kzssgi hlzatok s az integrlt lmny biztostsa az n. hubokon keresztl. Soha ne felejtsk el, hogy a telefon egy kliens, amely szolgltatsok ezreihez kpes csatlakozni, s segtsgkkel rendkvl gazdag s rtkes informcihalmazt biztostani. Xbox Live szolgltatsok: A Windows Phone kpes a felhben fut Xbox Live szolgltatsokhoz is kapcsoldni, gy nyomon kvethetjk bartainkat, sszehasonlthatjuk elrt eredmnyeiket a minkkel, zeneteket kldhetnk nekik, vagy akr otthoni Xboxunkat is vezrelhetjk telefonunkrl.

A Marketplace portlszolgltatsai
A Windows Phone Marketplace egy kzponti portl, ahova a fejlesztk elkszlt alkalmazsaikat tlthetik fel, s amelyen keresztl rtkesthetik azokat. A felhasznlk szmra ez hatalmas piactr, ahol a klnbz tartalmak s alkalmazsok kzl vlogathatnak. Regisztrci fejlesztk szmra A telefonra trtn fejlesztst megelzi a fejleszti programba trtn jelentkezs, amely egy Live ID segtsgvel az n. App Hub-on, a http://create.msnd.com cmen tallhat portlon vgezhet el. A fejleszteszkzk is errl a portlrl tlthetk le kzvetlenl. A regisztrcit s a hitelestst kveten a fejleszti kszlkek zrolst feloldhatjuk, s ennek eredmnyekppen sajt alkalmazsokat tudunk r telepteni a Visual Studio 2010 segtsgvel. Az ves fejleszti dj 99 dollr. Cserbe a publikcis lehetsgen tl szmos szolgltatst kapunk a portlon, ahol a fejleszti vezrlpulton rtkes informcikhoz, statisztikkhoz juthatunk alkalmazsainkat illeten. A Marketplace-en keresztl trtnik a szmlzs s a frisstsek kezelse is. Alkalmazsok kzzttele Az alkalmazsok, feltltsket kveten, egy hitelestsi folyamaton mennek keresztl, amely sorn a Microsoft egy szigor tesztsorozat futtatsnak segtsgvel meggyzdik arrl, hogy az alkalmazsunk stabil, nem szolgl rossz clt, tovbb kielgti az alkalmazsok ltal kvetend szablyokat. Ezek a szablyok az Application Certification Requirements for Windows Phone cm dokumentumban kerltek rgztsre. A dokumentum a kvetkez cmen rhet el: http://msdn.microsoft.com/enus/library/hh184843(v=VS.92).aspx. Miutn az alkamazsunk sikeresen tment a teszteken, egy tanstvnyt kap, ennek segtsgvel feltlthetjk a Windows Phone alkalmazs boltba, ahol az r s a rgik kivlasztsa utn az alkalmazs szles kznsg szmra vlik elrhetv.

Fejleszteszkzk
A Windows Phone-ra fejleszteni kszlk szmra fontos krds az induls kltsgvonzata. Szerencsre elmondhatjuk, hogy a fejlesztsi infrastruktra kltsge gyakorlatilag nulla. Termszetesen egy Windowst futtat PC-re szksg lesz, tovbb egy Windows Phone kszlk sem rt, br ez utbbi nem ktelez, csupn ersen ajnlott. A fejleszteszkzk a Windows Phone fejlesztk szmra ingyenesen elrhetk. Az indulshoz csupn a Windows Phone SDK 7.1-es vltozatot kell letlteni, az albbi cmrl: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27570 Az SDK a kvetkez fontosabb komponenseket tartalmazza: Visual Studio 2010 Express for Windows Phone: Kizrlag Windows Phone projektek kezelsre alkalmas, ingyenes Visual Studio 2010 vltozat, amellyel zleti clra is fejleszthetnk alkalmazsokat. Windows Phone Emulator: Fejlesztsi idben hasznlhat Windows-on fut emultor, amely a telefon legtbb kpessgt kpes emullni. Microsoft Expression Blend for Windows Phone: A Windows Phone felhasznli felletek fejlesztsvel s ptsvel foglalkoz dizjnerek s fejlesztk els szm eszkze. A Microsoft Expression Blend 4.0 termk kizrlag Windows Phone projektek kezelsre alkalmas, de teljes rtk vltozata.

18

Alkalmazs fejleszts Silverlight alapokon Amennyiben korbban vsrolt teljes rtk Visual Studio 2010 vltozattal rendelkeznk (Professional, Premium, Ultimate) a fejleszteszkzk beplnek a teleptett vltozatba.

Alkalmazs fejleszts Silverlight alapokon


Nem is olyan rgen a Windows platformra kszl alkalmazsok jelents rszt a .NET keretrendszer egyik kulcstechnolgijnak, a Windows Forms-nak a segtsgvel fejlesztettk ki. A technolgia hatkony, kiforrott s rendkvl produktv volt. Sajnlatos mdon tovbbi sorst megpecstelte sajt kpessgeinek ers korltozottsga. Az alkalmazs- s a vezrlmodell, amely a Windows Forms-ot jellemezte rendkvl rugalmatlan s merev volt. Ennek kvetkeztben nem tudott megfelelni az j ignyeknek, amelyeknek kzppontjban a modern, izgalmas s jl hasznlhat felhasznli felletek helyezkedtek el. Annak rdekben, hogy rezzk ezt a ktttsget, kpzeljk el, hogy olyan alkalmazst fejlesztnk, ahol klnbz folyamatokat s annak sttuszait kell megjelenteni. A folyamatokat egy tblzat sorai reprezentljk, a sttuszt pedig minden sorban jellje egy szzalkos rtk, melyet reprezenljunk egy ProgressBarral. A megvalsts sorn hamar belefutunk abba a rendkvl kellemetlen tnybe, hogy a Windows Forms ListView vezrlje nem tmogatja a ProgressBart, mint egy cella lehetsges elemt. Az ilyen tpus ktttsgek nagyon szk korltok kz szortottk a termk ksztinek kreativitst, jtktert. A Windows Forms maradisgnak okn a technolgia levltsra a Microsoft elindtotta az Avalon projektet, melyet nem sokkal ksbb Windows Presentation Foundation (WPF) nven ismert meg a vilg a .NET 3.0 keretrendszer megjelensekor. A WPF szmos j koncepci mellett egy nagyon fontos jdonsgot hordozott magban az j vezrlmodellt. A gondolat nagyon egyszer volt, a vezrlk alapveten tartalom jelleg vezrlk (ContentControl) s brmit tartalmazhatnak. Ennek ksznheten egy Button vezrlbe egy msik Buttont, majd abba egy DataGridet helyezhetnk el, aminek termszetesen tl sok rtelme ugyan nincs, de nagyon jl pldzza a modell rugalmassgt.

Ismerkeds a XAML-lel
Az j modell mell egy msik fontos koncepci is prosult, ez pedig a felhasznli fellet deklaratv lersa. A felhasznli felletek lersnak egyik s egyben taln legtermszetesebb mdja a ler nyelvek (Markup Language) hasznlata. Gondoljunk csak a HTML-re, melynek segtsgvel egszen klnleges webes felletek pthetk! A Microsoft az j felhasznli fellet lersra az n. XAML nyelvet vlasztotta. A XAML (eXtensible Application Markup Language) egy kiterjeszthet alkalmazsler nyelv, gy nem felhasznli fellet specifikus. Az XML egyfajta kiterjesztse egy klnleges XAML Parser-rel, melynek feladata a XAML rtelmezse s a lert objektumgrf felptse. Ez lett a WPF legjelentsebb jdonsga. A WPF megjelenst kveten a Microsoft hamarosan gy tlte, hogy a XAML alap felletek jelentik a jvt, s a webre is clszer lenne elkszteni egy WPF-hez hasonl technolgit. Ezt a technolgit ksbb Silverlightknt ismerte meg a vilg. A sors klnleges fintora, hogy az vek elteltvel a Silverlight egyre inkbb prblt megszabadulni a bngsztl s nll letre kelni. A Windows Phone f alkalmazsfejlesztsi platformja a 7.0 vltozatban s a 7.1-ben is a Silverlight. A XAML alap rendszerek komoly sikertrtnetet tudnak maguknak. Meghdtottk az asztali PC-k vilgt, a webes s intranetes krnyezetekben is komoly szerepet kaptak. Legjabban pedig klnbz mobil, illetve hordozhat eszkzkn fejleszthetnk alkalmazsokat XAML alapokon. A technolgia s a koncepci igazi bebetonozst a Windows 8 Metro stlus alkalmazsok XAML alap fejlesztsnek lehetsge jelenti.

XAML szintaktika rtkads


A XAML alapveten az XML szintaktikai elrsait kveti, illetve terjeszti ki, mint alkalmazs ler nyelv. Ha XAML-ben lerunk egy elemet (pl <Button/>), akkor abbl futsidben egy Button pldny fog elkszlni. A Button egyb tulajdonsgait, mint pldul a szlessgt vagy magassgt, esetleg a tartalmt, attribtum, illetve tulajdonsg szintaxissal lehet meghatrozni. Mg az elbbi egyszer rtkek belltsa esetn elegendnek bizonyulhat, komplexebb rtkadsoknl az utbbi mechanizmust alkalmazzuk.

19

1. Bevezets a Windows Phone platform-ba Tartalom meghatrozsa attribtum szintaxissal:


<Button Content="Hello World"/>

A fenti pldban a gomb tartalma egy egyszer string, ezrt elegend attribtum szintaxist alkalmaznunk. Tartalom meghatrozsa tulajdonsg szintaxissal:
<Button> <Button.Content> <StackPanel> <Ellipse Fill="Red" Width="10" Height="10"/> <TextBlock Text="Hello World"/> </StackPanel> </Button.Content> </Button>

A fenti pldban a Button bels tartalmt egy nmileg sszetettebb vezrlfa hatrozza meg. A Button belsejbe egy panel kerl, amely egyms al rendezi el az elemeket. A bels panelbe pedig egy piros 10 x 10-es kr, valamint a Hello World felirat kerl. Ezt a bels tartalmat attribtum szintaxissal nem lehet meghatrozni, ezrt a Content tulajdonsgot ki kell nyitni, azaz tulajdonsg szintaxissal kell belltani a tartalmat. Figyeljk meg, hogy a kr (Ellipse) s a felirat (TextBlock) sajt tulajdonsgait attribtum szintaxissal hatroztuk meg.

XAML szintaktika Prefixek hasznlata


A C#-ban vagy ppen a Visual Basic-ben megszokhattuk, hogy amikor lerjuk az objektumok nevt, akkor a megfelel nvtrre kell hivatkoznunk. Ha a Windows Phone-ra egy sajt Button vezrlt fejlesztnk, akkor azt szeretnnk helyezni a felhasznli felleten hasznlni. De honnan tudhatja a XAML Parser, hogy mi most melyik gombra gondolunk? A beptett Button rdekel minket, vagy a sajt Buttont szeretnnk felhasznlni? Erre a problmra a prefixek hasznlata jelenti a megoldst. A megfelel XAML elemeken definilnunk kell a nvtereket egy hivatkozssal, az n. Prefixszel egytt. Ezt kveten a prefix felhasznlsval knnyedn hivatkozhatjuk meg a sajt komponenseinket. Prefix definilsa sajt komponens hasznlathoz:
xmlns:myControls="clr-namespace:MyControlsLibrary;assembly=MyControlsLibrary"

A fenti pldban a MyControlsLibrary.dll llomny MyControlsLibrary nvtert rendeljk a myControls prefixhez. Sajt komponens meghivatkozsa prefixen keresztl
<myControls:MyButton> </myControls:MyButton>

A fenti pldban a myControls prefix ltal reprezentlt nvtrben tallhat MyButton komponenst hivatkozzuk meg.

XAML szintaktika Lernyelvi kiterjesztsek


Gyakran elfordul, hogy a XAML Parser szmra valami klnleges dolgot kell jeleznnk, amelyet vagy nem tudunk az XML szintaktikai eszkzeivel lerni, vagy ppensggel tl krlmnyes lenne. Az ilyen esetekben (pldul adatkts, hivatkozs statikus erforrsokra) n. Markup Extension-ket, azaz lernyelvi kiterjesztseket hasznlhatunk. Ezek sajtos szintaktikja a kvetkez:
PropertyNv="{kiterjesztsneve [hivatkozs paramterek]}"

20

Alkalmazs fejleszts Silverlight alapokon Nhny plda markup extension-kre:


<Button Style="{StaticResource buttonStyle}"/> <TextBox Text="{Binding FirstName, Mode=TwoWay}"/>

Ne aggdjunk amiatt, ha a fenti sorok egyelre semmit nem jelentenek szmunkra! A ksbbi fejezetek sorn ezek jelentsre fny derl.

XAML alap felhasznli felletek


Egy egyszer Windows Phone felhasznli felletet ler XAML rszlet anatmija:
<phone:PhoneApplicationPage x:Class="PhoneApp2.SecondPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480" shell:SystemTray.IsVisible="True"> <Grid x:Name="LayoutRoot" Background="Transparent"> </Grid> </phone:PhoneApplicationPage>

A PhoneApplicationPage objektum egy Windows Phone kpernyt reprezentl. Az x:Class tulajdonsg segtsgvel azt hatrozzuk meg, hogy melyik sajt osztly szrmazik a PhoneApplicationPage osztlybl, azaz melyik az az osztly, amelyik a kapcsold mgttes kdban megtallhat, kiegszthet. A kvetkez sorokban szmos prefix defincit ltunk, ebbl egy kiemelkedik, ahol nem szerepel prefix, csupn az xmlns definci. Ez lesz az alaprtelmezett nvtr, azaz ha prefix nlkl runk le xaml-ben egy elemet, akkor azt ebben a nvtrben fogja keresni a XAML Parser. A prefix defincik utn nhny PhoneApplicationPage tulajdonsg kerl belltsra, mint a betkszlet tpusa, mrete, illetve az eltr szne. Ezek rendszerszint belltsokra (n. erforrsokra) hivatkoznak. A kvetkez kt tulajdonsg azt hatrozza meg, hogy az alkalmazs milyen orientcikat tmogat (SupportedOrientations) s mi az alaprtelmezett orientci (Orientation). A d prefixszel elltott belltsok egytl egyig a tervezfellet szmra meghatrozott rtkek, futsidben nem jtszanak szerepet. Az mc:Ignorable paramter azt hatrozza meg, hogy a d prefixet nem kell figyelembe venni futsidben, ezt kizrlag a tervezeszkz tartja szmon. A fenti SystemTray.IsVisible tulajdonsg hatrozza meg azt, hogy a fels rendszerinformcis sv (akkumultor tltttsg, ra, stb.) ltszik-e az alkalmazsban, vagy elrejtjk. Vgl a PhoneApplicationPage elem kerl definilsra, mr csak a benne lev tartalom azaz az oldal tartalma a krdses. Jelen esetben egyetlen Grid panel tallhat benne, amelyen transzparens htteret hatroztunk meg, tovbb a panel neve LayoutRoot lett. De mi az az x prefix? Az x:Class-nl is feltnt mr korbban. Az x prefix a XAML nyelv sajt nvtert reprezentlja. Azaz, ha valami XAML-specifikus dologra van szksgnk, akkor azt a XAML nvtrben tallhatjuk meg, amelyhez az x prefix kerlt hozzrendelsre.

21

1. Bevezets a Windows Phone platform-ba

Hello Windows Phone


Egyetlen valamireval fejleszt sem vghat bele egy j technolgival val ismerkedsbe anlkl, hogy el ne ksztse r a dediklt Hello World alkalmazst. Ksztsk ht el els Windows Phone alkalmazsunkat! 1. Hozzunk ltre egy j Windows Phone alkalmazst! Kattintsunk a File menre, vlasszuk ki a New Project parancsot! Az elrhet alkalmazs tpusok listjbl vlasszuk a Windows Phone Application sablont! A projektet nevezzk el HelloWindowsPhone-nak, a tbbi bellts alaprtelmezett rtkt hagyjuk meg (1-2 bra)! Kattintsunk az OK gombra! A dialgus ablakban lthatjuk, hogy szmos klnbz projektsablon ll rendelkezsnkre. Ezekkel a ksbbi fejezetek sorn rszletesebben is megismerkednk majd. Egyelre gondoljunk ezekre gy, mint klnbz alkalmazs tpusok, illetve klnbz felptssel rendelkez alkalmazsok specilis vltozatai.

1-2 bra: j projekt ltrehozsa 2. A kvetkez lpsben a Visual Studio megkrdezi tlnk, hogy melyik opercis rendszer vltozatra szeretnnk fejleszteni. Gyzdjnk meg rla, hogy a Windows Phone OS 7.1 van kivlasztva, majd kattintsunk az OK gombra! 3. Vegyk szemgyre a Visual Studio ltal ltrehozott elemeket! A Solutions Explorer ablak tartalma az 1-3 brn lthat.

1-3 bra: A projekt felptse

22

Hello Windows Phone A HelloWindowsPhone projekt elemeinek tartalmt az albbi tblzat mutatja be: Elem neve Properties References App.xaml (App.xaml.cs) ApplicationIcon.png Background.png MainPage.xaml (MainPage.xaml.cs Elem jelentse Az alkalmazs tulajdonsgait s belltsait tartalmaz llomnyok Hivatkozott egyb knyvtrak Az alkalmazst reprezentl objektum s a mgttes kdja A lapkhoz tartoz kp Az alkalmazs httrkpe Az alkalmazs foldala s a kapcsold mgttes kd

SplashScreenImage.png Indulskor megjelen, tltsi id alatt lthat kp A Properties alatt tallhat WMAppManifest.xml fjl megr kln egy kis magyarzatot:
<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2009/deployment" AppPlatformVersio n="7.1"> <App xmlns="" ProductID= "{9bb8c371-293f-4726-a4ba-5b2e2efb152d}" Title="HelloWindowsPhone" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal" Author="HelloWindowsPhone author" Description="Sample description" Publisher="HelloWindowsPhone"> <IconPath IsRelative="true" IsResource="false">ApplicationIcon.png</IconPath> <Capabilities> <Capability Name="ID_CAP_GAMERSERVICES"/> <Capability Name="ID_CAP_IDENTITY_DEVICE"/> <Capability Name="ID_CAP_IDENTITY_USER"/> <Capability Name="ID_CAP_LOCATION"/> <Capability Name="ID_CAP_MEDIALIB"/> <Capability Name="ID_CAP_MICROPHONE"/> <Capability Name="ID_CAP_NETWORKING"/> <Capability Name="ID_CAP_PHONEDIALER"/> <Capability Name="ID_CAP_PUSH_NOTIFICATION"/> <Capability Name="ID_CAP_SENSORS"/> <Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/> <Capability Name="ID_CAP_ISV_CAMERA"/> <Capability Name="ID_CAP_CONTACTS"/> <Capability Name="ID_CAP_APPOINTMENTS"/> </Capabilities> <Tasks> <DefaultTask Name ="_default" NavigationPage="MainPage.xaml"/> </Tasks> <Tokens> <PrimaryToken TokenID="HelloWindowsPhoneToken" TaskName="_default"> <TemplateType5> <BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImageURI> <Count>0</Count> <Title>HelloWindowsPhone</Title> </TemplateType5> </PrimaryToken> </Tokens> </App> </Deployment>

A fenti XML kdrszletben jl lthat, hogy az alkalmazs alapbelltsai itt kerlnek meghatrozsra: a httrkp, az ikon, az alkalmazs felirata, stb. A legrdekesebb szekci azonban a Capabilities elem s gyerekei. Ezeknek a gyerekelemeknek a felvtelvel hatrozhatjuk meg, hogy az alkalmazsunk a telefon

23

1. Bevezets a Windows Phone platform-ba mely kpessgeihez fr hozz, mit kpes kihasznlni. Biztonsgi szempontbl rdemes gyelni arra, hogy itt csak azok az elemek maradjanak meg, amelyeket tnylegesen is hasznlunk. 4. Kattintsunk dupln a MainPage.xaml llomnyra, majd vegyk szemgyre annak tartalmt:
<phone:PhoneApplicationPage x:Class="HelloWindowsPhone.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True"> <!--LayoutRoot is the root grid where all page content is placed--> <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel contains the name of the application and page title--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - place additional content here--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid> </Grid> <!--Sample code showing usage of ApplicationBar--> <!--<phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/> <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/> <shell:ApplicationBar.MenuItems> <shell:ApplicationBarMenuItem Text="MenuItem 1"/> <shell:ApplicationBarMenuItem Text="MenuItem 2"/> </shell:ApplicationBar.MenuItems> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar>--> </phone:PhoneApplicationPage>

A PhoneApplicationPage belltsok mr korbban tisztzsra kerltek, ezrt koncentrljunk most a LayoutRoot elnevezs Grid panel tartalmra! Ha sok benne az ismeretlen elem, ne aggdjunk, a ksbbi fejezetekben azokat rszletesen bemutatjk! Az rdekes rsz az ApplicationTitle s PageTitle nvvel rendelkez TextBlock vezrlk Text tulajdonsgai. A Text tulajdonsg hatrozza meg a felirat tartalmt. Mdostsuk az rtkeket a kvetkez mdon:
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="MY FIRST APPLICATION"

24

Hello Windows Phone

Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="hello page" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel>

5. Keressk meg a ContentPanel elnevezs Grid panelt! Ennek a belseje fogja reprezentlni az oldal tartalmt. Helyezzk el benne az albbi kdrszletet:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Button Content="Greet Me" Click="Button_Click" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid>

Ezzel egy kzpre igaztott gombot helyeztnk el, melyen a Greet Me felirat tallhat. Ezen fell a Click esemnyre is feliratkoztunk egy Button_Click esemnykezel metdussal. 6. Kattintsunk az egr jobb gombjval a Button_Click szvegre, s vlasszuk a Navigate To Event Handler parancsot! Ennek hatsra a Visual Studio megnyitja a MainPage.xaml.cs kdllomnyt, s a megfelel esemnykezel metdusra navigl. Egsztsk ki a kdot, az albbi mdon:
private void Button_Click(object sender, RoutedEventArgs e) { MessageBox.Show("Windows Phone says hello!"); }

7. Futtassuk az alkalmazst! A Visual Studio fels svjban, kzvetlenl a men alatt lthatjuk a Windows Phone Emulator belltst. Ez azt jelenti, hogy a Visual Studi alaprtelmezett mdon az emultoron futtatja majd az alkalmazst. Ha az emultor mg nem fut, akkor indt egy jat, telepti r, majd futtatja rajta az alkalmazst. Figyelem: Az emultort csak egyszer kell elindtani, ha vgeztnk a futtatssal, nem rdemes lelltani azt, hanem a Visual Studiban rdemes a futst megszaktani. Az emultor elsre lassabban indul el, de egyetlen fut pldnyon brmennyi tesztfuttatst indthatunk! A lenyl menben a Windows Phone Device-t is kivlaszthatjuk, ha szeretnnk kzvetlenl egy valdi eszkzn futtatni az alkalmazst. Az les eszkzn val tesztels esetn a kvetkez feltteleknek rendelkezsre kell llniuk: Zune Desktop alkalmazs fut a httrben A telefon ssze van ktve USB adatkbelen a szmtgppel A telefonon a lockscreen fel van oldva

8. A futtats megkezdshez kattintsunk a Debug menre, majd vlasszuk ki a Start Debugging menpontot! 9. Teszteljk az alkalmazst! Kattintsunk a Greet Me gombra! Az eredmny az 1-4 brn lthat.

25

1. Bevezets a Windows Phone platform-ba

1-4 bra: A Hello Windows Phone alkalmazs futs kzben

sszefoglals
Ebben a fejezetben megismerkedhettnk a Windows Phone alkalmazsplatformmal. Betekintst nyerhettnk a platform legfontosabb ptelemeibe, a Silverlight s a XAML nyelv alapjaiba. Bemutatsra kerlt a fejleszteszkz, valamint megrtuk letnk els Windows Phone alkalmazst, amelynek sorn rszletesen megvizsgltuk, hogyan is pl fel egy Windows Phone projekt, melyek a legfontosabb elemei, belltsai. A kvetkez fejezetekben ezt a tudst mlytjk el, hogy vgl professzionlis alkalmazsokat tervezhessnk s fejleszthessnk.

26

2. Felhasznli lmny tervezse Windows Phone-on


A trtnelem sorn vllalkozsok ezrei kerestk a siker zlogt jelent receptet. Ilyet senki nem hozott nyilvnossgra, de szmos kulcsfontossg hozzvalt sikerlt azonostani a sikerhez vezet ton. Az vszzadok sorn a piacok taln legfontosabb mozgatrugjnak az innovci bizonyult. Az jdonsg alkotsnak kpessge felbecslhetetlen rtk kincsnek szmt az informatika vilgban is. Az elmlt vekben mamutokat lthattunk visszasllyedni a kzpszersgbe, ismeretlen, vagy ppen csd kzeli cgeket mamutokk vlni. Ennek az izgalmas s rdekes hullmvastnak az egyik legfbb oka az innovci (vagy ppen annak hinya volt), amely az elmlt vekben egy j terletre gyrztt be. A megszokott funkcionlis innovci mellett jabb irnyt vett, a felhasznlk, az emberek fel. Ennek az innovcis hullmvastnak a legmarknsabb terlete ppen a mobilpiac. Legtbben taln emlksznk mg a fl tgla mret, telefonlsra ppen csak alkalmas kszlkek megjelensre, majd az ezt kvet funkcionlis innovcira, melynek sorn a telefonok egyre okosabbak lettek. Egyre komplexebb szoftverek s opercis rendszerek jelentek meg, melyeknek ksznheten ezek a szinte mr szmtgpnek nevezhet kszlkek egyre inkbb eltvolodtak a felhasznlk gondolkodstl, vals ignyeitl. Nhnyan azonban sikeresen felismertk, hogy az okostelefonok szerept s jelensgt alapjaiban jra kell gondolni s tervezni! Ez a piac ms, mint a hagyomnyos rtelemben vett IT szektor, ahol szmos esetben a felhasznlk rknyszerlnek a lehetsges s elrhet megoldsokra. Ezen a piacon, a fogyaszti termkek piacn a felhasznl diktl! Az ignyei az elsdlegesek, s az a piaci szerepl lehet a nyer, az rhatja a kvetkez sikertrtnetet, aki felismeri ezt az j helyzetet. A Windows Phone tkletes pldja ennek a trtnetnek. A Microsoft korbbi okostelefon rendszert, a Windows Mobile-t htrahagyva, alapjaiban gondolta jra, hogyan lpnek interakciba a felhasznlk telefonjaikkal, hogyan s mire hasznljk azt. Ennek az jraindtsnak eredmnyekppen szletett meg a Windows Phone 7.

A Windows Phone jelensg


Ebben a trtnetben nem a Microsoft a felfedez, sokkal inkbb az Apple s a Google, akik komoly sikerre vittk sajt iOS, illetve Android alap mobil rendszereiket. A Microsoftnak ilyen rtelemben egy markns piacra kellett belpnie, s egy ilyen belps sohasem egyszer, klnsen nem ilyen versenytrsak mellett. A sikerhez azonban nem elg egy j msolat elksztse. A Microsoft jl tudta, hogy ezttal az innovtor szerept kell magra vllalnia, ezrt a legfontosabb terleten, a felhasznli lmny tekintetben a versenytrsaktl merben eltr, ms rendszert alkotott. Olyan kszlkkel akart piacra lpni, amely jl elklnl a tbbi konkurens termktl, s egy j szellemisget tkrz. A 2-1 brn lthat a Windows Phone, egyb okostelefonok trsasgban. A Microsoft termke valban jl megklnbztethet, egyedi megjelenssel rendelkezik.

27

2. Felhasznli lmny tervezse Windows Phone-on

2-1 bra: Windows Phone 7 a versenytrsak mellett

Ikonografikus s infografikus felletek


Az egyedisg kulcsa egy j koncepci, az n. infografikus fellet. Mg a versenytrsak termkei rendre a megszokott s egybknt nagyon jl bevlt ikonografikus megjelenst rszestik elnyben, addig a Microsoft j utat vlasztott. Azokon a terleteken, ahol a felhasznlk kiszolglsa, a tartalom, az informci tads, a jl hasznlhatsg klns jelentsggel br, egyre nagyobb teret kapnak az infografikus felletek. A weben, a reklm s a mdia vilgban ez az irnyzat mr j ideje elsbbsget lvez. Az infografika az informcikzls igazi mvszete. Ez persze nem jelenti azt, hogy azok a versenytrsak, akik az ikonografikus felletet rszestik elnyben, rossz ton jrnnak. Ikonografikus krnyezetben s koncepcival is rendkvl jl hasznlhat, izgalmas s szp felleteket kszthetnk. A Microsoft ltal vlasztott t kimondja, hogy nem az alkalmazs s a vezrlk kerete vagy a csicsa az, ami meghatrozza egy alkalmazs jellegt, hanem a benne lev tartalom. (A csicsa jelen esetben semmikpp sem pejoratv rtelemben rtend.) A 2-2 brn egy infografikus, a 2-3 brn pedig egy ikonografikus fellet lthat. Ez az j gondolkodsmd egy igen izgalmas s markns design nyelv ltrejttt eredmnyezte.

2-2 bra: Infografikus megjelens

2-3 bra: Ikonografikus megjelens

28

A METRO Dizjn Nyelv

A METRO Dizjn Nyelv


Az infografikus megkzelts szellemben a Microsoft kialaktotta sajt n. dizjn nyelvt, amely a Windows Phone 7-es kszlkeken jelent meg elszr. Azta ez a megjelens gyakorlatilag a Microsoft sszes termkben visszaksznt, rohamtempban vette t a staftt a rgebbi felhasznli felletektl, olyan termkekben, mint pldul az Xbox360 Dashboard vagy ppen az j Windows 8 UI. A dizjn nyelv csupn az alapvet szellemisget hatrozza meg, nhny alapvetst fektet le. Nzzk meg ezeket kzelebbrl!

Ismers megjelens
A felhasznli fellet nem ms, mint a kommunikcis csatorna a felhasznlkkal, ezen keresztl adhat tudtukra, hogyan is mkdik az alkalmazs. A felhasznlk nehezebben azonosulnak mindennel, ami j s idegen szmukra. Az letnk s a krnyezetnk tele van olyan elemekkel, melyeket jl megszoktunk, ismersek s knnyen rhetek: jelzsek s apr infografikk a reptereken, a metr aluljrkban, a plyaudvarokon, a bankokban, az utcn. A Metro is ebbl az eszkztrbl mert ikonok, jelzsek, kpek, feliratok alkalmazsakor, amikor az elsdleges szempont a tjkozds, az egyrtelm vizulis kommunikci s az rthetsg. A 2-4 brn lthatjuk a Metro dizjn forrselemeit.

2-4 bra: Metro dizjn forrsok

Tiszta s pehelyknny
A felhasznli felletnek gyorsnak s vlaszkpesnek kell lennie, de ugyanakkor pehelyknnyed mkdst s rzst kell biztostania. A bonyolult felletek, a nehzkes megjelens csupn a komplexitshoz s a zsfoltsg rzshez jrulhatnak hozz. A Metro fellet knnyed, letisztult s nylt, btran alkalmazza a szabad s res terleteket, valamint clorientlt, ahogyan ezt a 2-5 bra is tkrzi.

2-5 bra: Letisztult, szabad terletben gazdag megjelens

29

2. Felhasznli lmny tervezse Windows Phone-on

Digitlis eredetisg
Nincs szksg arra, hogy msnak mutassuk az eszkzt, mint ami valjban. Legynk szintk, ez egy digitlis termk! Ma mr nincs szksg arra, hogy egy gombot 3D-snek tntessnk fel ahhoz, hogy jelezzk, a gomb kattinthat! Nincs szksg flsleges grafikai elemekre, legynk egyszerek, letisztultak s modernek, koncentrljunk a lnyegre!

2-6 bra: Digitlis megjelens

Gynyr tipogrfia
Flsleges grafikai elemek nlkl is kszthetnk rendkvl zlses s gynyr felhasznli felleteket. Koncentrljunk a szp bettpusokra, figyeljnk oda a mretekre, az egyenslyra, a hangslyozsra, a j vizulis hierarchira! Legyen a tartalom maga gynyr! Megfelel bettpusok s egyensly alkalmazsa mellett egyetlen fehr paprlap is lehet rendkvl eszttikus s vonz.

llandan mozgsban
A mozgs, az animcik jelentik a felhasznlk s az eszkzk kztti ktirny interakci gerinct. Az rintkijelznek ksznheten termszetes mozdulatokkal vezrelhetjk az alkalmazsainkat. A felhasznlk szmra azonnal jeleznnk kell, hogy mveleteik, tevkenysgk milyen hatssal br a felletre nzve. A vizulis visszajelzs elsdleges eleme az animci. Gyors, knnyed animcikkal pillanatok alatt megtanthatunk brkit, hogyan hasznlja az alkalmazsunkat. Az animcik nem nclak, hanem tant, informatv jellegek. A jl kidolgozott animcik meghatrozzk az alkalmazs ritmust s dinamikjt is.

A tartalom az elsdleges
A felhasznli lmnyt tervez szakrtk krben j ideje elfogadott s hangslyozott elv a Content is King, azaz a tartalom mindenekfelett elv. Klnsen fontos szerepet jtszik ez a gondolat rintkpernys alkalmazsok tervezsekor. A felhasznlk ezeket az alkalmazsokat rintssel (tapogatssal) fedezik fel, szavakkal, kpekkel, videkkal prblnak interakciba lpni. Ilyenkor a felleten a keret, a tl sok flsleges, ncl vizulis elem gtolja a felhasznl szabad mozgstert, a felfedezst, megrtst az alkalmazs mkdsre vonatkozan. Az egyik legfontosabb irnyelv a Metro dizjnban a tartalom elsdlegessge a kerettel szemben. Koncentrljunk a tartalomra, hagyjuk el a flsleges keretet, s ptsnk miniml-dizjnnal rendelkez, letisztult, tgas felhasznli felleteket!

30

Design vezrelt fejleszts

2-7 bra: Tartalom a kzppontban A Metro dizjn nyelv, melynek elveit szem eltt tartva professzionlis, innovatv, de ugyanakkor konzisztens, j genercis felleteket alakthatunk ki, mra a Microsoft sajt termkeinek elsdleges dizjnjv ntte ki magt. A Windows Phone 7 az els olyan termk, amely alkalmazza ezeket az elveket minden szoftverben, kezdve a jtk - s szrakozscentrikus Xbox Live Hub-bal, a szocilis hlkat sszefog People Hub-on t, egszen a professzionlis alkalmazsokig, mint pldul a Office termkcsald (2-8 bra).

2-8 bra: Metro-s megjelens alkalmazs tpustl fggetlenl

Design vezrelt fejleszts


A Windows Phone 7 alkalmazsfejleszts eszencija nmileg eltr az eddig megszokottl. Ebben az esetben ugyanis a fogyaszti piacra fejlesztnk, ahol felhasznlk ezrei, remlhetleg tzezrei fogjk hasznlatba venni s nyzni alkalmazsainkat. Ennyi klnbz ember ignyeinek kielgtse igen komoly s nehz feladat. Nem vletlen, hogy komoly szakmk ltrejttt eredmnyeztk ezek a krlmnyek. El kell fogadnunk, hogy az esetek tbbsgben nem bzhatjuk a fejlesztre a felhasznli lmny kialaktst, hanem azt a megfelel szakembereknek kell kezkbe vennik. k a User Experience Designerek. A User Experience Design (UXD), vagyis a felhasznli lmny tervezse mint tevkenysg szmos terletet foglal magba. Komolyabb rendszerek ptsekor ezekre a terletekre kln specializldott szakembereket alkalmaznak. Annak az eslye azonban, hogy egy teljes UXD csapatot alkalmazhatunk mobil alkalmazsaink fejlesztsnl, elg csekly. Elkeserednnk azonban nem rdemes, kell

31

2. Felhasznli lmny tervezse Windows Phone-on odafigyelssel mi magunk is kellemes lmnyt alakthatunk ki. Ehhez azonban tisztban kell lennnk a kulcsfontossg terletekkel!

Tartalom s informcis architektra


A Metro egsz szellemisge a tartalom kr pl, a tartalom az, amelynek ki kell emelkednie, annak kell ragyognia. Az alkalmazs kzppontjban a tartalom van, ezrt ltfontossg, hogy gondosan elemezzk, hogy mit s hogyan mutatunk meg a felhasznlnak! Ne a vizualitsbl induljunk ki, hanem az rtkbl, az informcibl! Dntsk el, melyek a legfontosabb elemek, melyeket lttatni kell a felhasznlval, mi a legrtkesebb informci! Miutn ez a tuds mr a birtokunkban van, nekillhatunk megtervezni, hogy miknt reprezentlhatjuk ezt ltvnyosan. A weben tmegvel megtallhat infografikai pldk komoly segtsget nyjthatnak. Szintn sok tletet merthetnk egyb sikeres alkalmazsokbl. Hasznljuk btran a vizulis eszkzket, grafikonokat, infografikkat! Vgig tartsuk szem eltt, hogy a tartalom megfelelen tlalva, priorits s rtk szerint kerljn megjelentsre (2-9 bra)!

2-9 bra: Tartalom meghatrozsa Metro elvek szerint

Hasznlhatsg s ergonmia
A felhasznli lmny tervezsnek msik fontos terlete az ergonmiai krdsek tisztzsa, a hasznlhatsg biztostsa. Ez igen tg tmakr, amelyben a vizulis hierarchitl kezdve a navigcin t, egszen az apr rszletekig, sok mindent gondosan meg kell terveznnk. A legfontosabb dolog, hogy a felhasznl fejvel gondolkodjunk, s ennek megfelelen alaktsuk ki a felhasznli felletet! Sajnlatos mdon az objektivitsukat mg a gyakorlottabb szakemberek is igencsak nehezen tudjk megrizni. Ha elg sokat foglalkozunk a sajt termknkkel, elbb-utbb nem vesszk szre benne a finomsgokat, rosszabb esetben a nagyobb bajokat sem. Ezrt a legfontosabb a kezd ergonmus szmra, hogy tesztelje le, amit csinl. Rendkvl sokat segthetnek az n. folyos tesztek: kapjunk el valakit a folyosn s krjk meg, hogy hajtson vgre valamit az alkalmazsunkkal. Teszteljnk minl tbbet, figyeljk a felhasznlink gyetlenkedst, krjk ki msok vlemnyt, s folyamatosan finomtsuk a felhasznli felletnket!

Eszttika s vizulis lmny


A dizjnerek fontossga soha sem volt ktsges. A fogyaszti termkek piacn azonban elengedhetetlen a szp, eszttikus alkalmazs, a kiemelked vizulis lmny. Ne essnk tvedsbe! Az a gyakorlat, hogy a Metro dizjn elveit betartjuk, s egy fekete-fehr alkalmazst ksztnk, nem elegend. A kzpszersgbl csak gy emelkedhetnk ki, ha maradand lmnyt nyjtunk! Sok mindenre sajnlhatjuk az erforrsainkat, a vizulis dizjnra nem.

32

Csinld magad!

2-10 bra: Dizjn alkalmazsa a tartalom fltt

Csinld magad!
A dizjn-vezrelt tervezs legfontosabb eleme maga a tervezsi folyamat. Szmtalan szoftver szenved a dizjn s a UI tervek hinya kvetkeztben elll kosztl. A szveges specifikci, a hasznlati esetek alapjn trtn fejleszts nem visz kzelebb a j felhasznli lmnyhez, helyenknt mg a szoftver s a fellet instabilitshoz is hozzjrulhat.

A dizjn szrakoztat!
Tervezznk magunk! Csupn hrom dologra van szksgnk a munkhoz! Paprra, ceruzra s arra, hogy ne munknak fogjuk fel, amit csinlunk. A dizjn szrakoztat, az tletelsrl szl. Az egyik legizgalmasabb pillanat s folyamat, amikor az alkalmazs krvonalazdni ltszik. Rajzols, illetve az interakcis folyamat vgiggondolsa kzben azonnal megmutatkoznak a rossz koncepcik, a hibs gondolatok. Az tletels, a brainstorming hozzjrul ahhoz, hogy egyre jobb s minsgibb termk szlessen.

Innovci tervezs kzben


Amikor az alkalmazs megjelenik a szemnk eltt, amikor a funkcik, az tletek zporoznak, szletnek azok a gondolatok, amelytl a termk igazn innovatv lehet. Ezek azok az rk, napok, amelyek meghatrozzk, hogy az elkvetkez hnapok kemny munkjnak eredmnye gymlcsz lesz vagy ppen csfos buks. rjuk le az tleteket, semmit se zrjunk ki! A csoportos tletels fantasztikus eredmnyekre vezethet. Gondolataink rendszerezshez nagy segtsget nyjthatnak a klnbz mindmapping szoftverek.

A problma megrtse
Mikzben a tervezs zajlik, a felhasznli felletek plnek, s az innovatv gondolatok szletnek, egyre jobban megrtjk a problmakrt. Ez nagyon fontos mellkhatsa a tervezsi folyamatnak. Sokkal jobban tltjuk a feladatot, azt hogy a felhasznlknak - mind a funkcik, mind a felhasznli fellet tekintetben hol helyezkednek el a prioritsok s a slypontok. Idkzben nem rt jra s jra vgigszaladni a terveken s jrartkelni, mi is az, amit ptnk, s hogyan szolglhatja a legjobban a felhasznl ignyeit.

Magasabb termkminsg
A pontos UI tervezs komoly elnye, hogy a fejleszts sorn sokkal egyrtelmbb, hogyan alakulnak majd a felletek, az jratervezs minimlis lesz, s ennek eredmnyekppen jval kevesebbet fogunk hibzni a fejleszts alatt. Azok a termkek, melyeknek a felhasznli fellett elre megterveztk, sokkal jobb minsgek, mint az ad-hoc, evolcis felhasznli fellettel rendelkez trsaik.

33

2. Felhasznli lmny tervezse Windows Phone-on Amennyiben a felhasznli fellet tervezst formlis eszkzkkel tmogatni kvnjuk, hasznlhatunk erre specializldott eszkzket is, mint pldul az Expression Blend Sketchflow.

Tervezs Sketchflow-val
A Microsoft Expression Blend for Windows Phone termk rendkvl hatkony eszkz. Ez a fejleszteszkz Windows Phone fejlesztshez ingyenesen elrhet. A felhasznli fellet vgleges kialaktsban, a hatkony s gyors munkban elengedhetetlen szerepe van. Az Expression Blend egyb vltozataiban lehetsgnk van n. Sketchflow projektek ltrehozsra is. Ezek a projektek kizrlag sketchek, vzlatok, dinamikus prototpusok ksztsre alkalmasak. Windows Phone fejlesztshez elrhet a Codeplex-en, Sketchflow-s Projekt sablon a Blend-hez (http://wp7sketchflow.codeplex.com/), melynek segtsgvel Windows Phone alkalmazsok prototpust kszthetjk el. (2-11 s 2-12 brk)

2-11 bra: Sketchflow-val tervezett dinamikus prototpus

2-12 bra: Sketchflow navigcis trkp 34

lmny vagy alkalmazs Sketchflow-t hasznlva akr sajt magunk szmra, akr gyfeleink szmra egyrtelmen kommuniklhatjuk, miknt fog mkdni az alkalmazsunk. A Sketch projektek tervezse elssorban a felhasznli lmny tervezsrl szl, a funkcik, a logikus s helyes mkds az elsdleges. Azaz ebben a fzisban ergonmiai szempontokat vesznk figyelembe. Papralap tervezsnl rdemes lehet kls sablonokat felhasznlni. Pldul: a Windows Phone 7 Sketch Padet (http://www.uistencils.com/products/windows-phone-sketch-pad) vagy a Windows Phone 7 Sticky Padet (http://www.uistencils.com/products/windows-phone-sticky-pad).

lmny vagy alkalmazs


Mobilalkalmazs boltok nem olyan rgta lteznek, de mr megjelentek olyan tanulmnyok, melyekben azt elemzik, hogy az alkalmazsok letciklusa hogyan alakul. ltalnos mintaknt azonostottk, hogy az alkalmazsok mindssze 10%-a ri meg a hasznlatbavtelt kvet 100-ik napot. Az alkalmazsok nagy rszt a letltst kvet pr napban a felhasznlk elhagyjk. Ennek rszben a temrdek egy funkcis alkalmazs az oka, amelyeknek nem cljuk a felhasznli bzis kialaktsa, csupn az egyszeri letlts. A legsikeresebb alkalmazsok amelyek folyamatosan a top 50-ben szerepelnek sok energit fektetnek felhasznli bzisuk megtartsba s kielgtsbe. Hogyan rdemes ht nekillnunk az alkalmazs megtervezsnek? Windows Phone alap rendszerek esetn egy klnleges koncepcival gazdgabbak lehetnk. A konkurens okostelefon gyrtk az alkalmazsokra sz szerint alkalmazsknt, app-knt gondolnak. Windows Phone alatt azonban nem csupn egyszer alkalmazsokrl van sz, sokkal inkbb integrlt lmnyrl. Ahhoz, hogy kiemelked lmnyt nyjtsunk, nhny dolgot szem eltt kell tartanunk!

Ismerjk meg a felhasznlinkat!


Az alkalmazs fejlesztsekor a clkznsg megvlasztsa s azonostsa kulcsfontossg. A Metro Design kialaktsakor a Microsoft is meghatrozta sajt clkznsgt kt n. perszna definilsval. k Anna s Miles (2-13 bra).

2-13 bra: A Windows Phone 7 tlagos felhasznli Anna sikeres PR szakrt s elfoglalt fiatal anyuka, Miles pedig ptsz sajt vllalkozsban. A Windows Phone 7 tervezsekor az UX csapat ezt a kt fiktv szemlyt hasznlta a felhasznli ignyek meghatrozsban, pontos definilsban. Sajt alkalmazsunk tervezsekor is kiemelked szerepe van a clkznsg pontos meghatrozsnak. Knnyebb s preczebb a tervezs minden fzisa, amennyiben

35

2. Felhasznli lmny tervezse Windows Phone-on megszemlyestjk a jellemz felhasznlinkat. A korosztly, a nem, a kzs jellemzk meghatrozsa jelentsen leegyszerstik a tervezs folyamatt.

Relevns tartalom
Az alkalmazsok lettartamt s letciklust vizsgl tanulmnyokban a legtovbb l alkalmazsok jellemzen a sport- s hrkzpont alkalmazsok. Friss s rtkes tartalom, jdonsg szolgltatsa nlkl szinte lehetetlen a felhasznlinkat visszavonzani. A felhasznli kr szmra rtkes s rdekes tartalmat prbljuk szolgltatni a lehet leggyakoribb rendszeressggel!

Szemlyes alkalmazsok
Az ember szmra a legrdekesebb sajt maga. Azok az alkalmazsok, amelyek rla szlnak, az ignyeirl, amelyek vele foglalkoznak, amelyek gy tesznek, mintha szinte csak neki rdtak volna, sokkal sikeresebbek. Nagyon j plda erre az Amazon alkalmazsa, illetve weboldala: relevns, szemlyes, szemlyre szabott, napraksz tartalom s ajnlatok. Minl inkbb a felhasznl kpre tudjuk formlni az alkalmazst, annl nagyobb sikerre szmthatunk!

2-14 bra: Szemlyes alkalmazs (Facebook)

Hasznos, jl hasznlhat, kvnatos


A tkletes alkalmazs hasznos, a felhasznl szmra rtkes funkcionalitssal br, knnyen hasznlhat s egyszeren tanulhat. Jl integrldik az opercis rendszer megszokott jellemzivel (pl. navigci), s kvnatos, j rzs hasznlni. Ezek a tnyezk egyttesen fektetik le azokat a jellemzket s alapvetseket, melyek segtsgvel j esllyel npszer s kzkedvelt alkalmazst kszthetnk felhasznlink krben.

Gyakorlati Dizjn
Mozgs s animci
A Mozgs jelentsge
A mozgs s az animci tbbrl szl, mint objektumok folyamatos tpozicionlsrl. Windows Phone esetn a mozgs s az animci a legfontosabb visszajelzse annak, hogy a felhasznli interakcinak virtulis rtelemben vett fizikai hatsa van. A mozgs s az animci minsge s jellege hatrozza meg elssorban, hogy a felhasznl mennyire rzi folyamatosan vlaszra ksznek az alkalmazst. A gyors, sima s knnyed animcik ezt az rzetet keltik, mg a lass, nehzkes, netn akadoz animcik nagyban rontjk a felhasznli lmnyt. A Windows Phone alkalmazsok felhasznli felletn alkalmazott mozgsokat kt rszre rdemes bontani: 36

Gyakorlati Dizjn tmenet (transition): Vizulis visszajelzs arrl, hogy egyik nzetrl msik nzetre vltunk. Az tmeneteket a felhasznl idzi el. Animci: Vizulis visszajelzs, melynek forrsa nem felttlenl felhasznli tevkenysg (pldul rtestsek).

A mozgsok tervezsnl fontos figyelembe venni, hogy azok ne nclak legyenek, mindig valamilyen fontos clt szolgljanak, amely lehetleg segtse a felhasznl megrtst az alkalmazs mkdst illeten. rints nlkl, fontos informcik kzlse (pl. rtestsek, l lapkk) Felhasznli teveknysghez kapcsold vizulis visszajelzsek (pl. gombnyoms, navigci) Tant jelleg, megrtst segt animcik (pl. egy kp a helyrl kerl kinagytsra rints hatsra, majd bezrskor oda kerl/zsugorodik vissza)

A mozgs mint lmny


A mozgs a felhasznli lmny kialaktsban kulcsfontossg szerepet jtszik. A mozgs kellemes a szemnek. Nemcsak tant hatsa van, de szvesen nzzk, jtszunk vele. Az rintkpernys fellet a legtbb ember szmra szrakoztat s rdekes. A mozgs segthet a teljestmny-problmk palstolsban. Az adatok betltse, az informci megjelentse okozhat nmi ksleltetst. tmenetek bevezetsvel elrejthetjk ezt az tmeneti idszakot, mg anlkl azonnali nzetvlts esetn esetleg res kperny fogadhatja a felhasznlt. A mozgs karaktert klcsnz az alkalmazsnak. A gyors s sima animcik azt az rzst keltik a felhasznlban, hogy az adott pillanat s az adott hely az, ami szmt: koncentrljunk a jelenre, koncentrljunk az lmnyre. A mozgs konzisztens mkdshez vezethet. Ha az tmeneteinket gyesen s egysgesen alaktjuk, akkor az alkalmazst a felhasznl konzisztensnek fogja tallni, s nagyobb biztonsggal fog a kpernyk kztt naviglni, magabiztosabban fogja az alkalmazst hasznlni. A mozgs elegancit klcsnz az alkalmazsnak. Nem titok, a jl megtervezett szp animcik eszttikai lmnyt biztostanak az alkalmazs felhasznli szmra.

Windows Phone 7 specifikus komponensek tervezse


A szpsg s a konzisztents kinzet a mobil alkalmazsok integrns rsze. A teljes sszkpet szmos komponens egytt hatrozza meg. A Start lapka, a Splash kperny, ikonok, vezrlk, melyek az opercis rendszerben tallhat vezrlkkel azonos mkdst, lmnyt nyjtanak. Ezek egyttesen hvjk fel a figyelmet az adott feladatokra, prioritsokra, relevns informcikra, melyeket szp s megkap mdon clszer tlalnunk. Ennek megfelelen sajt l lapkkra, animlt ikonokra, szp s kellemes Splash kpernykre van szksg.

Start Men s a lapkk


Windows Phone 7 esetn a hagyomnyos Asztal s az ikonok koncepcijt felvltotta a Start kperny s a rajta elhelyezett n. lapkk (tile). Ezek gyakorlatilag az ikonokat helyettestik. A Start kperny trendezhet, a felhasznl dnti el, hogy mely alkalmazsokat jelenti meg a Start kpernyn. A lapka kinzete jelentsen befolysolja, hogy a telefon hasznlatbavtelekor a felhasznlt milyen lmny s ltvny fogadja. gy minl dekoratvabb, informatvabb egy alkalmazs lapkja, annl nagyobb a valsznsge, hogy a Start kpernyre kerlhet. A lapkk lehetnek l lapkk is, melyek az idben vltoznak, animldnak, s alapinformcikat kzlnek pldul t j olvasatlan levl van a postaldban, 30 fok lesz Budapesten, stb. Nemcsak vizulis elnyt jelent az l lapka, de bizony jval hasznlhatbb is teszi az alkalmazst! A lapka az alkalmazs belpsi pontja, az els vizulis elem, a megjelens egyik legfontosabb eleme. Ennek megfelelen fontos, hogy egyedi, hasznos s klnleges legyen (2-15 bra)! 37

2. Felhasznli lmny tervezse Windows Phone-on

2-15 bra: Helyes s helytelen lapka dizjnok

A dizjn fontos
A lapkk esetn a dizjn a legfontosabb! Az elgtelen minsg, gyengn megtervezett s megrajzolt lapkval rendelkez alkalmazs azt is kockztatja, hogy a Marketplace-bl kisebb esllyel kerl letltsre. Fontos, hogy megragadja a szemet! A lapka kpeknek 173x173 pixel mreteknek kell lennik, JPEG vagy PNG formtumban. Az ennl nagyobb vagy kisebb kpek tmretezsre kerlnek, felfel vagy lefel, ami torztshoz, vgshoz vezethet. Ezenfell az alkalmazs listba rdemes kln 63x63 pixeles kpet biztostani, ellenkez esetben az alaprtelmezett lapka kerl tmretezsre. Klnbz kpek hasznlata esetn azonban maradjunk minden esetben konzisztensek! A lapkk tervezse sorn kerljk el az albbiakat: 3D-s lapkk hasznlatt A gradiensek hasznlatt, rnykok alkalmazst Lekerektett lapkkat Fekete vagy fehr httereket, melyek a megfelel Windows Phone tmk esetn transzparens httrknt funkcionlnak (2-16 bra) Transzparens httereket, sznes bels kpekkel

2-16 bra: Helytelen httrsznek hasznlata lapkknl

38

Gyakorlati Dizjn

Splash kperny
Az alkalmazsok indtsakor szmos inicializcis feladat elvgzsre lehet szksg. Ilyenkor a felhasznli fellet mg nem ll kszen arra, hogy a felhasznlk hasznlatba vegyk az alkalmazst. A betlts sorn alkalmazunk Splash kpernyket! A Splash kperny ennek megfelelen a msodik szint, kzvetlenl a lapkk utn, amellyel a felhasznl tallkozik. A betlt kpernyn a felhasznl knnyedn eltlthet nhny (max. 10) msodpercet, gy az itt tlttt id s az lmny, ami itt fogadja, jelentsen meghatrozza a felhasznl hozzllst az alkalmazs tbbi rszhez. Fontos teht a j betlt kperny megtervezse. A betltsi id lehet egy rvid pillanat is, gy nem rdemes komolyabb informcit megjelenteni ezen a kpernyn. Hosszabb szvegek, instrukcik elhelyezse teljesen flsleges. Erre a kpernyre clszer gy gondolni, mint az alkalmazs reklmjra, hangulatfokozra, mieltt szembetalln magt a felhasznl a tnyleges alkalmazssal (2-17 bra).

2-17 bra: Splash kpernyk alkalmazsa

Vezrlk hasznlata
Windows Phone 7-ben a hagyomnyos vezrlk mellett szmos specializlt, az opercis rendszerre jellemz vezrl is helyet kapott. Ezek a vezrlk a fejlesztk szmra is elrhetk az SDK-ban vagy a Toolkiten keresztl. Minden vezrlhz sajt tervezsi s hasznlati tmutat tartozik, melyekkel rdemes mlyebben is megismerkedni. A Windows Phone-ra jellemz vezrlk kzl kett kiemelkedik. Ez a kt vezrl a Panorama s a Pivot.

A Panorama vezrl
A Panorama vezrl egy szles jobbra-balra cssztathat, grgethet teljes kpernys kontner, s alapveten navigcis modell is egyben. Leginkbb gy gondolhatunk r, mint egy magazin foldalra, ahol a legfontosabb, legrdekesebb s legizgalmasabb dolgok szerepelnek (2-18 bra).

39

2. Felhasznli lmny tervezse Windows Phone-on

2-18 bra: A Panorama vezrl A Panorama vezrl messze tlnylik a lthat terleten, a grgets sorn pedig egszen egyedi animcival s tulajdonsgokkal rendelkezik. Az animci sorn a tartalom s a feliratok klnbz sebessggel, idben eltoldva hajtdnak vgre, ezltal rendkvl ltvnyos, dinamikus parallaxszer effektust eredmnyezve. A vezrl hasznlatakor nhny dolgot clszer szem eltt tartani: A htteret clszer egyetlen sznnel vagy egy vatosan vlasztott httrkppel kitlteni. Httrkpknt jellemzen JPEG ajnlott 480x800-as, illetve 1024x800-as felbontsban. Ez biztostja a j teljestmnyt s a gyors betltst, valamint az tmretezs elkerlst. Httr meghatrozsakor gondoskodjunk a megfelel kontrasztrl a fontok s a httr kztt! Ne menjen a design az olvashatsg krra! Ne hasznljunk olyan egyb vezrlket a Panorama egyes nzeteiben, amelyek magukban is grgethetk horizontlis irnyban! Teljestmny megfontolsok miatt szortkozzunk maximum ngy klnbz nzetre egyetlen Panorama vezrlben! A Panorama cme clszeren sima szveg legyen!

A Pivot vezrl
A Pivot vezrl a Windows Phone sajt Tab vezrlje. A vezrl nll, elklntett nzeteket helyez el egyms mellett, s biztostja a navigcit kzttk. A Panorama vezrlvel ellenttben nem egyetlen nagy tren helyezkednek el az egyes szekcik. A navigci a menelemek fejlct rintve, illetve horizontlis mozgatssal lehetsges. A vezrl hasznlatakor nhny dolgot clszer szem eltt tartani: Pivot vezrlket ne gyazzunk egymsba! Ne kombinljuk a Pivot s a Panorama vezrlket! Ne hasznljunk tl sok Pivot elemet, a felhasznlk knnyen elveszhetnek bennk! A Pivot alaprtelmezett navigcis mechanizmust ne rjuk fell! Bizonyos vezrlket nem clszer hasznlni a Pivot belsejben (pldul Slider, Toggle, Map vezrlk).

40

Gyakorlati Dizjn

rintkpernys alkalmazsok tervezse


A hardver
A kijelzk technolgija rengeteget fejldtt az elmlt vekben. Az egyik legfontosabb ttrs a kapacitv rtintkpernyk megjelense volt. A technolgia jellemzinek ksznheten rendkvl sima s folyamatos lmnyt lehet biztostani. Pontos s csupn knnyed rintst ignyel, gy a ma kaphat modern okostelefonok jelents rsze ilyen tpus kijelzket alkalmaz. A Windows Phone 7 telefonok kvetelmnyei kztt szerepel, hogy az eszkzket kapacitv kijelzvel kell elltni.

Az j kvetelmnyek
rintkpernys alkalmazsok ltrehozsnak lehetsge teljesen j tvolatokat nyit a szoftveripar szerepli eltt. Az ilyen tpus felletek j, eddig mg nem ismert vagy nem hasznlt interakcis modellek szletst teszik lehetv. Ugyanakkor a kijelzk mrete okostelefonokrl lvn sz ersen korltozott, gy az j tpus modellek kidolgozsa sorn figyelembe kell venni az emberi tnyez mellett a mretkorltokat is.

Interakcis modellek
Habr nem beszlhetnk szabvnyostott modellekrl, teljesen j mozdulatok, rints-kombincik bevezetse kockzatos lehet. Az ilyen nagy lpsekhez a fantzin tl szksg lehet szakember (pszicholgus, ergonmus) segtsgre is. Ellenben szmos elfogadott multitouch mozdulat kzl vlaszthatunk (2-19 bra).

2-19 bra: Hasznlhat gesztusok Windows Phone-on A Windows Phone 7 jelen pillanatban 12 klnbz mozdulatot kpes megklnbztetni API szinten, mint pldul a Pinch, Slide, Tap, TapAndHold, s gy tovbb.

Mretkorltok az rintkijelzn
A felhasznl szmra a clobjektumokkal trtn rintkezst kveten, kzvetlenl, vizulis visszajelzst kell biztostanunk. Ennek megfelelen bizonyos korltokat clszer szem eltt tartanunk.

Minimum mretek rintshez


Az rintsre mkd felletek kialaktsa finom egyenslyozs a mretek, az objektumok kztti szabad terletek s a vizulis elemek kztt. Az egyik, a felhasznl szmra legfrusztrlbb negatv lmny, ha nem tudja az adott gombot, linket, kpet vagy brmilyen objektumot elsre eltallni. Hosszas hasznlhatsgi tesztels sorn megllaptottk, hogy az idelis clobjektum terlete minimum 81mm2-es (9mm x 9mm).

41

2. Felhasznli lmny tervezse Windows Phone-on

2-20 bra: rintskor a clobjektum ajnlott terlete Ennl kisebb objektumok is elkpzelhetk, tipikusan listk esetben, itt a minimum korlt a 7mm-es magassg. Ilyenkor azonban clszer a clobjektum szlessgt magasabb rtkben megllaptani!

2-21 bra: Ajnlott sormagassg

Minimum mretek vizulis elemek tekintetben


A vizulis elemeket illeten minden olyan elemnek, amely rintsre reagl, minimum 4.2mm2-esnek kell lennie. Ennl kisebb terletet a felhasznlk nem fognak interaktvnak tekinteni. Ez az rtk csupn a kis vizulis elemekre rtend. Az idelis mret, amelyen mr a vizulis visszajelzs (lenyoms animci) is rzkelhet 10-15mm2 kztt mozog.

Vizulis elrendezs
A sikertelen tallatnl csak egy frusztrlbb dolog van: amikor a felhasznl nem azt az objektumot rinti meg, amelyet szndkozott, azaz flrenyom. A fenti szempontok figyelembevtelvel ennek a kockzata jelents mrtkben cskkenthet. A helyzeten tovbb javt az n. holt terlet helyes meghatrozsa. Holt terletnek nevezzk azt a szabad terletet, amely kt clobjektum kztt helyezkedik el, s semmilyen interakcival nem rendelkezik. Br a holt terletet clszer arnyaiban megllaptani, a 2mm-es minimum j als hatrrtknek tekinthet. Ezenfell az rinthet, interaktv terletet is clszer nagyobbnak vlasztani a vizulis elem terletnl. A helyes interkacis modellek megvlasztsa s tmogatsa kulcsfontossg szereppel br a felhasznli lmny, a hasznlhatsg vonatkozsban!

sszefoglals
Ebben a fejezetben megismerkedtnk a Metro Design legfontosabb elveivel, valamint a dizjnvezrelt tervezs mdszervel. Ezeket az elveket betartva olyan stabil termkek szlethetnek, melyek mind szmunkra, mind a felhasznlink szmra lvezetes, rmteli perceket szerezhetnek. A gyakorlati tippek fontos tmutatknt szolglnak az ergonmiai kvetelmnyek kielgtsben.

42

3. Alkalmazsfejleszts Windows Phone-on


Az eredetileg RIA fejlesztsre kialaktott Silverlight keretrendszer taln legfontosabb alapgondolata a gazdag tartalm, sszetett felhasznli felletek (a tovbbiakban UI User Interface) kialaktsnak tmogatsa. Ahogy a Silverlight asztali verzijban is, a Windows Phone 7-re tszabott vltozatban is kt nagyobb rszben jelenik meg ennek megvalstsa: a vezrlknyvtrban, illetve a keretrendszer UIhoz kapcsold szolgltatsaiban. Elbbiben rtelemszeren a vezrlket talljuk. Ezek azok az alapvet ptelemek, amelyek segtsgvel a legegyszerbbtl a legbonyolultabb zleti alkalmazsokig brmilyen felhasznli felletet tlthat, kzre ll mdon felpthetnk. Ennek a fejezetnek az els rszben ezekkel az ptelemekkel ismerkednk meg. Az itt ismertetett vezrlk hasznlatn fell a vezrlk osztlyhierarchijnak kialaktsa lehetv teszi, hogy kiterjesszk azokat j tulajdonsgokat, viselkedst adjunk nekik , illetve sajt vezrlket hozzunk ltre, akr tbb mr meglv elem egyttes hasznlatval, akr stpusokbl val leszrmaztats s a vezrl teljes funkcionalitsnak megvalstsa segtsgvel. A Silverlight UI-ptst s -mkdst tmogat rsznek msik rsze azoknak a szolgltatsoknak a halmaza, amelyek testre szabhatv, izgalmass, knnyen hasznlhatv teszik a vezrlket, s lehetsget adnak arra, hogy a korbbi UI-keretrendszerek ltal biztostott lehetsgeknl jval tbb mindent tehessnk meg sokkal kisebb erfesztssel. A vezrlk kinzett egy nagyszer vezrlsablonrendszerrel, illetve stlusok segtsgvel vltoztathatjuk meg, ezenfell pedig knnyedn animlhatjuk azokat. Klnbz vizulis llapotokat hozhatunk ltre, amelyekkel akr az egyes vezrlk, akr a teljes fellet bizonyos helyzetekben felvett megjelentst rhatjuk le kzponti, egysges mdon. Az adatktsirendszerrel s az adatsablonok hasznlatval pedig rengeteg kdot megsprolva pthetnk dinamikus, adatfgg felleteket. Ebben a fejezetben ezeket a tmakrket nzzk meg kzelebbrl, s megismerkednk mg nhny fontos koncepcival pldul az erforrsok s a tmk hasznlatval , amelyek a felletek ptshez elengedhetetlenek. Szerencsre a Microsoft nagy hangslyt fektet a klnbz technolgii kztti tjrhatsgra s a hordozhat tudsra, ezrt, ahogy ltni is fogjuk, sok minden megegyezik az asztali Silverlighttal. Mivel mr rengeteg knyv megjelent Silverlight 4 tmban, s az ezekben lertak komolyabb vltoztatsok nlkl alkalmazhatk Windows Phone 7-fejlesztsben is, ez a fejezet csak egy gyors, ttekint sszefoglalst kvn adni. Aki a WP7-es Silverlight nagytestvrnek hasznlata sorn mr tallkozott az itt lert tpusokkal s koncepcikkal, az is tallhat nhny j dolgot (pldul az InputScopeok), de korbban megszerzett tudsa azonnal s kzel szz szzalkosan tvihet WP7-re. A Silverlight alap fejlesztsre mint azt a korbbi fejezetek mr emltettk kt eszkzt is biztost szmunkra a Microsoft. A Visual Studio 2010 elssorban a fejlesztknek kszlt; tkletes vlaszts a fejleszts teljes letciklusnak felgyelethez a kezdeti kdrstl a tesztelsig s a teleptsig. Azonban a felletek kialaktsa egyes esetekben elgg fjdalmas tud lenni a VS hasznlatval. Tbbek kztt a VS ezen gyenge pontjt ellenslyozand hozta ltre a Microsoft az Expression termkcsaldot. Az Expression termkek elssorban a dizjnereknek kszltek ahogy a Silverlight eldjt, a Windows Presentation Foundationt is azzal a cllal hoztk ltre, hogy segtsk a dizjnerek s a fejlesztk egyttmkdst. A fejezet sorn vgig az Expression Blend 4 segtsgvel hozzuk ltre s szabjuk testre a felleteket.

43

3. Alkalmazsfejleszts Windows Phone-on

Megjegyzs: mind a Visual Studio 2010, mind az Expression Blend 4 rendelkezik ingyenes, kifejezetten WP7-fejlesztsre kihegyezett verzival, amelyek rszt kpezik a WP7 fejleszti csomagnak.

Alapvet WP7 vezrlk


Ebben a rszben elszr az alapvet parancskiadsi vezrlkkel foglalkozunk, majd ttrnk a szvegmegjelentsre s a szvegbevitelre. A ListBox osztlyon keresztl ttekintjk a listavezrlk ltalnos hasznlatt. Az egyszersg kedvrt egyetlen alkalmazson bell helyezzk el ezeket a vezrlket. Hozzunk is ltre egy alkalmazst a Blend 4 segtsgvel! Az Expression Blendet a Start Men az All Programs menpontban a Microsoft Expression mappban talljuk. Elindtsa utn egy nyitkperny fogad, amelyen ltrehozhatunk j projektet vagy megnyithatunk egy mr ltezt, illetve segtsget krhetnk a program hasznlatval kapcsolatban (Help fl). A Samples fln mintaalkalmazsokat tekinthetnk meg, a Close gombbal (Alt+C) bezrhatjuk az alkalmazst. A legtbb programnl szoksos fmen itt is elrhet. A File men New Project menpontjra kattintva hozhatunk ltre j projektet (3-1 bra).

3-1 bra: j projekt ltrehozsa Expression Blenddel A megjelen ablakban vlaszthatjuk ki, hogy milyen projektet szeretnnk ltrehozni, illetve megadhatunk egyb belltsokat. A bal oldali listbl a Windows Phone pontot, a jobb oldalon pedig a Windows Phone Application projektsablont kell vlasztanunk. Alul nevet adhatunk az alkalmazsnak (BaseControlsSample), kivlaszthatjuk a projekt fizikai helyt a merevlemezen, nyelvet vlaszthatunk (ftt marha nincs, rjk be a C#-pal), illetve bellthatjuk a Windows Phone verzit (7.1), amint azt a 3-2 bra mutatja.

3-2 bra: Sablon kivlasztsa

44

Alapvet WP7 vezrlk

Tartsuk szben, hogy a Blend alapbelltsknt nem ugyanabban a knyvtrban hozza ltre a projekteket, mint a Visual Studio, hanem a C:\Users\<felhasznlnv>\<dokumentumok>\Expression\Blend 4\Projects mappban! A vlasztott 7.1-es OS verzi ne tvesszen meg senkit! A Mangknt ismert, 7.5-sknt reklmozott OS bels verziszma 7.10.7720.68. Az OK gombra kattintva a Blend ltrehozza a projektet. Ismerkedjnk meg a fellettel, amelynek elemeit a 3-3 bra mutatja be!

3-3 bra: Az Expression Blend felletnek rszei 0: A mensor 1: A toolbox (szerszmoslda) Ez jelentsen eltr aVisual Studiban megszokottl: nem egyszeren a vezrlk listja, hanem minden a fellet kialaktsval kapcsolatos eszkzt tartalmaz. A tetejn a kivlasztshoz szksges kurzorok foglalnak helyet (ezek hasznlatval tudunk valamit kzvetlenl a tervezfelletre kattintssal kivlasztani, szerkeszteni). Lejjebb, a kz ikonnal tudjuk egyszeren grgetni a tervezfelletet. A nagyt ikon segtsgvel nagythatunk a fellet egy rszre. Lejjebb, a harmadik csoportban talljuk a primitv vezrlket szimbolizl egyszer ngyszget. Alatta tallhatk az elrendezs-vezrlk (Grid, ngy rszre osztott ngyzet ikon), a szvegvezrlk (keretes T bet), illetve egyb gyakran hasznlt vezrlk (gomb ikon). A toolbox legals eleme jelen pillanatban egy dupla, jobbra mutat nyl. Erre kattintva rjk el az n. Asset Library-t, ahonnan egyb, a toolboxon nem szerepl vezrlket s egyb felhasznlhat tpusokat rhetnk el. Ha kivlasztunk valamit az Asset Library-ban, annak ikonja a duplanyl alatt jelenik meg. Ha kzelebbrl megnzzk, nhny ikon jobb als sarkban egy kis nyilat vehetnk szre ez azt jelenti, hogy nem egy eszkzrl van sz, hanem egy csoportrl. Azoknl az ikonoknl, amelyeknl van ilyen nyl, a

45

3. Alkalmazsfejleszts Windows Phone-on jobb egrgombbal kattintva elhvhatjuk a helyi ment, s azzal kivlaszthatjuk az eszkzt, amelyet hasznlni szeretnnk. Kattintsunk a jobb gombbal pldul a keretes T betre (szvegvezrlk)! Az ikon mellett megjelen lista ngy eleme: TextBlock, TextBox, RichTextBox, PasswordBox. Kattintsunk a PasswordBoxra (ezttal a bal egrgombbal), s lthat, hogy a keretes T bet, mely a TextBlockot hivatott jelkpezni, eltnt, s helyette a PasswordBox ikonja jelent meg. Ennek annyi a jelentsge, hogy az itt kivlasztott vezrlt tudjuk ltrehozni, ha a tervezfelleten kijelljk az j vezrl helyt. 2: A fejlesztsi ablak Legels fle (a sorrend megvltoztathat) a Projects, ami a VS Solution Explorernek helyi verzija: ebben talljuk meg a projektet alkot sszes fjlt s knyvtrat, valamint referencikat a kls szerelvnyekre. Msodik fle az Assets, mely a Silverlight fellettel kapcsolatos tpusokat gyjti ssze, s rendszerezi. A States fln tallhatjuk meg s szerkeszthetjk a kivlasztott vezrl vizulis llapotait errl ksbb sz lesz mg. A Device fl segtsgvel pedig az alkalmazsainkat futtat emultor orientcijt s tmjt llthatjuk be, illetve itt adhatjuk meg azt is, hogy a tesztelshez az emultort vagy egy fizikai eszkzt szeretnnk-e hasznlni. 3: Objects and Timeline Alapesetben itt lthatjuk az alkalmazsunk egy oldalnak (PhoneApplicationPage) vizulis hierarchijt. Ahogy a 3-3 brn is lthat, egy LayoutRoot nev elem a legfels vezrl, ebben helyezhetjk el a tartalmat. Egy sablon szerkesztse esetn itt lthatjuk a sablon felptst, egy animci vagy VisualState szerkesztsnl pedig itt jelenik meg az idvonalat (timeline) brzol ablak, mellyel bellthatjuk, hogy az animci indulsa utni adott idpillanatban hogyan nzzen ki a fellet. 4: A tervezfellet Legfell az ppen nyitva lv fjlok listja lthat (jelenleg csak a MainPage.xaml), alatta pedig az n. breadcrumb, ami azt mutatja, hogy ppen milyen elemet vlasztottunk ki (a fenti kpen Nothing Selected, azaz ppen semmi sincs kivlasztva). A tervezfellet jelents rszt az oldal interaktv megjelent fellete foglalja el. Ezen helyezhetjk el s mretezhetjk t a vezrlket. A megjelenttl jobbra, fell hrom ikont tallhatunk, ezek segtsgvel vlthatunk a tervezsi nzet, a XAML-nzet s az osztott nzet kztt. 5: Tulajdonsgok s adatok A Properties fln llthatjuk be a kivlasztott vezrl tulajdonsgait, s itt iratkozhatunk fel az esemnyekre. A Resources fln talljuk az alkalmazs erforrsainak listjt (ezekrl ksbb bvebben is szt ejtnk). A Data fl alatt a projekt adatforrsai tallhatk, illetve itt hozhatunk ltre tesztelshez hasznlt adatforrst. Az oldal tartalmaknt mindssze egyetlen vezrlelemet adhatunk meg. Ha gy dntnk, hogy ez pldul egy gomb lesz, akkor a gomb kitlti majd a teljes oldal fellett leszmtva az ApplicationBar s az n. system tray ltal elfoglalt rszeket. Ahhoz, hogy ne csak egyetlen vezrlt helyezhessnk el az oldalon, elrendezs-vezrlre (layout control) lesz szksgnk. Ezek a vezrlk azt teszik lehetv, hogy tbb gyermekvezrlt is elrendezhessnk az elrendezs-vezrl ltal lefoglalt terleten. Alapesetben, a Silverlight Toolkit hasznlata nlkl hromfle elrendezs-vezrl ll rendelkezsre a Windows Phone 7-ben: a tblzatos elrendezst lehetv tv Grid, a Windows Formsbl (vagy korbbrl) mr ismers, pixel alap pozicionlst lehetv tev Canvas, s a vezrlket egyms al vagy egyms mell, minimlis helyigny alapjn felsorakoztat StackPanel. Mivel az elrendezs futsidej mkdse megegyezik az asztali Silverlightval, itt nem trnk ki r bvebben. Az elrendezsi rendszerrl s vezrlkrl szl tovbbi informcikrt rdemes az albbi linkrl elindulni: http://msdn.microsoft.com/en-us/library/cc645025(v=vs.95).aspx

46

Alapvet WP7 vezrlk

Tipp: ha utlag rjvnk, hogy egy nem megfelel tpus elrendezs-vezrlt helyeztnk el a felleten, nem kell XAML-t trni a cserhez. Az Objects and Timeline ablakban kattintsunk jobbal a lecserlni kvnt vezrlre, s vlasszuk ki a Change Layout Type pont alatt a megfelel tpust! Mivel viszonylag ritka az a helyzet, hogy valaki tnylegesen egyetlen vezrlt akarjon elhelyezni alkalmazsa felletn, a Silverlight Phone Application projektsablon rgtn egy teljes vizulis hierarchit pt fel a felleten. Ha az Objects and Timeline ablakra nznk, lthatjuk ennek gykrelemt, a LayoutRoot nev vezrlt, amely trtnetesen egy Grid. Ez az egyetlen tartalma az oldalunknak. A tervezfelletre pillantva rezhet, hogy itt ennl bonyolultabb struktrnak kell lennie a LayoutRoottl balra lv apr nylra kattintva megtekinthetjk a Grid belsejben lv felleti elemeket is. Ahogy az a 3-4 brn lthat, a LayoutRoot kt elemet tartalmaz. Br a kezdeti idkben nem tl gyakran kerlnek el, rdemes tudni, hogy a vezrlktl jobbra lthat kt piktogrammal tudunk eltntetni egy-egy vezrlt a tervezfelletrl, illetve zrolni, azaz vdeni a vletlen mdostsoktl.

3-4 bra: Az Objects and Timeline panel A TitlePanel nev gyermekelem egy StackPanel, amely az alkalmazs fels rszt rja le: az alkalmazs nevt (MY APPLICATION) tartalmaz TextBlockot, illetve az alatta lv oldalnevet (page name). Ha nincs klnleges ignynk, esetleg szeretnnk, hogy az alkalmazs illeszkedjen a sok msik ltal kialaktott jl felismerhet smba, akkor elg, ha megvltoztatjuk a kt TextBlock tartalmt, de a struktrhoz nem kell hozznylnunk. A ContentPanel nev gyermekelem a leginkbb rdekes rsz: ebben a Gridben helyezhetjk el a tnyleges tartalmat ad s funkcit szolgl vezrlket. szrevehetjk, hogy a vezrlkre kattintgatva az Objects and Timeline panelen (vagy valamelyik nyl alak kurzorral magn a tervezfelleten), a jobb oldalon lv Properties panel tartalma azonnal frissl. Mivel tbb vezrlt is szeretnnk elhelyezni az alkalmazson pontosabban a ContentPanelen bell, meg kell adnunk a ContentPanelnak, hogy hny oszlopbl s sorbl lljon. Ezt gy tehetjk meg, hogy kijelljk azt, majd a Properties panelen megkeressk annak RowDefinitions illetve ColumnDefinitions tulajdonsgait. Mieltt azonban elvesznnk a milli tulajdonsg kztt, rdemes madrtvlatbl is szemgyre venni a Properties panelt! Ahogyan azt a 3-5 bra mutatja, legfell a kijellt objektum nevt lthatjuk ezzel a nvvel hivatkozhatunk a vezrlre a mgttes kdban, illetve egyb helyeken a XAML-ben. Elfordulhat, hogy a <No Name> felirat szerepel ebben a szvegdobozban, ugyanis a Silverlightban nem felttlenl kell egy vezrlnek nevet adni. A nv mellett talljuk a tulajdonsgok s az esemnyek kztt vlt kt gombot, alatta pedig a kijellt elem tpust. Mindezek alatt pedig a keresdoboz helyezkedik el. rdemes ezt hasznlnunk, mivel a szrs kellkppen intelligens (nemcsak a tulajdonsgok nevnek kezdete alapjn szrhetnk), illetve mert a Silverlight vezrli tnyleg nagyon sok tulajdonsggal rendelkeznek.

47

3. Alkalmazsfejleszts Windows Phone-on

3-5 bra A Properties panel A keresdoboz alatt talljuk a tulajdonsgokat rtkeikkel egyetemben csoportokra osztva. Itt kt dologrl is rdemes szt ejteni, amelyeket elsre knny nem szrevenni. Az egyik, hogy a csoportok aljn tallhat egy lefel mutat nyl; ezzel rhetjk el a ritkbban hasznlt tulajdonsgokat. A msik, hogy sok tulajdonsgtl jobbra egy kis ngyzet tallhat. Ez nemcsak dizjnelem, hanem funkcival is br! Az Advanced options gomb segtsgvel hozhatunk ltre adatktst (esetleg erforrshoz ktst) az adott tulajdonsg kapcsn, illetve egyebek mellett alaprtelmezett rtkre is visszallthatjuk a tulajdonsgot. (Az adatktsrl s az erforrsokrl a ksbbiekben lesz sz.) A gomb szne is jelentsggel br: ha szrke, akkor a tulajdonsg az alaprtelmezett rtkn ll, ha fehr, akkor kzzel lltottk be valamilyen rtkre, ha srga, valamilyen adatktsbl kapja az rtkt, s gy tovbb. Visszatrve a ContentPanelre, ha hozzadunk a RowDefinitions s a ColumnDefinitions tulajdonsgokhoz kt oszlopot s hrom sort, lthat, hogy a tervezfelleten is megjelennek a cellk hatrol vonalai, hat egyforma cellra bontjk a felletet, ahogyan azt a 3-6 bra mutatja.

3-6 bra: Hat egyforma cellra bontott ContentPanel Grid Ennyi ttekints utn vegyk sorra azt a nhny alapvet vezrlt, amelyek nlkl nincs let a Silverlightban!

48

Alapvet WP7 vezrlk

Parancsvezrlk
A Button vezrl hasznlata
A Toolboxon dupln a Button ikonjra kattintva (3-7 bra), megjelenik egy gomb az alkalmazs felletn. Alaprtelmezs szerint abban a vezrlben jelenik meg az j elem, melyet az Objects and Timeline ablakban kijelltnk.

3-7 bra: A Buttont jell gomb a Toolboxon Vezrlt gy is ltrehozhatunk, hogy egyszer kattintunk az ikonjra, majd a pluszjel formjra vltozott kurzorral megrajzoljuk a felleten. Ennek a mdszernek tbbek kztt az az elnye, hogy rgtn meghatrozhatjuk a vezrl pontos pozcijt, illetve mrett. Htrnya viszont, hogy egy sszetettebb vizulis hierarchiban a Blend nha eltveszti, hogy pontosan melyik elrendezs vezrlbe, egy Grid esetn melyik cell(k)ba is akartuk helyezni az j vezrlt. Canvas hasznlata esetn viszont ez a mdszer nagyon hasznos. A Button az elsdleges parancsvezrl: funkcija ltalban mindssze annyi, hogy a felhasznl rkattinthat (illetve, mivel rintkpernys eszkzrl beszlnk: megrintheti, rtapinthat), s ennek hatsra lefuttathatunk egy esemnykezel metdust a mgttes kdban. Az els, amit szoks tlltani egy gombon, annak felirata. A Button a ContentControl sosztlybl szrmazik. A ContentControlbl szrmaz vezrlk kzs ismrve, hogy egyetlen tartalmat tudnak fogadni Content tulajdonsgukon keresztl , ez a tulajdonsg viszont System.Object tpus, teht brmilyen objektumot felvehet rtkl. A Properties panelen a Content tulajdonsg melletti szvegdobozban rhatjuk t a gomb feliratt, ahogyan azt a 3-8 bra is mutatja:

3-8 bra: A Button Content tulajdonsgnak tlltsa a Properties panelen szrevehetjk, hogy ha tl hossz feliratot rendelnk a gombhoz, a tervezfelleten nem jelenik meg a teljes szveg. Ennek oka, hogy alapbelltsknt a Blend a Margin tulajdonsg segtsgvel mretezi a vezrlt, vagyis meghatrozza, hogy a tartalmaz vezrl (a ContentPanel nev Grid [0,0] cellja) szleitl mekkora tvolsgot tartson a vezrl (3-9 bra).

49

3. Alkalmazsfejleszts Windows Phone-on

3-9 bra: A tl kicsi gomb s a Margin esete Ha az Advanced options segtsgvel alaphelyzetbe lltjuk a Margint (3-10 bra), a gomb szlesebb lesz, szltben kitlti a cellt (3-11 bra).

3-10 bra: A Margin alaphelyzetbe lltsa az Advanced options Reset parancsnak segtsgvel

3-11 bra: Gomb, Marginok nlkl Azt is szrevehetjk, hogy gombunk mg nem rendelkezik nvvel. Alaprtelmezs szerint nem kell, hogy nevet kapjanak a vezrlk, viszont ha hivatkozni szeretnnk rjuk a mgttes kdban, akkor rdemes nevet adni nekik. (Esetnkben ez btnOne lesz.) Ahhoz, hogy valamilyen kd lefusson, amikor a felhasznl megnyomja a gombot, a Button Click esemnyhez kell hozzrendelnnk egy esemnykezel metdust. A Properties panel tetejn vlthatunk t esemnynzetbe, s itt a Click felirat melletti szvegdobozba val dupla kattintssal kszttethetjk el az esemnykezelt a Blenddel (3-12 bra).

3-12 bra: A Properties panel tkapcsolsa esemny-nzetbe Ahogy elkszl a metdus melynek neve meg is jelent a Click mellett , a Blend tvlt az aktulis oldal mgttes kdjra. Itt kapcsolhatjuk azt a kdot a fellethez, amellyel megvalsthatjuk az elvrt mkdst.

50

Alapvet WP7 vezrlk

A bonyolultabb programoknl rdemes szeparlni a fellet mgtti logikt s a tnyleges zleti logikt. Ebben az MVVM (Model-View-ViewModel) alkalmazsfejlesztsi minta lehet segtsgnkre. Ennek lersa tlmutat e knyv hatrain, illetve tbb keretrendszer is ltezik implementlsra. Josh Smith WPF-guru cikke az MVVM-rl WPF alatt itt tallhat: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx. Egy nllan megrhat alkalmazs elksztsnek lersa Silverlight MVVM-mel itt van rszletesen lerva: http://www.silverlight.net/learn/advanced-techniques/the-mvvm-pattern/using-the-mvvm-pattern-insilverlight-applications. Az ismertebb MVVM-keretrendszerek lersa a http://en.wikipedia.org/wiki/Model_View_ViewModel linken tallhat. (Az Open source MVVM frameworks c. rsz alatti linkeket rdemes megnzni.) Itt annyit fog tenni a gomb, hogy amikor megnyomjk, nvel egy szmllt, aztn annak aktulis rtkt megjelenti a gombon. Ehhez elszr ltrehozok egy System.Int32 tpus vltozt az oldal mgttes kdjban, majd az elbb elkszlt esemnykezelben megnvelem az rtkt, s tadom a gombnak mint tartalmat. A teljes kd leszmtva a using direktvkat gy nz ki:
namespace BaseControlsSample { public partial class MainPage : PhoneApplicationPage { int taps = 0; public MainPage() { InitializeComponent(); } private void btnOne_Click(object sender, System.Windows.RoutedEventArgs e) { taps++; btnOne.Content = taps; } } }

Az alkalmazs futtatshoz vagy megnyomjuk az F5 billentyt, vagy kivlaszthatjuk a Project menbl a Run Project menpontot. A Devices panel belltsai szerint a Blend vagy a WP7 emultort indtja el, vagy a PC-hez csatlakoztatott telefonra telepti az alkalmazst. Ahogy az alkalmazs elindult, a gombot nyomogatva nvekszik az rtk (3-13 bra).

3-13 bra: A program az emultoron futtatva

51

3. Alkalmazsfejleszts Windows Phone-on

Nem telepthetnk minden telefonra alkalmazsokat a Marketplace megkerlsvel. Be kell regisztrlnunk magunkat az App Hubon (http://create.msdn.com/) Windows Phone fejlesztknt, s megadni telefonunk gyri azonostjt. Ezzel feloldjuk a zrolst, fejleszti telefonn tesszk az eszkzt, ezutn arra a Marketplace megkerlsvel is telepthet alkalmazs.

A HyperlinkButton vezrl hasznlata


A HyperlinkButton vezrl a webes hivatkozsok megfeleljnek tekinthet. Tulajdonkppen mkdse nem sokban klnbzik a Buttontl: valami, ami kattints hatsra vgrehajtja a hozzrendelt kdot. A HyperlinkButton alaprtelmezsben nem tallhat meg a Toolboxban, ezrt az Asset Library segtsgvel kell elkerteni. A Toolbox aljn lv dupla nylra kattintva megjelenik a fent nevezett ablak; a keresdoboz segtsgvel gyorsan megtallhat a HyperlinkButton vezrl, amely ezutn egy kattintssal helyezhet el a Toolboxon, ahogyan azt a 3-14 bra mutatja.

3-14 bra: Az Assets panel megnyitsa, s a HyperlinkButton megkeresse A Toolbox j elemre dupln kattintva megjelenik egy HyperlinkButton a felleten, amelyet aztn a kurzor segtsgvel elhelyezhetnk (3-15 bra).

3-15 bra: A HyperlinkButton elhelyezse a felleten Akrcsak a Button, ez a vezrl is a ContentControlbl szrmazik; tartalmt a Content tulajdonsggal szablyozhatjuk. Szintn a Properties Panel Common Properties csoportjban tallhat a NavigateUri tulajdonsg. Ennek segtsgvel llthat be az oldal, ahov naviglni szeretnnk. Alaprtelmezsknt itt az alkalmazsban lv PhoneApplicationPage-eket ltjuk, de berhatunk egy webcmet is. (Protokollal egytt kell megadni, teht pl.: http://devportal.hu.) Ahhoz, hogy a navigci mkdjn, be kell lltanunk a TargetName tulajdonsgot is _blank-re. Kzvetlenl ezt nem tehetjk meg, de az Advanced options ngyzetre kattintva kivlaszthatjuk a Custom Expression menpontot, amellyel szabadon szerkeszthet az rtk (3-16 bra).

52

Alapvet WP7 vezrlk

3-16 bra: A NavigateUri s a TargetName belltsa Ha ezek utn elindtjuk a programot, s megrintjk a linket, megnylik az Internet Explorer, s betltdik a NavigateUri-ban megadott webcm. Ha nem elg, hogy gy, deklaratvan megadjuk a navigci cmt, mert pldul azt dinamikusan szeretnnk ellltani, akkor a Buttonnl ltott mdon feliratkozhatunk a Click esemnyre, s a mgttes kdban tetszleges kdot vgrehajthatunk.

A CheckBox hasznlata
Ha szeretnnk felknlni a lehetsget a felhasznlnak, hogy szablyozza a program mkdst, engedlyezzen vagy letiltson valamilyen opcit, a legjobb vlaszts a CheckBox, azaz jellngyzet. A Toolboxon ugyanabban a menben tallhat, ahol a Button. A CheckBox felirata, ahogy a mr bemutatott vezrlknl is, a Content tulajdonsgon keresztl vltoztathat meg. Legfontosabb tulajdonsgai az IsChecked s az IsThreeState. Elbbi megmondja, hogy a jellngyzetet bejelltk-e. Utbbival azt szablyozhatjuk, hogy a jellngyzet ktllapot legyen, vagy felvehessen-e egy harmadik, hatrozatlan (indeterminate) llapotot is. Ha az IsThreeState tulajdonsg igaz (true) rtk, a jellngyzet hrom llapotot vehet fel. Ha hamis (false) rtk, akkor is felveheti a harmadik llapotot, de csak programozottan; a felhasznl mr nem llthatja vissza kztes llapotba. Ez hasznos lehet, ha pldul nem akarjuk, vagy nem tudjuk elre megmondani, hogy melyik llapotba kellene lltani alaprtelmezetten a jellngyzetet, ugyanakkor nem szeretnnk azt sem, hogy a felhasznl utlag visszallthassa kztes llapotba. Ha szeretnnk valamilyen kdot futtatni, amikor a jellngyzet llapota megvltozik, a Checked (bejells esetn), Indeterminate (eldntetlen, kztes llapotba kerls esetn) s Unchecked (bejells trlse esetn) esemnyekre iratkozhatunk fel.

3-17 bra: A CheckBox belltsa


private void cbGenderIsMale_Checked(object sender, RoutedEventArgs e) { MessageBox.Show("Herbert Garrison"); }

53

3. Alkalmazsfejleszts Windows Phone-on

private void cbGenderIsMale_Unchecked(object sender, RoutedEventArgs e) { MessageBox.Show("Sheila Broflovski"); } private void cbGenderIsMale_Indeterminate(object sender, RoutedEventArgs e) { MessageBox.Show("Liane Cartman"); }

A RadioButton hasznlata
A CheckBox vezrlkkel egyes lehetsgek egymstl fggetlen ki- vagy bekapcsolst adhatjuk a felhasznl kezbe. Elfordul azonban, hogy azt szeretnnk, ha a felhasznl tbb lehetsgbl egyet vlaszthatna. Ilyen esetekben hasznlhatjuk a RadioButtont (rdigomb). A RadioButton legfontosabb tulajdonsgai s esemnyei nevkben s mkdskben is megegyeznek a CheckBoxnl ltottakval (Content, IsChecked, IsThreeState, Checked, Unchecked, Indeterminate).

3-18 bra: A RadioButton tulajdonsgainak belltsa Ha tbb csoportba szeretnnk rendezni a rdigombokat, gy, hogy minden csoportban klcsnsen kizrjk egymst a lehetsgek, de a klnbz csoportokban lvk kztt mr ne legyen kapcsolat, GroupName tulajdonsguk segtsgvel csoportosthatjuk ket. A mgttes kdban a RadioButtonk IsChecked tulajdonsgt figyelembe vve rhatjuk meg a program logikjt. Az albbi pldban a korbban elksztett Button esemnykezeljt mdostjuk gy, hogy ha az rbIncrement vlasztgombot jelli be a felhasznl, nveli az rtket, ha pedig nem, cskkenti azt (3-19 bra).
private void btnOne_Click(object sender, System.Windows.RoutedEventArgs e) { if ((bool)rbIncrement.IsChecked) taps++; else taps--; btnOne.Content = taps; }

Mind a CheckBox, mind a RadioButton IsChecked tulajdonsga Nullable<Boolean> tpus, azaz a true s false rtkn kvl null rtket is felvehet. Ezrt kell elbb Booleann alaktani, hogy true/false-knt vizsglhassuk az rtkt.

54

Alapvet WP7 vezrlk

3-19 bra: Parancsvezrlk a felleten

Szvegmegjelentsi vezrlk
Nagyon kevs olyan program van, amelynek nem kell szveget megjelentenie. A Silverlightban erre elssorban kt vezrlt hasznlunk: egyszer szvegmegjelentsre a TextBlockot, bonyolultabban formzott megjelentsre pedig a RichTextBoxot.

Egyszer szvegmegjelents a TextBlockkal


Ahogy korbban lttuk, a Windows Phone Application sablon rgtn kt TextBlockot is bept alkalmazsunk felletbe. Vegyk szemre a PageTitle nevt! A TextBlock ltal megjelentett szveget a Text tulajdonsg segtsgvel adhatjuk meg (3-20 bra).

3-20 bra: A TextBlock szvegnek belltsa A Text csoportban tallhat tulajdonsgok segtsgvel szabhatjuk testre a szveg kinzett. Egyebek kztt tllthatjuk a bettpust, a betk mrett, illetve a szoksos (flkvr, dlt, alhzott) betformzsi lehetsgeket is megkapjuk (3-21 bra).

55

3. Alkalmazsfejleszts Windows Phone-on

3-21 bra: A TextBlock szvegnek tulajdonsgai Elfordulhat, hogy a szveg tl hossz, s nem fr ki a TextBlock rendelkezsre ll helyen. Ilyenkor alaprtelmezsknt egyszeren kicsszik, vagyis a vge nem jelenik meg (3-22 bra). ltalban rdemes elkerlni, hogy tl sok szveg kerljn egy TextBlockba, de erre nem mindig van lehetsg.

3-22 bra: Tl hossz szveg Kt dolgot tehetnk, hogy kikszbljk ezt a problmt. Az els, hogy a TextTrimming tulajdonsgot None rtkrl WordEllipsis rtkre lltjuk. Ennek eredmnyekppen, amikor a TextBlock tl sok szveget tartalmaz, levgja azokat a szavakat, amelyek mr nem frnek ki, s hrom ponttal helyettesti ket (3-23 bra).

3-23 bra: Tl hossz szveg TextTrimminggel kezelve A msik lehetsg, hogy a TextWrapping tulajdonsgot Wrap rtkre lltjuk. Ennek hatsra a TextBlock tbb sorban prblja meg elhelyezni a szveget. Amikor egy sz mr nem fr ki, a kvetkez sorba kerl (3-24 bra).

3-24 bra: Tl hossz szveg TextWrappinggel kezelve

56

Alapvet WP7 vezrlk

Formzott szvegek megjelentse a RichTextBoxszal


A RichTextBox neve azt sugallja, hogy egy szvegbeviteli vezrlrl lehet sz, a helyzet azonban legalbb is jelen pillanatban nem ez. A RichTextBox WP7-es implementcija nem teszi lehetv szveg bevitelt vagy szerkesztst a felhasznl szmra, csupn arra ad lehetsget, hogy programozottan tltsk fel szveggel, illetve egyb elemekkel hivatkozsok, kpek stb. a vezrlt. Amellett, hogy az egyszer szvegeknl bonyolultabb elemeket is meg tud jelenteni, a RichTextBox igazi elnye, hogy a TextBlockkal ellenttben nem csupn egyfle formzst adhatunk az egsz szvegnek, hanem akr karakterenknt mst s mst (3-25 bra).

3-25 bra: Tbbflekppen formzott szveg egy RichTextBoxban A RichTextBoxot a szvegvezrlk csoportjban talljuk a Toolboxon. Amint elhelyeznk egyet a felleten, tartalma rgtn szerkeszthetv is vlik (3-26 bra). A szveg brmely rsze kijellhet, s tllthatak jellemzi. St, rgtn hivatkozst is befzhetnk a szvegbe, ha a Text csoportban lv fldgmb gombra kattintunk (3-27 bra).

3-26 bra: A szveg egy rsznek kijellse, hogy hivatkozss alaktsuk

3-27 bra A Create Hyperlink gomb s ablak Ahogy korbban a HyperlinkButton esetn, itt is meg kell adnunk a TargetName tulajdonsgot, hogy a hivatkozs tudja, milyen linket kell megnyitni. Sajnos erre a tervezfelleten bell nincs lehetsg, kzzel kell belerni a XAML-be. A tervezfellet jobb fels sarkban talljuk a nzetvlt ikonokat (3-28 bra), a legalsval vlthatunk osztott nzetbe, ahol egyszerre ltjuk a tervezfelletet, s a XAML-t.

57

3. Alkalmazsfejleszts Windows Phone-on

3-28 bra: A tervezfellet jobb fels sarkban tallhat nzetvlt gombok A XAML-ben meg kell keresni a Hyperlink elemet, s TargetName tulajdonsgnak a _blank rtket kell adni. Ha ezek utn fut az alkalmazs, a link mr jl fog mkdni ha megrintik, megnylik az Internet Explorerben a megadott weblap.

3-29 bra Osztott nzetben egyszerre ltjuk a tervezfelletet s a hozz tartoz XAML-t

Szvegbeviteli vezrlk
Szvegeket kirni mr tudunk, s a felhasznl klnbz parancsokat futtathat, vagy ppen vlaszthat lehetsgek kzl. De gyorsan szembe kerlnk azzal az ignnyel, hogy ne csak a felknlt lehetsgek kzl vlaszthasson, hanem maga adhasson meg valamilyen bemenetet, amit a program fel tud dolgozni. A Silverlight szmos specilisabb vezrlt knl a fejlesztknek, hogy megknnythessk a felhasznli adatbevitelt, de legltalnosabb adatbeviteli vezrl mindig is a TextBox marad.

58

Alapvet WP7 vezrlk

Szvegbevitel a TextBoxszal
A TextBox, avagy szvegdoboz segtsgvel a felhasznl a telefon virtulis vagy fizikai billentyzete segtsgvel adatokat vihet be az alkalmazsba. A TextBoxot, ahogy a kt elz vezrlnket is a szvegvezrlk csoportjban talljuk a Toolboxon (3-30 bra).

3-30 bra A TextBox helye a szvegvezrlk kztt, a Toolboxon Nem meglep mdon a TextBox vezrl Text tulajdonsgn keresztl rhetjk el, illetve kdbl itt llthatjuk be a szvegdoboz szvegt. Az IsReadOnly tulajdonsgval tehetjk csak olvashatv a szvegdobozt ilyenkor a felhasznl nem llthatja t a belert szveget. A MaxLength tulajdonsggal megszabhatjuk, hogy legfeljebb hny karaktert rhasson be a felhasznl a szvegdobozba. Programozottan ennl tbbet is meg lehet adni; a MaxLength csak a felhasznli adatbevitelt szablyozza.

3-31 bra A TextBox tulajdonsgainak belltsa a Properties panelen 59

3. Alkalmazsfejleszts Windows Phone-on Amikor a TextBox szvege megvltozik, elkaphatjuk a TextChanged esemnyt. Az albbi kdrszlet segtsgvel a felhasznl rhatja be az oldal cmt a korbban meghatrozott MaxLength miatt legfeljebb 10 karakterben. Ahogy gpel, az oldal cme automatikusan frissl.
private void tbTitle_TextChanged(object sender, TextChangedEventArgs e) { PageTitle.Text = tbTitle.Text; }

3-32 bra: Adatbevitel a TextBoxon keresztl

A virtulis billentyzet belltsa


Egy nhny colos billentyzeten gpelni sosem lesz annyira knyelmes s gyors, mint egy teljes rtk s mret fizikai billentyzeten tenni ugyanezt. Ha pldul tudjuk, hogy a felhasznl egy szvegdobozba csak szmokat fog gpelni, mirt neheztsk meg a dolgt egy teljes billentyzettel? Elg lenne a szmbillentyket megjelenteni! ppen ezrt, illetve, hogy esetleg megakadlyozzuk a felhasznlt rvnytelen adatok bevitelben, a Silverlight for Windows Phone 7 lehetv teszi, hogy nhny kattintssal pontosan bellthassuk a TextBox vezrlk virtulis billentyzett. Ezt az InputScope tulajdonsggal tehetjk meg (3-33 bra).

60

Alapvet WP7 vezrlk

3-33 bra: Az InputScope kivlasztsa egy TextBoxnl Ha pldul a Number belltst vlasztjuk, a felhasznl csak szmokat tud majd berni ebbe a szvegdobozba (3-34 bra).

3-34 bra: Number InputScope-ra belltott TextBox Ugyanezt termszetesen kdbl is bellthatjuk, gy akr futs kzben is vltoztathat egy TextBoxhoz rendelt billentyzet:
InputScope ins = new InputScope(); InputScopeName insName = new InputScopeName(); insName.NameValue= InputScopeNameValue.Number; ins.Names.Add(insName); tbTitle.InputScope = ins;

61

3. Alkalmazsfejleszts Windows Phone-on

Az InputScope rengeteg lehetsges rtket felvehet. Az albbi linken mindegyikrl tallhatunk egy rvid lerst: http://msdn.microsoft.com/enus/library/system.windows.input.inputscopenamevalue(v=vs.95).aspx

Jelszavak bevitele a PasswordBoxon keresztl


Ha alkalmazsunk vagy egy hozz kapcsold webes szolgltats jelszavas azonostst ignyel, legalbb egyszer a jelszt is be kell krni a felhasznltl. Ez trtnhet egy norml TextBoxon keresztl is, azonban ennek az a htrnya, hogy brki, aki ppen a felhasznl mgtt ll, lelesheti a jelszt a kijelzrl. (Azt most ne firtassuk, hogy ehhez olyan kzel kell llnia, hogy elkerlhetetlenl a felhasznl flbe szuszog!) Ilyen esetekre a megfelel megolds a PasswordBox hasznlata, mely egy specilis TextBox. Miutn a felhasznl bert egy karaktert, az mg egy msodpercig ltszik, aztn egy pttyre cserli le a PasswordBox, ezzel megakadlyozva, hogy a jelsz utlag visszaolvashat legyen. A PasswordBox is a szvegvezrlk csoportban tallhat (3-35 bra).

3-35 bra: A PasswordBox kivlasztsa a Toolboxrl A Password tulajdonsgon keresztl rhet el a bert jelsz, a PasswordChar tulajdonsggal pedig az alaprtelmezett pttyt cserlhetjk le egy neknk tetsz helyettest karakterre.

Listavezrlk
A vezrlk, amelyekkel eddig foglalkoztunk, egyetlen tartalmat tudtak megjelenteni. Bizonyos vezrlknl ez a Content tulajdonsgon keresztl megadott objektum, ms vezrlknl pedig a Text vagy Password tulajdonsgban megadott egyszer szveg. Mi a helyzet, ha nem egy elemet (szveget, sajt objektumot, brmit) szeretnnk megjelenteni, hanem tbb azonos tpus elemet? Erre a problmra szolgltatnak megoldst a listavezrlk. Ezekben kzs, hogy rendelkeznek egy Items nev tulajdonsggal, mely objektumok listja. Ezen keresztl adhatunk hozz elemeket a listavezrlhz, mely megprblja azokat legjobb tudsa szerint megjelenteni. A megjelents testreszabhat, erre a ksbbiekben mg kitrnk.

A ListBox hasznlata
A ListBox taln a legalapvetbb elemvezrl; a Toolboxon az ltalnos vezrlk kztt talljuk (3-36 bra).

62

Alapvet WP7 vezrlk

3-36 bra: A ListBox kivlasztsa a Toolboxrl A mkds megrtshez a 3-37 brn lthat, vgletekig egyszerstett tennival-listt valstjuk meg. Mindssze annyit tud, hogy a TextBoxba rt szvegeket a gomb megnyomsval a ListBoxhoz rendeli. (Az elemek trlse mr felras funkci.)

3-37 bra: A Todo-lista program kinzete A ListBox kijellse utn a Properties panelen sztnzve ismt a Common Properties csoport rejti a leggyakrabban hasznlt tulajdonsgokat. Az Items listn keresztl adhatunk elemeket a ListBoxhoz, a SelectionMode-dal pedig megadhatjuk, hogy tbb elem is kijellhet legyen-e. A SelectedIndex segtsgvel llthatjuk be, hogy hnyadik elem legyen alaprtelmezetten kijellve. A szmozs 0-tl indul, a -1 azt jelenti, nincs kijellt elem. (3-38 bra)

63

3. Alkalmazsfejleszts Windows Phone-on

3-38 bra: A ListBox tulajdonsgainak belltsa a Properties panelen Ha az Items melletti gombra kattintunk, az Object Collection Editor ablak jelenik meg, melyben szerkeszthetjk a ListBox tartalmt. Az Add another item gombra kattintva kivlaszthatjuk a ListBoxhoz hozzadni kvnt elem tpust. Egy stringet hozzadva (az mscorlib|Systemben talljuk) a szerkesztablak jobb oldaln megjelenik a karakterlnc, amit trhatunk. Az egyes elemek sorrendjt az ablak aljn lv nyilakkal vltoztathatjuk meg, illetve az X gombbal trlhetnk egy elemet (3-39 bra).

3-39 bra: Stringek hozzadsa a ListBox tartalmhoz A gomb Click esemnyre felrt esemnykezelvel hozzadhatjuk a felhasznl ltal megadott j elemet:

64

Adatkts

private void btnAddItem_Click(object sender, RoutedEventArgs e) { if (!string.IsNullOrWhiteSpace(tbNewItem.Text)) lbxTodo.Items.Add(tbNewItem.Text); tbNewItem.Text = string.Empty; }

A ListBox SelectionChanged esemnye akkor kvetkezik be, amikor megvltozik a kijellt elem. A SelectedItem tulajdonsgon keresztl rjk el a kivlasztott elemet (ha tbb is van, a SelectedItemsen keresztl kapjuk meg mindet). Az albbi kd egy MessageBoxban jelenti meg a felhasznl ltal kivlasztott elemet:
private void lbxTodo_SelectionChanged(object sender, SelectionChangedEventArgs e) { MessageBox.Show(lbxTodo.SelectedItem.ToString()); }

3-40 bra: Az alkalmazs mkds kzben Ahogy a 3-40 brn is lthat, a kijellt elem a telefonon belltott accent sznnel jelenik meg.

Adatkts
Az elz pldkban szerepeltek olyan kdrszletek, amelyek pusztn arra szolgltak, hogy frisstsk a felletet, megjelentsk rajta az j, megvltozott adatokat. A gomb megnyomsnak hatsra lefut esemnykezel nemcsak megnvelt egy rtket, hanem utna explicit mdon ki is rta a szmot a gombra. A TextBoxba rt szveg megvltozsakor lefut TextChanged esemny minden karakter letse utn frisstette az oldal cmt. Ezen kvl pedig ott volt mg a ListBox, amelybe kzvetlenl helyeztk bele az elemeket, holott, ha ksbb szerettk volna feldolgozni azokat, rdemesebb lett volna egy httrben lv, tpusos listba rakni ket, s ennek a listnak a tartalmt megjelenteni. A XAML-ben mlyen be van gyazva az adatkts technolgija. Az adatkts segtsgvel klnbz objektumokat, vezrlket tarthatunk automatikusan szinkronban. Ha valami megvltozik az egyik helyen, a vltozs azonnal megjelenik a msik helyen is, anlkl, hogy ehhez brmilyen kdot kellene rnunk.

Erforrsok
Vannak olyan rtkek (szmok, szvegek), objektumok, amelyeket nem csak egy helyen szeretnnk felhasznlni egy programban. rdemes lenne teht egyszer ltrehozni ket, s aztn az adott oldalon vagy az egsz programban jra s jra felhasznlni. Ez egyrszrl a memriafoglalst is cskkenti, msrszt pedig szinkronban tartja az sszes olyan objektumot, mely felhasznlja az erforrst. Knnyebb lesz 65

3. Alkalmazsfejleszts Windows Phone-on megtartani a program konzisztencijt, ha a vltoztats ignye esetn csak egy helyen kell frissteni egy adott objektumot. Ezeket a kzs hasznlat objektumokat definilhatjuk kdban, de tekintve, hogy gyakran maghoz a fellethez kthetk (pldul egy-egy vezrl httrsznt meghatroz Brush), XAML-ben is megadhatjuk ket. gy mg jobban elvlaszthat a fellet lersa a kdban megrt logiktl. Alkalmazsaink cme pldul nem vltozik, s ha tbb ablakbl ll egy alkalmazs, valsznleg mindegyik ablakban szeretnnk majd felhasznlni azt. Az ApplicationTitle TextBlockot a Properties panelen kivlasztva a Text tulajdonsg mellett tallhat Advanced options gombra kattintva megjelenik a men, melynek egyik eleme a Convert to New Resource nvre hallgat (3-41 bra).

3-41 bra: Erforrs ltrehozsa egy meglv rtkbl Erre kattintva alakthatjuk egy jrafelhasznlhat erforrss azt a stringet, amit ppen a Text tulajdonsg tartalmaz. A megjelen prbeszdablakban bellthatjuk az erforrs nevt (Name), illetve meghatrozhatjuk, hogy hol kerljn definilsra az erforrs: az oldalon vagy az alkalmazs szintjn. Ez meghatrozza azt is, hogy hol lesz lthat: elbbi esetben csak az aktulis oldalon bell, utbbinl viszont ha vannak ms oldalaink, azokban is elrhet lesz. A harmadik lehetsg, hogy egy erforrsknyvtrban (resource dictionary) hozzuk ltre. Az erforrsknyvtrak klnll XAML-fjlok, melyeket csak erforrsok trolsra szoks ltrehozni.

3-42 bra: Az erforrs nevnek s trolsi helynek belltsa

66

Adatkts Az is szrevehet, hogy a Blend nagyon szpen jelzi, hogy egy tulajdonsg nem loklisan kap rtket, hanem egy erforrshoz ktttk hozz (3-43 bra).

3-43 bra: A zld keret s ptty jelzi, hogy a tulajdonsg egy erforrsbl kap rtket Tovbb, ha tvltunk a Resources panelra, ott is megtallhat az erforrsok kztt az jonnan ltrehozott string. A ksz erforrs innen azonnal, drag-and-drop mdszerrel thzhat egy felleti elemre, ltrehozva ezzel az erforrshoz ktst (3-44 bra).

3-44 bra: Az adatforrsok a Resources panelon Ugyanezt elrhetjk, ha a kivlasztott tulajdonsg melletti Advanced optionsre kattintva a Local Resource menpont alatt kivlasztjuk a megfelel erforrst (3-45 bra).

3-45 bra: Mr ltez erforrs kivlasztsa egy tulajdonsghoz Ez egy nagyon hasznos lehetsg a XAML-ben, illetve a Silverlightban. Mi a helyzet akkor, ha nem egy elre elkszthet erforrshoz akarunk ktni, hanem valami mshoz, pldul egy CLR-objektumhoz, vagy ktst szeretnnk ltrehozni a UI klnbz elemei kztt? Erre szolgl megoldssal az adatktsi rendszer.

67

3. Alkalmazsfejleszts Windows Phone-on

Tbb vezrl ktse egyazon forrshoz


Tekintsk az albbi osztlyt:
public class Character { public string Name {get; set;} public string City {get; set;} public Character() { Name = "Hubert Farnsworth"; City = "New New York"; } }

Hozzunk ltre egy pldnyt ebbl az oldalon, s jelentsk meg mindkt tulajdonsgt egy-egy TextBlockban (3-46 bra)!

3-46 bra: A program fellete Ehhez kattintsunk a Data panelre, majd annak jobb fels sarkban a Create data source gomb alatt vlasszuk a Create Object Data Source pontot (3-47 bra)!

3-47 bra: Adatforrs ltrehozsa a Data panelen A Data panel tetejn tallunk egy msik gombot is, a Create sample data nevt. Ezzel vletlenszer mintaadatokkal feltlttt adatforrsokat hozhatunk ltre. Hasznos a fejlesztsnek abban a fzisban, ahol a tnyleges adatok mg nem llnak rendelkezsre. A megjelen ablakban vlasszuk ki a Character osztlyt, illetve adjuk meg az adatforrs nevt! (Ha mg nem jelenne meg az osztly, vagy hinyzik a program szerelvnye a listbl, fordtani vagy futtatni kell, s megjelenik.)

68

Adatkts

3-48 bra: Az adatforrs tpusnak kivlasztsa A Data panelen megjelenik az j adatforrs (3-49 bra). Drag-and-drop mdszerrel az egsz adatforrst vagy egyes rszeit rhzhatjuk egy felleti elemre, s ltrejn az adatkts (3-50 bra).

3-49 bra: Az j adatforrs tulajdonsgai a Data panelen

3-50 bra: Az adatforrs rszeinek adatktse drag-and-drop mdszerrel Szp, szp, de ha sok tulajdonsgot szeretnnk egyazon objektumrl megjelenteni, nem lehetne egy kicsit kzpontostani az adatktst? Termszetesen lehet. Vezrlink DataContext tulajdonsga szolgl 69

3. Alkalmazsfejleszts Windows Phone-on arra, hogy egy objektumot megadva neki belltsuk, hogy a vezrl vagy a benne lv vezrlk tulajdonsgai alaprtelmezetten milyen objektumra legyenek rktve. A DataContext rkldik lefel a vizulis fn, teht ha pldul a PhoneApplicationPage-en lltjuk be, automatikusan mindegyik, az oldalon lv vezrl kpes lesz adatot ktni hozz. A fenti kt TextBlock egy StackPanel gyermeke. Logikus teht, hogy a StackPanel DataContextjt lltsuk be a CharacterDataSource-ra, azaz az elbb ltrehozott Character objektumra, a kt TextBlock objektumot pedig ennek egyes tulajdonsgaihoz kssk hozz. Ehhez els lpsknt magt az adatforrst kell megfogni, s drag-and-drop mdszerrel a StackPanelre hzni. (rdemes nem a felleten, hanem az Objects and Timeline ablakon elengedni a vonszolt objektumot.) Ezek utn az egyik TextBlock Text tulajdonsga melletti Advanced optionsre kattintva a DataBinding menpontot kell vlasztani. A megjelen ablak automatikusan a DataContext flet nyitja meg, ahol kivlaszthatjuk, hogy a StackPaneltl rklt kontextus melyik tulajdonsgra szeretnnk a Textet ktni (3-51 bra).

3-51 bra: Adatkts ltrehozsa egy szl DataContextjn keresztl Tekintve, hogy Blendben az ember hajlamos mindent csak sszekattintgatni, itt mg nem olyan nagy a DataContext elnye a sok, egyenknt ltrehozott Bindinggal szemben, de ha kzzel szerkesztjk a XAML-t, felbecslhetetlen lehet, hogy nem kell egy-egy bonyolultabb adatktst jra s jra megrni, hanem elg egyszer ltrehozni, majd jval egyszerbb szintaxissal a fellet egyes rszeihez ktni.

Adatkts UI-elemek kztt


Az elz pldt egsztjk ki! A TextBlockok alatt egy ListBox foglal helyet, melyben Character tpus elemeket helyeznk el. Szeretnnk, ha a TextBlockokban a ListBox kivlasztott eleme jelenne meg. Teht arra van szksg, hogy a StackPanel DataContextjt most ne egy httrben lv objektumhoz kssk, hanem a ListBox kivlasztott elemhez; vagyis az adatktst kt UI-elem kztt hozzuk ltre. A Blend ehhez is hathats tmogatst nyjt. Elg a StackPanel DataContextjnl az Advanced options alatti Element Property Binding pontot vlasztani, s a ListBoxra kattintani (3-52 bra).

70

Adatkts

3-52 bra: Adatkts egy vezrlre A megjelen ablakban kivlaszthatjuk a tulajdonsgot, amelyre ktni szeretnnk (SelectedItem), valamint megadhatunk klnbz belltsokat, pldul a kts irnyt. Silverlightban hrom ktsi md van: a OneTime egy egyszeri kts, vagyis az adatok els, a forrsbl trtn kiolvassa utn nem lesz szinkronizls; a OneWay, ami egyirny kts, vagyis a forrs vltozsa kihat a clra; s a TwoWay, ahol a vltozskvets ktirny, teht a cl vltozsa is visszahat a forrsra. Mivel csak megjelenteni szeretnnk a szveget, tkletesen elg az alaprtelmezett OneWay kts (3-53 bra).

3-53 bra: Tulajdonsg s irny kivlasztsa adatktsnl Ezutn mr csak a TextBlockok Text tulajdonsgt kell a korbbiakban megismert mdon ktni. Mivel azonban a ListBoxban lv elemekrl statikusan semmit nem tudunk, a Create Data Binding ablakban nem kapunk segtsget, hogy kivlasszuk a Name vagy a City tulajdonsgokat. Az ablak als rszn tallhat szvegdobozban adhatjuk meg manulisan a tulajdonsg nevt (3-54 bra).

3-54 bra: Sajt elrsi t megadsa a forrstulajdonsgra

71

3. Alkalmazsfejleszts Windows Phone-on

A Blend s a Visual Studio XAML rtelmezje olyannyira kifinomult, hogy ha Name tulajdonsgot lt, nem enged sznet karaktert belerakni. Ha azt jelzi az IDE, hogy egy XAML-ben megadott string nem megfelel a Name tulajdonsgnak, vagy ne rakjunk bele sznetet, vagy vltoztassuk meg a Name-et msra! Emellett rhatunk morcos leveleket a Microsoftnak.

3-55 bra: A ListBox egy elemnek kivlasztsval a kt TextBlock tartalma frissl Ha teszteljk az alkalmazst, a kt TextBlock felirata automatikusan frissl, ahogy ms elemre llunk a ListBoxban (3-55 bra). Az adatktsi keretrendszernek alapvet rsze a vltozsokrl val rtests. Ezt a vezrlk esetben n. DependencyProperty-kkel szoks megoldani, az egyb tpusoknl pedig az INotifyPropertyChanged interfsz implementlsval. Utbbirl egy lers s plda: http://msdn.microsoft.com/enus/library/ms229614.aspx

Az adatok megjelensnek testreszabsa adatsablonokkal


Amikor szvegeket helyeztnk el a ListBoxban, azok gynyren megjelentek. Most, hogy a szvegnl bonyolultabb objektumokat (a Character osztly mr kt stringet is tartalmaz), mr nem mkdik annyira szpen a megjelents. Ez nem meglep: honnan tudn a Silverlight, hogy hogyan kell megjelenteni egy Character tpus pldnyt? Jobb hjn csak annyit tehet, hogy visszatr a klyhhoz: meghvja a szmra ismeretlen tpus objektum ToString metdust. Ennek eredmnyt lttuk a kpernyn. Hogyan tehetjk ezt szebb? Listavezrlink rendelkeznek egy DisplayMemberPath nev tulajdonsggal, mellyel megadhatjuk, hogy az objektum melyik tulajdonsga jelenjen meg a ToString hvsa helyett (3-56 bra).

3-56 bra: A DisplayMemberPath tulajdonsg belltsa

72

Az adatok megjelensnek testreszabsa adatsablonokkal Mivel a mobilkperny alapveten kicsi, gyakran elg lehet, ha egyetlen tulajdonsgot jelentnk meg. Sokszor viszont tbb adatot is szeretnnk megjelenteni egy elemrl. Ilyenkor hasznlhatunk adatsablonokat (data template). A ListBoxban lv elemek sablonjt gy vltoztathatjuk meg, hogy jobb gombbal a ListBoxra kattintunk, majd az Edit Additional Templates menpont alatt az Edit Generated Items (ItemTemplate) parancsot vlasztjuk. Ezen bell elsre csak a Create Empty vlaszthat, ezzel hozhatunk ltre j adatsablont (3-57 bra).

3-57 bra: Adatsablon ltrehozsa a ListBox elemeihez Ha a kvetkez ablakban (3-58 bra) megadjuk a sablon nevt, s azt, hol jjjn az ltre (az erforrsok ltrehozsbl mr ismers lehet), a tervezfellet sablonszerkesztsi mdba vlt (3-59 bra).

3-58 bra Az j adatsablon nevnek s helynek megadsa

3-59 bra A tervezfellet tetejn lthat breadcrumb jelzi, hogy sablont szerkesztnk Itt ugyangy rakhatjuk ssze a felletet, mint ahogy az oldalakt is tettk.

73

3. Alkalmazsfejleszts Windows Phone-on

3-60 bra: A Gridbl s az abban lv kt TextBlockbl ll adatsablon A 3-60 brn lthat, hogy kt TextBlock van a sablonban. A korbban megismert adatktsi eljrssal ez is knnyedn megoldhat. (Advanced options, Data Binding, Data Context, custom expression.)

3-63 bra: Az adatsablonnal megerstett program mkds kzben Az adatsablonok ha erforrsknt hoztuk ltre ket jra felhasznlhatak, teht a fent elksztettet tadhatjuk egy msik oldal msik ListBox objektumnak is.

A vezrlk kinzetnek testreszabsa vezrlsablonokkal


Adatok megjelenst mr testre tudjuk szabni. De mi a helyzet magukkal a vezrlkkel? A Silverlight vezrli jl testreszabhatak pusztn tulajdonsgaikon keresztl: elg belenzni a Brushes, Appearance s Layout csoportokba a Properties panelen. Azonban ha ez nem elg, akr teljesen ki is cserlhetjk megjelensket. A Silverlight (illetve eredetileg a WPF) vezrli kinzetmentes (lookless) vezrlk; a vezrlt ler osztly csupn a mkdst definilja, a kinzetet nem. Egy gomb mindssze, valami, amire r lehet kattintani esetnkben tapintani. Tartozik hozz egy alaprtelmezett kinzet

74

A vezrlk kinzetnek testreszabsa vezrlsablonokkal legtbbszr chrome-knt hivatkoznak erre , gy, ha mi nem szabjuk meg, hogy hogyan nzzen ki egy gomb, ezt az alaprtelmezett kinzetet kapja. Hogyan cserlhetjk le ezt az alaprtelmezett megjelenst? Az elz, adatktses alkalmazst kiegsztettk mg egy sorral, amivel j Charactereket lehet hozzadni a listhoz, illetve a lista kijellt elemt trlni (3-62 bra).

3-62 bra: j vezrlk az elz pldaalkalmazshoz Szeretnnk, ha a gombok kisebb feliratokkal jelennnek meg, s egy-egy kp is kapcsoldna hozzjuk. Ehhez testre kell szabnunk a vezrlt, mert jelen pillanatban nem tud kpet megjelenteni. Jobb egrgombbal kattintva az egyik gombra, az Edit Template menpontot kell vlasztanunk. Itt vagy egy res sablont hozhatunk ltre (Create Empty... a pldban ezt teszem), vagy a jelenlegit msolhatjuk le, s szerkeszthetjk. Ha mr van egy sajt sablon, akkor elrhetv vlnak az Edit Current (jelenlegi szerkesztse) s az Apply Resource (hasznlat erforrsknt) parancsok is.

3-63 bra Egy vezrl sablonjnak lecserlse resre A megjelen ablakban szoks szerint nevet adhatunk a sablonnak (erforrsnak), s kivlaszthatjuk a helyt (3-64 bra).

75

3. Alkalmazsfejleszts Windows Phone-on

3-64 bra Az j vezrlsablon nevnek s helynek megadsa Az res Gridben egy Image s egy TextBlock vezrlt elhelyezve (s tulajdonsgaikat megfelelen belltva) az alapvet elrendezs nhny msodperc alatt sszellthat; ugyangy mkdik, mint a korbbi adatsablon ltrehozsa. Kt dolog maradt mr csak htra: - kell egy kp az Image-nek, illetve - szeretnnk, ha a gomb szvege meg is jelenne.

Az els problma egyszeren megoldhat. A projektbe fel kell vennnk a megjelentend kpet, majd az Image vezrl Source tulajdonsgnl kivlasztani azt a lenyl listbl (3-65 bra).

3-65 bra: Kp kivlasztsa egy Image elem forrsul Ez egyszer volt, mert elre rendelkezsre llt a kp. Mi a helyzet a felirattal? Azt esetleg vltoztatni szeretnnk, vagy tbbnyelvv tenni, esetleg egyszeren csak nem akarjuk a vezrlsablonban rgzteni. A TextBlocknak meg kell mondani, hogy Text tulajdonsgban annak a Button vezrlnek a Content tulajdonsgt jelentse meg, amelyre ppen alkalmazzk elvgre egy sablont tbb gombra is r lehet majd hzni. Ehhez a TemplateBindingot hasznljuk fel. A TextBlock kijellse utn, a Text tulajdonsg melletti Advanced optionsre kattintva a Template Bindingot kell vlasztani. A megjelen listban a sablon clvezrljnek (esetnkben a Button) sszes olyan tulajdonsgt lthatjuk, melyre adatktst lehet ltrehozni (3-66 bra).

76

A vezrlk kinzetnek testreszabsa vezrlsablonokkal

3-66 bra: Vezrlsablon tulajdonsgnak a vezrlhz ktse a TemplateBinding segtsgvel A Content tulajdonsg kivlasztsa utn meg is jelenik az adatktst jelz srga keret, illetve a tervezfelleten ltszik, hogy a sablon mr a gombtl veszi a feliratt (3-67).

3-67 bra: A vezrlsablon tveszi a vezrltl az rtket Ugyanezeket a lpseket eljtszva, a kpet termszetesen egy msikra lltva a Hozzads gomb is megszpthet (3-68 bra). rdemes a kpeket Visual Studiban hozzadni a projekthez, mert a Blendben sajnos nem tudjuk Build Action tulajdonsgukat tlltani, ez pedig elengedhetetlen.

3-68 bra: Mindkt gomb kln sablonnal elltva Mivel most a kt gomb felptse tulajdonkppen ugyanaz, csupn a kpeik trnek el, rdemes sajt vezrlt kszteni, amelynek egy plusz ImageSource tulajdonsgot adunk, s az Image vezrl forrst erre ktjk r a TemplateBindinggal.

77

3. Alkalmazsfejleszts Windows Phone-on

Az alkalmazs llapotainak ltrehozsa VisualState-ek segtsgvel


A Silverlight 3 ta alkalmazsainkban klnbz vizulis llapotokat adhatunk meg, melyekben lerhatjuk a fellet elvrt llapott bizonyos helyzetekben. Ezzel kzpontosthatjuk a felletlerst, s az egyes llapotok kztti vlts is jelentsen leegyszersdik a korbbi mdszerekhez kpest. Vegyk pldnak az albbi egyszer alkalmazst! Kt gombbl ll, amelyek kt kphez kapcsoldnak olyan mdon, hogy ha a felhasznl megnyomja az egyik gombot, az egyik kp tnik el, ha a msikat, a msik kp. Emellett pedig a megnyomott gomb letiltott vlik, a msik pedig engedlyezett (3-69 bra).

3-69 bra: A VisualState-eket bemutat program kinzete s szerkezete Ezt az egyszer logikt lerhatjuk kdban is, de ha egy md van r, prbljuk meg elkerlni, hogy olyan kdot rjunk, ami a fellet megjelenst kzvetlenl befolysolja. Ehelyett a States panelen hozzunk ltre kt llapotot! VisualState-jeink csoportokba rendezhetk, ezrt elszr egy csoportot kell ltrehozni (3-70 bra).

3-70 bra: j llapotcsoport hozzadsa a States panelen A csoport ltrehozsa s elnevezse utn ltrehozhatjuk llapotainkat (3-71 bra). Az egy csoportban lv llapotok klcsnsen kizrjk egymst, teht az alkalmazs egy VisualStateGroupnak egyszerre csak egy VisualState-jben lehet.

78

Az alkalmazs llapotainak ltrehozsa VisualState-ek segtsgvel

3-71 bra: j llapot hozzadsa egy llapotcsoporthoz Vegyk szre, hogy amikor kijellnk egy VisualState-et, a tervezfellet llapotszerkesztsi mdba vlt, vagyis brmit vltoztatunk a felleten, az nem az alkalmazs norml llapotban fog megjelenni, hanem csak akkor, amikor ebbe az llapotba lp az alkalmazs. A States panel tetejn lv Base gombra kattintva trhetnk vissza brmikor az llapotokon kvli szerkesztshez (3-72 bra).

3-72 bra: Egy llapot szerkesztse kzben a tervezfellet piros keretet kap A vezrlk tltszsgt az Opacity tulajdonsggal tudjuk lltani. Ha egy llapot szerkesztse kzben 0%ra lltjuk az Opacity rtkt, a vezrl eltnik (3-73 bra).

3-73 bra: Az Opacity belltsa A gombokat az IsEnabled tulajdonsg lltsval engedlyezhetjk, illetve tilthatjuk. Meg kell oldani, hogy a gombnyoms hatsra lefusson az llapotvlts. Ezt megtehetjk kdban (a Click esemnykezelkben meghvjuk a VisualStateManager GoToState metdust, tadva neki a clllapot nevt), de ha tartjuk magunkat ahhoz, hogy deklaratv mdon szeretnnk a felletet lerni, akkor ms mdszerre lesz szksg. A Behaviork segtsgvel meglv vezrlkhz rendelhetnk hozz extra viselkedseket. Ha pldul arra van szksgnk, hogy egy gomb valamilyen esemnye hatsra (nem kell felttlenl a Clicknek lennie) egy llapotvltst vgezzen, a GoToStateActiont aggathatjuk r a gombra. A Behaviorket az Assets panel Behaviors listjban talljuk (3-74 bra).

79

3. Alkalmazsfejleszts Windows Phone-on

3-74 bra: A GoToStateAction Behavior az Assets panelen Innen egyszeren rhzhatjuk ket a gombokra. Ennek eredmnyt az Objects and Timeline ablakban is lthatjuk (3-75 bra).

3-75 bra: A GoToStateAction Behavior, miutn rdobtuk egy gombra A GoToStateActiont kivlasztva a Properties panelen bellthatjuk, hogy mely esemny hatsra (EventName) mely llapotba szeretnnk tvltani (StateName).

3-76 bra: A Behavior belltsa Ha futtatjuk az alkalmazst, s rkattintunk valamelyik gombra, az alkalmazs fellete rgtn abba a vizulis llapotba vlt, amelyet meghatrozunk a gomb szmra (3-77 bra).

80

Az alkalmazs llapotainak ltrehozsa VisualState-ek segtsgvel

3-77 bra: A program fellete rage llapotban

Animcik hozzadsa
Vannak esetek, amikor ennyi nem elg. Szpen, gyorsan, mindenfle kd nlkl ssze tudjuk lltani a felletet a klnbz llapotokban, de rezheten kicsit fapados a kinzet mkdse. Szebb lenne, ha pldul a kp nem egy pillanat alatt vltana t, hanem egy msodperc alatt elhalvnyulna, tszna a msik kpbe. Vagy pldul szeretnnk azt elrni, hogy mindig az a gomb legyen fell, amit a felhasznl megnyomhat s a gombok helycserje se pillanatszer legyen, hanem ltvnyos, animlt. Maga az animci egy tulajdonsg rtknek adott id alatti megvltoztatst jelenti. Korbban a legtbb fejleszteszkznl ennek a leprogramozsa teljes egszben a fejleszt feladata volt: msodpercenknt harmincszor feldobni egy esemnyt, abban pedig kiszmolni a vezrl aktulis elhelyezkedst, kinzett a kiindul- s a vgllapot kztt, s utna (gyakran pixelrl pixelre) kirajzolni a vezrlt. Mivel ennek az implementlsa rtkes idt vett el a fejleszttl, a Microsoft a WPF-fel eltrbe helyezte azt a megoldst, hogy az ehhez hasonl ltvnyelemeket ne imperatv kddal valstsa meg a fejleszt, hanem csak rja le (deklarlja), hogy mit is szeretne elrni. Vagyis az animcikat elg XAML-ben megfogalmazni: milyen tulajdonsgot, menyi id alatt, milyen vgrtkre szeretnk hozni. Ennek elnye, hogy gyorsan lerhat, s a httrben az erre optimalizlt keretrendszer elvgzi helyettnk a bonyolult kd megrst. A XAML elnye pedig, hogy knnyen generlhat A kt korbban ltrehozott VisualState egyikben cserljk fel a gombok helyzett! A lnyeg, hogy minden llapotban a msik llapotba vlt, engedlyezett gomb legyen fell! Ez a tervezfelleten, dragand-drop mdszerrel rhet el, de nem rt arra gyelni, hogy a megfelel llapot legyen kijellve, amikor a vltoztatsokat vgzi az ember. Ezutn csak annyit kell tenni, hogy az egyes llapotokat kivlasztva (States panel) az llapoton lv Add transition gombbal hozzrendelnk egy llapottmenet-animcit egy adott tmenethez. (A * Clllapot nev tmenet a brmely ms llapotbl az adott clllapotba trtn animlst jelenti.)

81

3. Alkalmazsfejleszts Windows Phone-on

3-78 bra: llapottmenet hozzadsa egy llapothoz Ha ltrejtt az animci, megadhatjuk, hogy mennyi ideig tartson (1s), illetve hogy milyen grbe mentn trtnjen (EasingFunction), ahogyan azt a 3-79 bra jelzi.

3-79 bra: Az id s az EasingFunction belltsa rdemes egy pillantst vetni az Objects and Timeline ablakra is. Amikor kijellnk egy llapottmenetet a States panelen, itt jelzi a Blend, hogy a felleten lv vezrlk kzl melyek animltak, s pontosan mely tulajdonsgaik. Ha valamelyik tulajdonsgot mgsem szeretnnk animlni, egyszeren trlhetjk innen az animcit (3-80 bra).

3-80 bra: Az animci megjelentse az Objects and Timeline panelen Mindezeket belltva a program tesztelhet: az llapotok kztti tmenet nem pillanatszeren megy vgbe, hanem egy msodperc alatt vltozik az Opacity rtke 1-rl 0-ra s vissza, s a gombok is egy msodperc alatt cssznak egyik helyrl a msikra. A VisualState-ek tmakre ennl termszetesen jval tereblyesebb. Nhny link a tovbblpshez: Mike Taulty bevezet screencastja a VisualState-ekhez: http://active.tutsplus.com/tutorials/silverlight/understanding-visual-states-in-silverlight/

82

Tmk hasznlata

VisualState-ek hasznlata egyni vezrlkben: http://www.timmykokke.com/2010/11/using-visualstates-in-custom-controls-in-silverlight/

Tmk hasznlata
Ha szeretnnk, hogy alkalmazsaink illeszkedjenek a Windows Phone 7 megjelensbe, a chooserek, launcherek (vlasztk s indtk) hasznlata, illetve egyb opercis rendszerszint integrcik elvgzse eltti els lps, hogy a felletet konzisztenss tesszk magval az opercis rendszerrel. Mi a helyzet pldul, ha egy adat- vagy vezrlsablonban szeretnnk felhasznlni azt a sznt, amelyet a felhasznl belltott a rendszer alapsznnek? Vagy szeretnnk egy szveget pontosan azzal a bettpussal s betmrettel megjelenteni, amelyet az oldalak cmnl hasznlnak az alkalmazsok? Nem kell pontosan tudnunk, hogy ezek a mretek, sznek, bettpusok milyenek is. A Silverlight az sszes rendszerszint alapbelltst erforrsknt elrhetv teszi szmunkra. Mindssze annyit kell tennnk, hogy a kivlasztott tulajdonsg kapcsn nhny kattintssal belltjuk, hogy az egy ilyen erforrst hasznljon. Az albbi pldban a legutbbi program (troll s rage) oldalcmnek sznt lltjuk be a telefonon kivlasztott alapsznre. A PageTitle TextBlock kijellse utn a Brushes csoportban tallhat Foreground tulajdonsggal llthat be egy szveg betszne (3-81 bra).

3-81 bra: A sznek belltsa a Properties panelen Ahogy szinte minden, ez is adatkthet. A mellette lv Advanced options gombra kattintva ezttal a System Resources listbl kell vlasztani. Ez a lista felsorol minden olyan rendszerszint erforrst, amelynek tpusa megegyezik a belltani kvnt tulajdonsg tpusval. A PhoneAccentBrush az a szn, amely az opercis rendszernek a felhasznl ltal brmikor tllthat alapszne (3-82 bra).

3-82 bra: A PhoneAccentBrush rendszerszint erforrs kivlasztsa

83

3. Alkalmazsfejleszts Windows Phone-on Ennek kivlasztsa utn ha elindtjuk az alkalmazst lthat, hogy a PageTitle-ben megjelen felirat mindig az opercis rendszer sznsmjt kveti (3-83 bra).

3-83 bra: A PageTitle a telefon aktulis accent sznvel jelenik meg

sszefoglals
Ebben a fejezetben rviden megismerkedhettnk a Silverlight grafikus felhasznli felletnek alapvet elemeivel. Szmba vettk a leggyakrabban hasznlt parancsvezrlket, szvegmegjelentsi s szvegbeviteli vezrlket, valamint a tbb elem megjelentsre kpes listavezrlket. Ezutn ttekintettk, hogy a beptett vezrltpusokon milyen szolgltatsokat tesz elrhetv a Silverlight, hogy gazdag tartalm s tuds felleteket pthessnk. Megismerkedtnk az adatkts fogalmval s az adatktsi keretrendszer hasznlatval. Megnztk, hogyan lehet adat- s vezrlsablonokkal testre szabni egy adattpus megjelenst, illetve hogy hogyan cserlhetjk le egy vezrl kinzett a neknk megfelelre. Ezutn zeltt kaptunk a vizulis llapotok hasznlatbl, az animcibl, s megnztk, hogyan lehet felhasznlni az opercis rendszer vizulis erforrsait sajt alkalmazsainkban. Mindezt a Visual Studio nlkl, kizrlag Expression Blend felhasznlsval tettk meg, szinte teljes egszben elhagyva a sajt kd megrst a felhasznli fellet elksztsnl.

84

4. Halad alkalmazsfejleszts Windows Phone-on


Az elz fejezetekben megismerkedhettnk azokkal az elvekkel s vezrlkkel, amelyek mindenkppen szksgesek egy Windows Phone 7 alkalmazs fejlesztshez. Ebben a fejezetben olyan eszkzket fogunk ttekinteni, amelyek a platform lehetsgeit mg jobban kihasznljk a Metro felhasznli fellettel konzisztens mdon. A fejezet els rszben a trkpek megjelentst, testreszabhatsgt vesszk t, majd rtrnk a tartalmak rendszerezsre. Erre kt mdszert alkalmazunk: a tartalomegysgeket az egyik esetben kln oldalakon jelentjk meg az ezek kzti informcicsere biztostsval , mg a msik esetben egy oldalon, a horizontlis strukturlst lehetv tev Panorama s Pivot vezrlk segtsgvel. Vgl megismerkednk a Silverlight Toolkit Windows Phone 7-hez tartoz rszeivel, amelyek amellett, hogy szmos j elemmel egsztik ki eszkztrunkat, segtenek a platformhoz ill felhasznli felletek s interakcik megteremtsben is.

Trkpek kezelse
A Microsoft az utbbi vekben folyamatosan nvekv erfesztseket fektet online szolgltatsainak tovbbfejlesztsbe, amelyek egyik megtesteslse a Bing Maps szolgltatscsomag. Ez a csomag azon tl, hogy teljes vilgtrkpet tartalmaz, amit kedvenc keresnket alkalmazva cmkeressre, tvonaltervezsre, forgalomadatok szerzsre hasznlhatunk, lehetv teszi, hogy ezeket a trkpeket s a kiegszt szolgltatsokat sajt alkalmazsainkban is elrhetv tegyk. Pldul, egyszeren tudunk kiemelt helyeket (Point of Interest, POI) megjelenteni, ezek kztt optimlis tvonalat tervezni, a webes verziban is fellelhet ktfle nzet kztt vltogatni, s mindezt a Silverlightban megszokott teljes testreszabhatsg megtartsval tehetjk. Egyszer DataTemplate definilsval ltrehozhatunk akr egy olyan oldalt, amely megadott pozcikat pushpin-ekkel (gombost, rajzszeg) emel ki, mgpedig gy, hogy ez a jells tvolrl csupn egy szvegdobozbl lljon, de amint a felhasznl rkzelt a terletre, ez kiegszl egy kppel, akr teljesen kicserldik egy videolejtszra. De termszetesen itt a fejleszt teljes szabadsgot kap, ha akarunk, bngszket vagy a Mango ta XNA jtkokat is megjelentnk a kiemelt helyeken, de valsznleg nem baj, ha ezekkel a lehetsgekkel nem mindig lnk.

Feliratkozs a szolgltatsra
A szolgltats ignybevtelhez elszr regisztrlnunk kell a https://www.bingmapsportal.com/ weblapon. Egy Live Id-t felhasznlva jelentkezznk be s fogadjuk el a feltteleket! Itt kivtelesen rdemes elolvasni a feltteleket tartalmaz dokumentumot, mivel igen szigor szablyok vonatkoznak pldul a telefonos felhasznlsra, amikbe jobb nem egy esetleg tbb hnapon t tart fejleszts vgn belefutni. Pr ezek kzl: Nem rhatunk vals idej navigcit megvalst alkalmazst. A programunk nem mkdhet egytt ms trkpszolgltatsokkal. A kzlekedsi adatok nem hasznlhatk televzi, rdi, jsg, azaz mdia esetben. Nem trolhatunk kzlekedsi adatokat. Nem hasznlhatunk pornogrf pushpineket.

85

4. Halad alkalmazsfejleszts Windows Phone-on Mindenesetre ha ezek utn is akarunk trkpeket hasznlni, s elfogadtuk a feltteleket, akkor ltrejn szmunkra egy felhasznli fik. Ehhez a fikhoz alkalmazsokat regisztrlhatunk, ha a men Create or view keys elemre klikkelnk, ahogyan azt a 4-1 bra is mutatja.

4-1 bra: Bing Maps kulcs ltrehozsa A kitltst kveten meg is kapjuk az alkalmazs kulcst, ez az, amire majd szksgnk lesz a Bing Maps vezrl ltrehozsakor (lsd a 4-2 brn).

4-2 bra: A kapott kulcs, erre szksgnk lesz a kliens hitelestshez

A Bing Maps vezrl hasznlata


Hozzunk ltre egy j Windows Phone Application projektet Visual Studioban, nevezzk el Advanced Development-nek! A Toolboxot kinyitva lthatjuk, hogy mr az alap SDK-ban is megtallhat a szmunkra fontos Map vezrl (4-3 bra), teht a referencia hozzadsval sem kell majd bajldnunk.

4-3 bra: A Map vezrl megtallhat a Toolboxban Ha drag-and-drop mdszerrel hozzadjuk ezt a vezrlt a megnyitott oldalunkhoz, akkor annak nvtere automatikusan belekerl a XAML kdba. Ezt termszetesen kzzel is megtehetjk az albbi kd segtsgvel:
xmlns:maps="clrnamespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps"> ... <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <maps:Map /> </Grid>

A kd futtatsakor mr lthatjuk is, hogy a Bing Maps vezrl megjelenik. Ha nagytunk, megprbljuk mozgatni a trkpet, akkor a vezrl elkezd kommuniklni a szolgltatssal, aminek els feladata a kliens hitelestse lesz. Mivel mg nem adtuk meg a regisztrcikor kapott kdot, ez meg fog hisulni, amit a trkp kzepn megjelen hibazenet tudat velnk, amint az a 4-4 brn lthat.

86

Trkpek kezelse

4-4 bra: A trkp, kzpen a hitelests hinyt jell hibazenettel lltsuk be teht a hitelestshez szksges kulcsot a vezrl tulajdonsgai kztt, s nevezzk is el a trkpet!
<maps:Map Name="myMap CredentialsProvider="Ajdyq5FaN2RZvzvogm_....."/>

Ennek hatsra a figyelmeztets eltnik, s rendesen hasznlhatjuk a vezrlt. Adjunk meg egy kzppontot a trkpen a Center tulajdonsg segtsgvel! Ez a tulajdonsg GeoCoordinate tpus, s XAML kdbl a pozcit ler koordintkat is felhasznlhatunk az rtkads sorn. A vezrl viszont mg ezt kveten is a teljes vilgtrkpet fogja megjelenteni, fggetlenl a Center pozcitl, hiszen nem lltottuk mg be a nagyts fokt. Ezt a ZoomLevel megadsval vltoztathatjuk meg:
<maps:Map Name="myMap" CredentialsProvider="Ajdyq5FaN2RZvzvogm_... " Center="47.639655,-122.129404" ZoomLevel="17" />

Az egyszerbb felhasznls kedvrt s a tesztels miatt is rdemes megjelenteni a ZoomBar gombjait. Ezek az emultoron klnsen hasznosak tudnak lenni a kicsinyts s nagyts gombokkal val vezrelhetsge miatt:
ZoomBarVisibility="Visible"

A trkp kt klnbz mdban jelenhet meg:


RoadMode: Ebben az esetben nem a mholdkpekkel tallkozhatunk, hanem az ezek alapjn

ksztett, csak az utakra sszpontost nzetet kapunk. Ez az alaprtelmezett md.


AerialMode: Teljes mholdkpek, amelyeken az elz nzet tvonalai termszetesen

ugyangy ki vannak emelve. A mdok kztti vltshoz egy kicsit tbbet kell dolgoznunk, ugyanis a trkp Mode tulajdonsga egy olyan objektumpldnyt vr, ami a MapMode osztlybl szrmazik ez a megjelentshez szksges 87

4. Halad alkalmazsfejleszts Windows Phone-on rtkeket, belltsokat tartalmazza. Az elbb lert mdok hasznlathoz szerencsre lteznek elre definilt osztlyok, azokat csak pldnyostani kell, pldul az albbi mdszerrel:
using Microsoft.Phone.Controls.Maps; //... public MainPage() { InitializeComponent(); myMap.Mode = new AerialMode(); }

Termszetesen erre ugyangy lehetsgnk van a XAML lersbl is:


<maps:Map Name="myMap" CredentialsProvider="Ajdyq5FaN2RZvzvogm_..." Center="47.639655,-122.129404" ZoomLevel="17" ZoomBarVisibility="Visible"> <maps:Map.Mode> <maps:AerialMode /> </maps:Map.Mode> </maps:Map>

Tntessk mg el a Bing logojt s copyright feliratt a LogoVisibility s CopyrightVisibility Collapsed-re lltsval! Ha mindennel vgeztnk, akkor a teljes eddigi kdunk (a nvtr defincija mellett) csupn ennyi:
<maps:Map Name="myMap" CredentialsProvider="Ajdyq5FaN2RZvzvogm_..." Center="47.639655,-122.129404" ZoomLevel="17" ZoomBarVisibility="Visible" LogoVisibility="Collapsed" CopyrightVisibility="Collapsed"> <maps:Map.Mode> <maps:AerialMode /> </maps:Map.Mode> </maps:Map>

A kd hatsra meg is jelenik egy teljes funkcionalitssal br trkp, kzpen a Microsoft fhadiszllsval, amint az a 4-5 brn lthat.

88

Trkpek kezelse

4-5 bra: A trkp pozicionlva s nagytva Aerial mdban

Pushpinek
Egy trkp mit sem rne kiemelt informcik, cmek, megjellt pozcik nlkl. Ennek eszkze a szintn a Maps vezrl nvtrhez tartoz Pushpin osztly. Ez egyszeren, csupn koordintk s kirand szveg megadsval hasznlhat vezrl, viszont szksg esetn a Silverlightban megszokott knnyedsggel testre is szabhatjuk azt. Ezeket a pushpineket akr egyesvel, XAML vagy C# kdbl hozzadogathatjuk a trkphez, de akr dinamikus listkat is kthetnk a vezrlhz. Egy Pushpin felvtele XAML-ben az albbi mdon trtnhet:
<maps:Pushpin Location="47.639655,-122.129404" Content="Microsoft" />

Ugyanez a feladat kdban az osztly pldnyostsval s a trkp Children kollekcijhoz val hozzfzssel jr:
myMap.Children.Add(new Pushpin { Location = new System.Device.Location.GeoCoordinate(47.63876, -122.12862), Content = "C#" });

Az gy kapott jellseink vgtelenl egyszerek, csupn a tartalomnak belltott szveget mutatjk az adott pozcin, amint azt a 4-6 bra is mutatja.

4-6 bra: Egyszer Pushpinek a trkpen

89

4. Halad alkalmazsfejleszts Windows Phone-on A megjelents felldefinilsa a XAML lersbl egyszerbb, ugyanis itt csupn a Content attribtumszer rtkadst kell kicserlni az n. property element szintakszissal val lersra:
<maps:Pushpin Location="47.639655,-122.129404" Background="Transparent"> <StackPanel> <TextBlock Text="MS" HorizontalAlignment="Center" /> <Image Source="http://www.deviantart.com/download/128133698/ Windows_Vista_Icon_HD_by_magbanuamicah.png" Width="50" /> </StackPanel> </maps:Pushpin>

Ezzel a kis mdostssal mr teljesen kzben tarthatjuk a pushpin megjelentst, az itt alkalmazott kd pldul a 4-7 brn lthat kinzetet eredmnyezi.

4-7 bra: Testreszabott Pushpin

Rtegek alkalmazsa
Sokszor elvrt funkcionalits a kiemelt helyek szrse egy adott kategria alapjn (pldul a krnyez kocsmkat jelentsk meg, a benzinkutakat rejtsk el), vagy akr teljes kikapcsolsa. Ez a POI-k egyszer hozzadsval krlmnyes lenne, azonban rtegekbe rendezve a megjelentett tartalmat a feladat sokkal egyszerbb vlik. Ennek kiprblsra hozzunk ltre egy POI osztlyt, ami tartalmaz egy pozcit, valamint a hely megjellst. Ennek pldnyait kt listba, a benzinkutak s a brok listjba fogjuk sorolni:
public class POI { public GeoCoordinate Location { get; set; } public string Name { get; set; } }

A pldnyokat egy privt, csak olvashat lista tartalmazza, amit az oldal ltrehozsakor tltnk fel pr elemmel, s egy publikus, csak get metdussal rendelkez tulajdonsgon keresztl rnk el. Egy vals projektben a listkat termszetesen brmilyen adatforrs vagy webszolgltats elllthatja. Az adatkts miatt hasznljunk ObservableCollection tpust, br itt ennek elnyeit nem fogjuk kihasznlni:
private readonly ObservableCollection<POI> _pubs = new ObservableCollection<POI> { new POI { Location= new System.Device.Location.GeoCoordinate(47.640055,-122.120204), Name = "Old Man's" }, new POI { Location = new System.Device.Location.GeoCoordinate(47.63876, -122.12862), Name = "Oport" } };

90

Trkpek kezelse

public ObservableCollection<POI> Pubs { get { return _pubs; } }

Most, hogy ellltottuk a megjelentend listt, hozzunk ltre egy j rteget a trkpen bell:
<maps:MapLayer Name="lPubs"> <maps:MapItemsControl ItemsSource="{Binding Pubs}"> <maps:MapItemsControl.ItemTemplate> <DataTemplate> <maps:Pushpin Location="{Binding Location}"> <StackPanel> <TextBlock Text="{Binding Name}" HorizontalAlignment="Center"/> <Image Source="Images/Beer.png" Width="50" /> </StackPanel> </maps:Pushpin> </DataTemplate> </maps:MapItemsControl.ItemTemplate> </maps:MapItemsControl> </maps:MapLayer>

A rteget egy MapLayer pldny reprezentlja, ennek egy nevet is adtunk, hogy ksbb tudjunk r hivatkozni. Ezen bell a MapItemsControl teszi lehetv azt, hogy ne csak egy-egy elemet jelentsnk meg, hanem az egsz lista tartalmt, mghozz gy, ahogyan azt az ItemTemplate rszben meghatrozzuk. A kdban egy PushPin-t tznk ki a Location ltal meghatrozott pozcira. Ez tartalmazza a hely nevt, valamint egy olyan kpet, amit korbban az Images mappba mentettnk. Kpeknl a Build Actiont rdemes Contentre lltani, mivel ekkor a mdiaelem nem lesz a szerelvny rsze, hanem a .xap csomag egy mappjba kerl. gy a relatv hivatkozsok rvn knnyebb azt felhasznlni programunkban. Ha kdunkat gy prbljuk futtatni, akkor a POI-k mg nem fognak megjelenni a trkpen, hiszen hivatkoztunk ugyan a bektend adatokra, de magt az adatktst mg nem vgeztk el. Legegyszerbb, ha ezt most az oldal konstruktorban tesszk meg az albbi kddal:
public MainPage() { InitializeComponent(); this.DataContext = this; }

Most futtatva a programot a definilt POI-k mr meg is jelennek (4-8 bra). Az elz mdszerhez hasonlan hozzunk ltre egy listt, ami pldul benzinkutakat tartalmaz:

91

4. Halad alkalmazsfejleszts Windows Phone-on

4-8 bra: A pozci-listk a trkpen megjelentve Ahhoz, hogy kihasznljuk a rtegek elnyeit, helyezznk el kt gombot az ApplicationBar-on, melyekkel a megfelel rteg megjelentst tudjuk ki-be kapcsolni:
<phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> <shell:ApplicationBarIconButton IconUri="/Images/beer.png" Text="Brok" Click="Pubs_Click"/> <shell:ApplicationBarIconButton IconUri="/Images/petrol.png" Text="Benzin" Click="PetrolStations_Click"/> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar>

A gombokhoz tartoz esemnykezelk elvgzik a rteg Visibility tulajdonsgnak tbillentst:


private void Pubs_Click(object sender, EventArgs e) { if (lPubs.Visibility == System.Windows.Visibility.Visible) { lPubs.Visibility = System.Windows.Visibility.Collapsed; } else { lPubs.Visibility = System.Windows.Visibility.Visible; } }

A benzinkutak rteghez kapcsold PetrolStations_Click kdja teljesen hasonl ehhez. Eddigi munknk vgeredmnye teht egy olyan trkp, amely kt kln rtegen jelent meg testreszabott pushpineket, valamint a lenti vezrlgombokkal ezeknek a rtegeknek a megjelentst vltogathatjuk, amint azt a 4-9 bra mutatja.

92

Trkpek kezelse

4-9 bra: Gombok az ApplicationBaron a rtegek megjelentsnek szablyozsra

Egyb szolgltatsok
A trkpen kvl szmos egyb rendkvl hasznos szolgltatst knl szmunkra a Bing Maps. Gyakorlatilag az sszes fbb funkci, amit egy trkpprogramtl elvrhatunk, szabvnyos SOAP webszolgltatsokon keresztl elrhet a fejlesztk szmra. Nhny fontosabb ezek kzl: Geocode Service Cmek, nevezetes helyek, fldrajzi nevek keresse, koordintkk alaktsa vagy koordintk alapjn ezek kinyerse. Route Service tvonalak tervezse ltalunk megadott kztes pontok kztt. Azaz nem csupn kezd- s vgpontot adhatunk meg, hanem rintett pozcik egsz listjt. Ezen a listn a tervez algoritmus sorban vgigmegy, majd ezt a grfot bejr ponthalmazt ad vissza neknk. Lehetsgnk van az utazs mdjnak belltsra (gyalog / autval), valamint meghatrozhatjuk, hogy milyen szempontbl keressen optimlis eredmnyt (sebessg, tvolsg, st akr a forgalmi helyzettel val szmolst is krhetjk). Search Service Nevezetes helyek, pldul ttermek, mozik keresse ez pozcihoz is kthet.

A fenti szolgltatsok az albbi cmeken rhetk el: Szolgltats Geocode Service Route Service Search Service Cm
http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc http://dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc

A szerverrel val kommunikcirl bvebben a 9. fejezet szl, itt csak a feladathoz szksges mlysgig rintjk a tmt. A szolgltatsok hozzadshoz kattintsunk a projektre az egr jobb gombjval, majd a felugr listn vlasszuk az Add Service Reference opcit (4-10 bra)!

93

4. Halad alkalmazsfejleszts Windows Phone-on

4-10 bra: Szolgltats referencijnak hozzadsa Az itt felugr ablakon adjuk meg a vlasztott szolgltats cmt, majd kattintsunk a Go gombra (4-11 bra)! Ekkor a Visual Studio lekri a cm mgtt lv szolgltats WSDL lerst, s kiolvassa belle az elrhet interfszeket s azokon bell a felknlt funkcikat. A dialgusban lv Discover gomb lehetsget biztost, hogy a krnyezet a mi sajt Solutionnkn bell keressen elrhet szolgltatsokat, de mi itt csak kliens alkalmazst fejlesztnk, gy erre nem lesz szksgnk.

4-11 bra: A szolgltats lersa alapjn a Visual Studio felismeri az elrhet funkcikat

tvonaltervezs
A tblzatbl vlasszuk ki a Route Service-t, s ennek cmt adjuk meg az Add Service Reference dialgusban! A generlt osztly nvtere legyen RouteService! Az OK gombra kattintva ltrejnnek a kapcsolatot felpt s a kommunikcit biztost osztlyok. Ezt kveten pldnyostssal ltrehozhatunk egy proxy objektumot, amelynek metdusai a szolgltatst cmzik meg, gy a tvoli metdusokat egyszer fggvnyhvsokkal rhetjk el programunkbl. Hozzuk is ltre ezt a proxyt a MainPage konstruktorban! Ahhoz, hogy a keretrendszer megtallja ezt az osztlyt, termszetesen a RouteService nvteret fel kell vennnk egy using taggal a file elejn:
public MainPage() { InitializeComponent(); this.DataContext = this; RouteServiceClient proxy = new RouteServiceClient(); }

Ezeknl a szolgltatsoknl szintn szksgnk lesz arra az azonostra, amit a Bing Maps regisztrcijnl kaptunk. Ezt rdemes egy kln vltozban trolni, a MainPage osztly elejn. Itt mr nem hasznlhatjuk a XAML-ben rendelkezsnkre ll egyszerstett rtkadst, ehelyett egy Credential tpus objektumot is ltre kell hoznunk: 94

Trkpek kezelse

private const string credStr = "Ajdyq5FaN2Rzvzvogm_... "; private readonly Credentials cred = new Credentials { ApplicationId = credStr};

Trjnk vissza ezutn a konstruktorba, s lltsuk ssze az tvonaltervezshez szksges krst! Szksgnk lesz egy olyan objektumra, ami a kalkulci szempontjait definilja. Erre a RouteOptions osztlyt alkalmazhatjuk, amelyben az egyb belltsok mellett arra mindenkpp figyeljnk, hogy a RoutePathType tulajdonsgot lltsuk a RoutePathType enumerci Points elemre, mivel ez alaprtelmezs szerint None, azaz az rintett pontok lekrdezst kln ignyelnnk kell!
var options = new RouteOptions { // a pontok listjt ignyelnnk kell! RoutePathType = RoutePathType.Points, // leggyorsabb tvonal keresse Optimization = RouteOptimization.MinimizeTime, // forgalom alapjn is optimalizljon az idre TrafficUsage = TrafficUsage.TrafficBasedTime, // autval kzlekednk Mode = TravelMode.Driving };

Ezzel a konfigurcival teht olyan tvonalat keresnk, amely a majd tadott pontok kztt autval a lehet leggyorsabban bejrhat gy, hogy a jelenlegi forgalmi helyzetet is figyelembe vesszk. A krsre adott vlasz az egyb fontos informcikon fell tartalmazni fogja az rintett pontok listjt is. Ez a lista az t trspontjait rja le, vagyis azokat a pontokat, amelyeket csupn egyenesekkel ssze kell ktnnk s fel kell rajzolnunk a trkpre. Hozzuk most ltre a bejrand pontok listjt! Ez egy szintn a RouteService nvtrben (vagy amilyen nevet a szolgltats referencijnak hozzadsnl vlasztottunk) lv osztly, a WayPoint pldnyait jelenti. Itt tartalmazzon csak kt elemet, a kiindulsi s az rkezsi pontot:
// rintett pozcik var points = new ObservableCollection<Waypoint> { // kezdpont new Waypoint{Location = Pubs[0].Location}, // vgpont new Waypoint{Location = PetrolStations[0].Location} };

A konfigurcis objektumok ltrehozsa utn mr elllthatjuk azt a krst, amit a szolgltats mr fel tud dolgozni:
var request = new RouteRequest { Credentials = cred, Options = options, Waypoints = points };

Mieltt megprblkoznnk az tvonal ellltsval, ksztsk fel a megjelent felletet az adatok fogadsra. A XAML-ben keressk ki jra a trkp lerst, s egsztsk ki az albbi sorokkal:

95

4. Halad alkalmazsfejleszts Windows Phone-on

<TextBlock Name="tbDistance" /> <maps:MapPolyline Name="lRoute" Stroke="#FF2C76B7" Opacity="0.85" StrokeThickness="6" />

A tbDistance fogja megjelenteni az tvonal hosszt, az lRoute nev MapPolyline objektum pedig felrajzolja azt. Ehhez csupn a vezrl Locations tulajdonsgt kell belltani egy ObservableCollection<Waypoint> pldnyra, aminek elemeit hasznlva rajzolja majd ki az t szakaszait.

A szolgltats meghvsa
WP7 esetben a WCF automatikusan aszinkron mveleteket generl a szolgltatssal val kommunikcira. Ennek nagy elnye, hogy a felhasznli fellet nem ll le arra az idre, amg a krsnkre ellltott vlasz megrkezik, azaz a kszlk vgig vlaszra ksz marad. Ennek kvetkezmnye, hogy azonnali visszatrsi rtkkel nem rendelkeznek a fggvnyek, ehelyett az eredmny elkszltt jelz esemnyek argumentumaiknt juthatunk hozz az ignyelt adatokhoz. Ennek szellemben rjuk meg a lekrdezst:
proxy.CalculateRouteCompleted += (s, e) => { tbDistance.Text = e.Result.Result.Summary.Distance.ToString(); var lc = new LocationCollection(); foreach (var item in e.Result.Result.RoutePath.Points) { lc.Add(item); } lRoute.Locations = lc; // pozcionljuk a trkpet az tvonalra! myMap.SetView(e.Result.Result.Summary.BoundingRectangle); };

A CalculateRouteCompleted esemnykezelje az egyszersg kedvrt lehet helyben definilt anonim metdus is. Ennek e paramtere egy CalculateRouteCompletedEventArgs tpus objektum, ami tartalmazza a mvelet vgrehajtst ler adatokat(pl. sikeres volt-e), valamint a kalkullt tvonal rszleteit. A Summary tulajdonsgon keresztl elrhetjk a szakaszok egyttes hosszt, az ennek megttelhez szksges idt, valamint egy BoundingRectangle nev elemet, ami annak a tglalapnak az szakkeleti s dlnyugati koordintjt tartalmazza, amely magba foglalja a teljes tvonalat. A pontok halmaza sajnos ms tpusban rkezik, mint amit a megjelent elem vr, de ezt egy konverzis ciklussal orvosolhatjuk. Ezen kvl minden adat ktse egyrtelm. Miutn ezeket a mveleteket elvgeztk, lltsuk a trkp nzett a visszakapott BoundingRectangle-re! Nincs ms htra, indtsuk el az aszinkron krst!
// krs indtsa proxy.CalculateRouteAsync(request);

Fordtsuk le s futtassuk a projektet, s nzzk meg, hogy hogyan jelenik meg mindez az emultoron (412 bra)!

96

Navigci

4-12 bra: Az tvonaltervezst is tartalmaz ksz alkalmazs Az brn lthat, hogy a teljes tvonal kkkel kiemelve ltszik, a bal fels sarokban pedig megjelenik a szakaszok egyttes hossza.

Navigci
A tartalom rendszerezsnek egyik magtl rtetd eszkze nll oldalak ltrehozsa. Az oldalak klnll egysgeket alkotnak, azonban ahogyan weblapok esetben is, itt is gyakran szksges valamilyen kommunikcit biztostani a lapok kztt. Ebben a rszben ezeket a lehetsgeket fogjuk ttekinteni.

Oldalak
Minden Windows Phone 7 projekt a ltrehozsakor kt XAML llomnnyal rendelkezik: egy MainPage nev oldallal s egy alkalmazsszint erforrsokat s esemnyeket tartalmaz App.xaml fjllal. Ha csak a Solution Explorerben nznk r a fjlrendszerre, akkor ezek hasonlnak tnhetnek, de egszen msrl van sz, ugyanis a MainPage szl osztlya a PhoneApplicationPage, mg az App az Application-bl szrmazik. A PhoneApplicationPage elkpzelhet gy is, mint egy weblap, egy nll entits, amely elemeket jelent meg, s rendelkezik a ms oldalak elrshez szksges eszkzkkel. Az oldalak kzti navigci megvalstsra kt lehetsgnk van:
HyperlinkButton egyszeren hasznlhat vezrl, ami egy linkhez hasonlan jelenik meg,

de felldefinilhatjuk a kinzett.
NavigationService ez egy osztly, amin keresztl knnyen kzben tarthatjuk a navigcis

folyamatokat. Az egyszer oldalvltson tl fggvnyeket, esemnyeket knl szmunkra. A NavigationService fontosabb metdusai, tulajdonsgai s esemnyei:
GoBack() Visszanavigl az elz oldalra, ugyangy, mint a Back gomb lenyomsakor. Navigate(Uri) tnavigl az Uri ltal meghatrozott cmre. Navigating A navigci indtvnyozsakor kvetkezik be. Navigated A navigci vgt jelz esemny. CurrentSource Az ppen mutatott oldal cme.

97

4. Halad alkalmazsfejleszts Windows Phone-on


Source A jelenleg aktv vagy mindjrt aktvv vl oldal cme. CanGoBack Tudunk visszafel naviglni? Azaz van-e bejegyzs az oldalak kzti lpkedst

rgzt veremben? A NavigationService rendelkezik egy CanGoForward tulajdonsggal is, de ez a WP7 esetben mindig false rtk lesz, valamint az ehhez kapcsold elrenavigls, azaz a GoForward(Uri) fggvny kivtelt dob. A PhoneApplicationPage navigcis eszkztra kt fontosabb rszbl ll, a NavigationContext-bl s az elbb emltett NavigationService-bl. Az els segtsgvel frhetnk hozz a QueryString-hez, ami csakgy, mint weblapok esetben, az URL-ben tadhat paramterek kulcs-rtk sztrt jelenti. A NavigationService a felsorolt lehetsgein tl elrhetv teszi a korbbi oldalak listjt (BackStack) s egy eljrst is, amivel ezt mdosthatjuk(RemoveBackEntry). Ezek kiprblsra egsztsk ki az elz alkalmazst egy j oldallal, ami egy fment fog tartalmazni, amelyen keresztl elrhetjk a tbbi lapot. Ehhez a projekt gyorsmenjbl vlasszuk az Add New Item funkcit (4-13 bra)!

4-13 bra: j elem hozzadsa a projekthez Az Add New Item ablakban vlasszuk a Windows Phone Portrait Page sablont, az oldal neve pedig legyen MainMenuPage! A tbbi sablon is ehhez hasonl szerkezet, csupn nhny alapbelltsban trnek el egymstl, mint pldul a lap orientcija. Ezen az j oldalon adjunk a ContentPanel nev Gridhez egy StackPanelt, azon bell pedig helyezznk el egy gombot:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <Button Name="btnMap" Content="Trkp" Click="btnMap_Click" /> </StackPanel> </Grid>

Menjnk t a kdot tartalmaz forrskd llomnyhoz (legegyszerbb az F7 lenyomsval a XAML fjlhoz tartoz forrskdra ugrani). Itt a gomb Click esemnykezeljben hasznljuk fel a mr emltett NavigationService-t az oldalvltsra:
private void btnMap_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); }

A Navigate fggvny egy URI-t vr, amely alaprtelmezs szerint abszolt, neknk viszont most egyszerbb lesz, ha ezt relatvra cserljk. Ezzel a paranccsal cmezzk meg a fejezet els rszben ltrehozott MainPage.xaml-t! Az oldalak kzti vlts mr mkdne, azonban egy problma mg van: a MainPage nylik meg elszr, onnan pedig sehova nem tudunk naviglni! A megoldshoz nyissuk ki a Properties mappt, azon bell pedig keressk ki a WMAppManifest.xml-t (4-14 bra)!

98

Navigci

4-14 bra: A WMAppManifest.xml a projekt Properties mappjban Azrt is rdemes megismerkednnk ezzel az llomnnyal, mert itt tudjuk trni alkalmazsunk metaadatait (pldul a kiad nevt, cmt, lerst, az opercis rendszer verzijt), belltani a kezdoldalt, a Splash kpet s az ikonokat. Ezenfell a Capabilities szekciban tallhatjuk az ignyelt kpessgek listjt. Ha pldul nem hasznlunk Push Notificationt, akkor rdemes az erre vonatkoz elemet eltvoltani (br ennek elmulasztsval sem vesztnk semmit). Most elegend a kezdoldalt kicserlnnk, ehhez rjuk t a Tasks-on bell a DefaultTask-ot:
<Tasks> <DefaultTask </Tasks>

Name ="_default" NavigationPage="MainMenuPage.xaml"/>

Most mr tesztelhetjk programunkat! A kezdkperny a Trkp gombot fogja mutatni, amire kattintva tjutunk a korbban ltrehozott tvonalterveznkre, ahonnan pedig a hardveres Back gombbal trhetnk vissza.

Adattvitel az oldalak kztt


Egyszer, adatkezelst nlklz programoknl elg lehet az, hogy fggetlen oldalak kztt vltogatunk. Ugyanez mr kevs lehet, ha pldul egy lista valamely elemnek rszleteit szeretnnk egy kln lapon megmutatni. Ugyanis valahogyan meg kell mondanunk a rszleteket tartalmaz oldalnak, hogy melyik elemet vlasztotta a felhasznl. Ennek legegyszerbb megoldsa a QueryStringek hasznlata. Ekkor hasonlan, mint weblapok esetben, csak az URL-t kell kiegsztennk az tadand kulcs-rtk prokkal:
private void btnMap_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/MainPage.xaml?myParam=test", UriKind.Relative)); }

A paramter kiolvassa a msik oldalon a NavigationContext segtsgvel egyszeren megoldhat:


string myParam; if (NavigationContext.QueryString.TryGetValue("myParam", out myParam)) { MessageBox.Show(myParam); }

Navigcis metdusok
A PhoneApplicationPage sosztlya, a Page a NavigationService osztlyon tl tartalmaz virtulis metdusokat, amelyek kzvetlenl az oldal ltrejtte utn vagy a deaktivldsa eltt futnak le, gy adva lehetsget arra, hogy a navigcival kapcsolatos feladatokat (pldul argumentumok kiolvassa, animls) elvgezznk. Mivel ezek virtulis eljrsok, a sajt oldalainkon fell tudjuk definilni ket az override kulcssz hasznlatval:

99

4. Halad alkalmazsfejleszts Windows Phone-on

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); // sajt kd }

Ehhez hasonlan hozzfrhetnk az oldal elhagyst megelz OnNavigatingFrom s OnNavigatedFrom fggvnyekhez is.

BackStack
Az alkalmazsunkon belli lapvltsokat egy verem trolja, amirl a hardveres Back gomb leveszi a legfels elemet, s visszanavigl erre az oldalra. Ehhez a veremhez mi is hozzfrhetnk, st a visszalpst is egyszer fggvnyhvssal megvalsthatjuk. Hozzunk ltre egy j oldalt Navigation nvvel, amit ksztsnk fel egy kapott paramter s a korbbi cmek kirsra a ContentPanel kiegsztsvel!
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <TextBlock Name="tbMyParam" Text="Nem rkezett paramter"/> <Button Name="btnDelete" Content="Trls" Click="btnDelete_Click" /> <ItemsControl Name="icNavigationList" DisplayMemberPath="Source"/> </StackPanel> </Grid>

Az icNavigationList fogja megjelenteni a ltogatott oldalak vermt. A DisplayMemberPath tulajdonsg belltsval jelezzk, hogy a ksbbiekben bekttt elemek Source tulajdonsgt akarjuk kirni! Vegynk fel mg egy gombot is, amivel a verem legutbbi elemt el tudjuk tvoltani, s ezzel mdosthatjuk a navigcis szolgltats mkdst! A kdfjlban rjuk fell az OnNavigatedTo eljrst, hogy az belltsa a XAML-ben definilt vezrlk hinyz rtkeit, s tltsk ki a gomb esemnykezeljt is!
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); // sajt kd string myParam; if (NavigationContext.QueryString.TryGetValue("myParam", out myParam)) { tbMyParam.Text = myParam; } icNavigationList.ItemsSource = NavigationService.BackStack; } private void btnDelete_Click(object sender, RoutedEventArgs e) { NavigationService.RemoveBackEntry(); /* nem hasznltunk adatktst, gyhogy j objektumra kell lltanunk az ItemsSource-ot! */ icNavigationList.ItemsSource = NavigationService.BackStack.ToList(); }

Ha felvesznk valahova egy linket, ami erre az oldalra mutat, mr megfigyelhetjk a NavigationService mkdst. Az OnNavigatedTo mkdse magtl rtetd, a gomb esemnykezelje viszont egy kis magyarzatot rdemel. A RemoveBackEntry fggvny trli a navigcis verem fels elemt. Mi viszont az egyszersg kedvrt nem hasznltunk adatktst, azaz a BackStack nem ad magrl rtestst a megjelent vezrlnek arrl, hogy frisslt. Ilyenkor nem elegend az ItemsSource-ot jra a BackStack-

100

Navigci re lltani, hiszen a referencia ekkor nem vltozik, gyhogy a vezrl sem frissl. Ehelyett egy j pldnyra, pldul a BackStack-bl elll listra kell lltanunk az icNavigationList-et. A dolog varzsa az, hogy ezzel a trlssel a hardveres Back gomb mkdst is befolysoljuk, hiszen ugyanezen verem alapjn dolgozik az is. gy ha trljk a legfels elemet, akkor az eltte lvre fog a gomb visszavezetni.

Az alkalmazs kiegsztse navigcis vezrlkkel


Az elz plda kevs oldal esetn mg nem igazn ltvnyos. Tbb lap esetben pedig rdemes lehet a minden oldalon megvalstand funkcikat a folyamatos msolgats helyett egy UserControl-ba szervezni. Ez azrt is rdekes tma, mert a UserControl osztly nem tartalmaz NavigationService-t. Komplexebb navigci megvalstshoz olyan felhasznli vezrlt kell ksztennk, amely hasznlja a NavigationService-t. Ennek megvalstshoz az Add New Item menben vlasszuk a Windows Phone User Control sablont, s nevezzk el vezrlnket NavigationBar-nak! Ezt a vezrlt gy alaktjuk ki, hogy brhonnan a Navigation.xaml-re navigl akr paramter tadsval , valamint felknl egy gombot, ami a hardveres vissza gombbal megegyez funkcionalits. A ksz vezrl megjelentse a 4-15 brn lthat. A Navigation vezrl egy Hyperlink, ami a paramter nlkli oldalvltst teszi lehetv. Az Adatok gomb ugyanezt valstja meg, azzal a kiegsztssel, hogy a kzps TextBox rtkt tadja a megcmzett oldalnak. A Vissza gomb pedig csupn akkor aktv, amikor a BackStack nem res, azaz az alkalmazson bell is tudunk mg visszafel naviglni.

4-15 bra: Az elksztend navigcis vezrl Az ehhez tartoz XAML kd:


<UserControl x:Class="_04_Advanced_Development.NavigationBar" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" d:DesignHeight="480" d:DesignWidth="480" Height="100" Width="450"> <Grid x:Name="LayoutRoot" HorizontalAlignment="Center"> <StackPanel> <HyperlinkButton Content="Navigation" NavigateUri="/Navigation.xaml" /> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <Button Name="btnBack" Content="Vissza" Click="btnBack_Click" /> <TextBox Name="tbNameParam" Width="200"/> <Button Name="btnNavigationPage" Content="Adatok" Click="btnNavigationPage_Click" /> </StackPanel> </StackPanel> </Grid> </UserControl>

101

4. Halad alkalmazsfejleszts Windows Phone-on A felhasznli vezrlkben a navigci kulcsa az, hogy referencit szerznk egy olyan objektumra, ami rendelkezik az ehhez szksges kpessgekkel. A WP7-es programokban szerencsre mindig tallhat ilyen, hiszen az App osztly tartalmaz egy publikus PhoneApplicationFrame tpus, RootFrame nev mezt. Ez egy fix keret, ami a belegyazott oldalak cserlgetst segti, tbbek kztt a navigcihoz szksges felttelek (Source tulajdonsg, navigcis fggvnyek, esemnyek) biztostsval. Menjnk most a NavigationBar kdfjljba, s valstsuk meg a Frame tulajdonsgot, amely egy hivatkozs a RootFrame-re!
private Frame _frame; public Frame Frame { get { if (_frame == null) { _frame = (App.Current.RootVisual as PhoneApplicationFrame); } return _frame; } }

A Frame a navigcis feladatok sorn gy kezelhet, mintha az egy NavigationService pldny lenne, nagyjbl ugyanazokat a funkcikat rhetjk gy is el. Ezek tudatban fejezzk be a forrsfjl kiegsztst!
public NavigationBar() { InitializeComponent(); this.Loaded += (s, e) => { btnBack.IsEnabled = Frame.CanGoBack; }; } private void btnNavigationPage_Click(object sender, RoutedEventArgs e) { string target = "/Navigation.xaml"; if (!string.IsNullOrEmpty(tbNameParam.Text)) { Frame.Navigate(new Uri(string.Format("{0}?myParam={1}", target, tbNameParam.Text), UriKind.Relative)); } Frame.Navigate(new Uri(target, UriKind.Relative)); } private void btnBack_Click(object sender, RoutedEventArgs e) { Frame.GoBack(); }

A vezrl ezzel elkszlt, mr csak fel kell hasznlni azt! Ehhez a XAML fjlokat kell csak mdostanunk, elszr vegyk fel a projekt nvtert pldul local nvvel:
xmlns:local="clr-namespace:_04_Advanced_Development"

Majd helyezzk el az egyb tartalmak kztt, brhol az oldalon:

102

Pivot s Panorama

<local:NavigationBar VerticalAlignment="Bottom" />

Prbljuk ki alkotsunkat gy, hogy bejrjuk az sszes oldalt, majd a vgn megltogatjuk a navigcit sszegz lapot, trlnk prat, s megnyomjuk a vissza gombokat! Ha minden jl mkdik, akkor sikerlt elsajttani az oldalak kzti navigci trkkjeit (4-16 bra)!

4-16 bra: A BackStack tartalma s az tadott paramter is ltszik a Navigation oldalon

Pivot s Panorama
Az elz rszben lttuk, hogyan tudjuk alkalmazsunkat oldalakkal strukturlni. Szorosabban kapcsold adatok megjelentsre vagy egyszeren ltvnyosabb UI ltrehozsra is kt remek vezrl ll rendelkezsnkre, amelyeket ebben a rszben ismerhetnk meg. A Pivot s a Panorama kt nagyon hasonl, horizontlisan elnyl vezrl. Mindkett az ItemsControlbl, pontosabban a TemplatedItemsControlbl szrmazik (4-17 bra). A WP7 programok kinzetnek meghatroz formli, nem vletlen, hogy a beptett alkalmazsok tbbsge is ezek felhasznlsval kszlt el.

4-17 bra: A Pivot s Panorama kapcsolata az osztlyhierarchia alapjn Pldk a vezrlk alkalmazsra az Office programbl:

103

4. Halad alkalmazsfejleszts Windows Phone-on

4-18 bra: Balra az Office alkalmazs Panorama vezrlje, jobbra a leveleket csoportost Pivot lthat

Klnbsgek
Pivot Lapokra osztott rendszerezs az egyes lapok kzti tmenet nlkl. A httrkp horizontlisan fix (a tabokra definilhatunk termszetesen kln htteret). Csak az aktv lap s a mellette lvk kerlnek lekpzsre a megjelentshez. Egyszerre csak egy lap ltszik, ezrt ennek terlett teljesen kihasznlhatjuk. Adatok rendszerezsre, kategrik kezelsre, esetleg hierarchikus elrendezsre rdemes hasznlni. Pl. RSS olvasban kategrik sztvlasztsakor hasznljuk. Panorama Egy horizontlisan elnyl, folyamatos oldal rzett kelti. A httrkp szlesebb, mint a kijelz, gy ezen is lapozhatunk. Az sszes elem egyszerre kerl lekpzsre a megjelentshez. rdemes nem telezsfolni a lapokat, mivel a kvetkez lap jobbrl belg az aktvba. Figyelemkelt kezdoldalak, funkcik bemutatsa esetn hasznos. Pl. Alkalmazs kezdoldala.

Fontos megjegyezni, hogy Panorama vezrl esetn kerlni kell az ApplicationBar hasznlatt, ha erre szksgnk van, mindenkpp hasznljunk Pivotot! Emellett a Panorama s a Pivot egymsba gyazva nem hasznlhat! A vezrlk npszersgt jelzi az is, hogy kln oldalsablont ptettek be mindkett szmra (st, alkalmazssablont is tallhatunk). Hozzunk ltre ezekbl egy-egy pldnyt, azaz egy PanoramaPage s egy PivotPage nev oldalt! Az elemeket persze brmilyen oldalon ltrehozhatjuk a vezrl szoksos hozzadsval is, nem kell ragaszkodnunk a sablon hasznlathoz. A sablonbl generlt PanoramaPage tartalmaz egy Panorama vezrlt, egy cmmel s kt elre ltrehozott elemmel. Ezek az elemek jelenleg csak res Grideket jelentenek meg, de ha trjuk ket, akkor brmilyen komplex lapot hasznlhatnak.
<Grid x:Name="LayoutRoot"> <controls:Panorama Title="my application"> <!--Panorama item one--> <controls:PanoramaItem Header="item1"> <Grid/>

104

Silverlight Toolkit for Windows Phone7

</controls:PanoramaItem> <!--Panorama item two--> <controls:PanoramaItem Header="item2"> <Grid/> </controls:PanoramaItem> </controls:Panorama> </Grid>

A dolog ltvnyoss ttelhez csupn egy szles httrkp hinyzik. Ilyeneket knnyen tallunk az interneten, begyazsuk pedig a Background tulajdonsg hozzadsval trtnik (4-19 bra):
<controls:Panorama.Background> <ImageBrush ImageSource="Images/bgPanorama.jpg" /> </controls:Panorama.Background>

4-19 bra: Panorama egy httrkp megadsa utn A tblzatban kiemelt klnbsgeken tl a Pivot hasznlata teljesen megegyezik a Panorama vezrljvel, gy ennek kiprblsra most nem trnk ki.

Silverlight Toolkit for Windows Phone7


Az eddig bemutatott vezrlkkel mr egy gazdag eszkzkszletbl vlogathatunk, de szmos ismtld feladat mg gy is rnk hrul. Ezek elvgzst knnyti meg a Silverlight Toolkit, ami j vezrlk felknlsn tl a Metro stlus kialaktsban is hasznos trsunk lehet.

Telepts
A kszlet hasznlathoz tltsk le a teleptt a projekt hivatalos weblapjrl: http://silverlight.codeplex.com. Miutn teleptettk a csomagot, az elrhet a Visual Studio Add Reference dialgusbl (4-20 bra).

105

4. Halad alkalmazsfejleszts Windows Phone-on

4-20 bra: A Toolkit szerelvnye a telepts utn elrhet Ha mgsem talljuk itt, akkor keressk ki a Microsoftos SDK-k kzl! Nlam ez a szerelvny itt tallhat:
C:\Program Files\Microsoft SDKs\Windows Phone\v7.1\Toolkit\Aug11 \Bin\Microsoft.Phone.Controls.Toolkit.dll

Ahhoz, hogy az elemeket a XAML-ben is elrjk, a mr ismert mdon adjuk hozz a nvteret a lershoz:
xmlns:toolkit="clrnamespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

Fontosabb vezrlk
HubTile A foldal lapkihoz hasonl dinamikus vezrl, nagyszeren hasznlhat menk kialaktsra, amelyek az egyszer navigcin tl informcit, zeneteket is szolgltatnak a felhasznl szmra (4-21 bra).

4-21 bra: A HubTile llapotai Ezt a vezrlt az albbi mdon illeszthetjk be a felhasznli felletbe::
<toolkit:HubTile Name="hirekTile" Tap="hirekTile_Tap" Title="Hrek" Source="Images/news.png" Background="#E51400" GroupTag="TileGroup" Margin="6" Notification="1 j hr" DisplayNotification="True" Message="Microsoft Minstett Szerviz Partner project">

MultiselectList Az Office alkalmazs levllistjhoz hasonlan lehetv teszi, hogy a felsorolt elemek

kzl tbbet is kivlasszunk (4-22 bra). 106

Silverlight Toolkit for Windows Phone7

4-22 bra: A levelek kivlasztsakor is egy ugyanilyen funkcionalits vezrlvel tallkozunk Hasznlata:
<toolkit:MultiselectList> <toolkit:MultiselectItem Content="1. elem" /> <toolkit:MultiselectItem Content="2. elem" /> <toolkit:MultiselectItem Content="3. elem" /> </toolkit:MultiselectList>

ExpanderView Szintn a leveleknl (pontosabban a hosszabb levlvltsoknl) megszokott lista,

amelynek egy elemt kivlasztva az lenylik, s a rszletei is lthatv vlnak (4-23 bra).

4-23 bra: Hasonl vezrl a levlvltsok rszletezsnl Ezt a vezrlt az albbi mdon hasznlhatjuk:
<toolkit:ExpanderView> <toolkit:ExpanderView.Expander> <Rectangle Height="80" Width="400" Fill="Blue" /> </toolkit:ExpanderView.Expander> <toolkit:ExpanderView.Items> <TextBlock Text="Alelem 1" /> <TextBlock Text="Alelem 2" /> </toolkit:ExpanderView.Items> </toolkit:ExpanderView>

107

4. Halad alkalmazsfejleszts Windows Phone-on


LockablePivot Kiegszti a Pivotot egy zrolsi lehetsggel, ami lezrja az aktv lapot, azaz nem

tudunk rla a telefon kezelshez hasznlt gesztusok segtsgvel a krnyez lapokra naviglni. Ez hasznos lehet, ha horizontlisan grgethet elemeket hasznlunk a lapon, hiszen ilyenkor nem egyrtelm, hogy pldul egy ScrollBar rtkt kvnjuk mdostani, vagy egyszeren csak lapoznnk. PageTransitions Az oldalak kzti tmenetet ksr animcik hasznlatt megknnyt osztly. Segt a megszokott Metro stlus tmeneteket egysges mdon hasznlni. WrapPanel A Panel osztlybl szrmaz kontnertpus. A StackPanelhez hasonlan egyms mell vagy al helyezi az elemeket az Orientation tulajdonsgtl fggen. A StackPanellel szemben, ha elri a sor (vagy oszlop) vgt, akkor a kitltst a kvetkez sorban (oszlopban) folytatja. Ezzel egyszeren tudunk ismeretlen elemszm listkat, pldul galrikat megjelenteni (4-24 bra).

4-24 bra: WrapPanel horizontlis elrendezssel Hasznlata:


<toolkit:WrapPanel> <toolkit:HubTile Background="Green" Title="Zld" /> <toolkit:HubTile Background="Red" Title="Piros " /> <toolkit:HubTile Background="Blue" Title="Kk" /> </toolkit:WrapPanel>

TimePicker Idpontok megadsra hasznlhat vezrl, az Alarm alkalmazsbl ismerhetjk. Kt

nzettel rendelkezik, az egyik szvegesen kirja a jelenleg belltott idpontot, erre kattintva pedig a msik, az idpontot bellt elrendezst lthatjuk (4-25 bra).

4-25 bra: A TimePicker kt nzete

108

Silverlight Toolkit for Windows Phone7 Hasznlata:


<toolkit:TimePicker Name="tpAlarm"/>

ContextMenu A PC-ken megszokhattuk, hogy ha egy elemre kattintunk az egr jobb gombjval, akkor az

elemre vonatkoz men ugrik fel. A WP7 platformon ezt a viselkedst egy elem hosszan lenyomva tartsval rhetjk el, a men ellltsban pedig a ContextMenu vezrl segt minket. Ez a men mindig egy msik vezrlhz kapcsoldik, gy gyakorlatilag egy szolgltatst, a ContextMenuService-t kell felvennnk a funkcival kiegsztend kontrollba. A men megjelensn tl a hivatkoz vezrl ki is emelkedik a tbbi kzl, pontosabban ezt kivve minden ms kiss tvolabbra kerl, gy az animlssal sem kell kln foglalkoznunk (4-26 bra).

4-26 bra: ContextMenu 1 elemmel, a httrben pedig lthat a kiemel effekt Hasznlata:
<toolkit:HubTile Tap="hirekTile_Tap" Title="Minden" Source="Images/all.png" Margin="6" Background="#FF008000" GroupTag="TileGroup" Notification="Noti" Message="Microsoft Minstett Szerviz Partner project"> <toolkit:ContextMenuService.ContextMenu> <toolkit:ContextMenu> <toolkit:MenuItem Header="Men 1" Click="MenuItem_Click" /> </toolkit:ContextMenu> </toolkit:ContextMenuService.ContextMenu> </toolkit:HubTile>

Pldaprogram
Hozzunk ltre egy olyan oldalt, ami a toolkit elnyeit felhasznlva egy ttekinthet, informatv s eszttikus ment tartalmaz. Egy ehhez hasonl lap remek belpsi pont lehet brmely alkalmazs szmra, hiszen tjkoztatja a felhasznlt a fontos funkcikrl, zeneteket jelenthet meg s ltvnyos, animlt felletet is biztost.
<Grid x:Name="LayoutRoot"> <Grid.Background> <ImageBrush ImageSource="Images/tileBg.png" /> </Grid.Background> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel contains the name of the application and page title--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="PageTitle" Text="OEM Portal" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>

109

4. Halad alkalmazsfejleszts Windows Phone-on

</StackPanel> <!--ContentPanel - place additional content here--> <toolkit:WrapPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <toolkit:HubTile Tap="hirekTile_Tap" Title="Minden" Source="Images/all.png" Margin="6" Background="#FF008000" GroupTag="TileGroup" Notification="Noti" Message="Microsoft Minstett Szerviz Partner project"> <toolkit:ContextMenuService.ContextMenu> <toolkit:ContextMenu> <toolkit:MenuItem Header="Men 1" Click="MenuItem_Click" /> </toolkit:ContextMenu> </toolkit:ContextMenuService.ContextMenu> </toolkit:HubTile> <toolkit:HubTile Name="hirekTile" Tap="hirekTile_Tap" Title="Hrek" Source="Images/news.png" Background="#E51400" GroupTag="TileGroup" Margin="6" Notification="1 j hr" DisplayNotification="True" Message="Microsoft Minstett Szerviz Partner project"> </toolkit:HubTile> <toolkit:HubTile Tap="hirekTile_Tap" Title="Letlts" Source="Images/downloads.png" Background="#297FD5" Margin="6" GroupTag="TileGroup" Notification="2 j hr" DisplayNotification="True" Message="Microsoft Minstett Szerviz Partner project"> </toolkit:HubTile> <toolkit:HubTile Tap="hirekTile_Tap" Title="Esemny" Source="Images/calendar.png" Margin="6" Background="#FF00FF" GroupTag="TileGroup" Notification="Noti" Message="Microsoft Minstett Szerviz Partner project"> </toolkit:HubTile> <toolkit:HubTile Tap="hirekTile_Tap" Title="Akci" Source="Images/akcio.png" Margin="6" Background="#FFF79608" GroupTag="TileGroup" Notification="Noti" Message="Microsoft Minstett Szerviz Partner project"> </toolkit:HubTile> <toolkit:HubTile Tap="hirekTile_Tap" Title="Info" Source="Images/info.png" Margin="6" Background="#A500FF" GroupTag="TileGroup" Notification="Noti" Message="Microsoft Minstett Szerviz Partner project"> </toolkit:HubTile> </toolkit:WrapPanel> </Grid>

A fenti kd pedig (termszetesen a kpek Images mappba msolsa utn) a 4-27 brn lthat megjelenst eredmnyezi.

110

sszefoglals

4-27 bra: HubTile-ok WrapPanelbe csomagolva

sszefoglals
A fejezet elejn rszletesen megismerkedhettnk a Bing Maps szolgltats felhasznlsi lehetsgeivel, ezek kztt a kiemelt pozcik jellsvel, az egyszer cmkeresssel s az tvonaltervezssel. Ezt kveten tnztk a tartalmak rendszerezsre szolgl mveleteket: az oldalak kezelst, azokon bell pedig a Panorama s Pivot vezrlket. Vgl a Silverlight Toolkit elnyeit ismerhettk meg. Ezekkel a mdszerekkel nemcsak hogy rendkvl egyszeren valsthatunk meg komplex alkalmazsokat, de knnyedn varzsolhatjuk a Metro stlushoz s a Mango felhasznli fellet koncepcijhoz illeszked megjelensnek azokat.

111

5. Az alkalmazs letciklusa
Az elz fejezetek tolvassa utn egyre boldogabban tarthatjuk keznkben Windows Phone telefonunkat; most mr mi magunk is lthattuk, hogy ezekre az eszkzkre fejleszteni majdnem minden apr mozzanatt tekintve ms, mint a tbbi, elterjedt mobilplatform esetben, s mgis rendkvl ismers azoknak, akik jrtak mr a .NET vilgban. Mieltt tovbbhaladunk a funkcionalits megismersben, kicsit vissza kell vennnk a lendletbl s tartani egy aprbb kitrt. Minden j technolgia rendelkezik sajt karakterisztikval, mely egyedibb, az addig megszokottl klnbzv teszi. Ez Windows Phone 7.5 esetben is teljes mrtkben igaz. Szmos olyan megolds van a kvncsi szemek ell elrejtve, valahol az opercis rendszer lelkn bell, amely teljestmnyben s funkcionalitsban rendkvl sokat hozztesz a rendszer mkdshez. A teljes fejezet clja jl ttekinthet formban megismerkedni az alkalmazsok mkdsnek keretvel, tnzni, mi minden trtnik a httrben az alkalmazs indulstl a back vagy a Start gomb lenyomsig. A Windows Phone 7.5 (a tovbbiakban csak a kdnevn emltve Mango) jdonsgai kztt nagyon fontos jra megismerkedni egy rgi ismerssel, amely nem ms, mint a multitasking, azaz a bels temez rendszer, amely lehetv teszi, hogy egyszerre tbb alkalmazs osztozhasson a telefon biztostotta erforrsokon. Megnzzk, milyen feladatokat kell elltnunk az alkalmazs indulsakor s kilptetsekor, hogyan tudjuk elmenteni a felhasznl ltal kialaktott llapotot s azt a kvetkez indtskor helyrelltani, ezzel biztostva, hogy a felhasznlnak a munkjt ne kelljen ellrl kezdenie, hanem onnan folytathassa, ahol abbahagyta. Ezek utn tovbb folytatjuk az ismereteink bvtst olyan jdonsgok ttekintsvel, mint a zenelejtszval val integrci vagy a hardveres hanger-szablyoz gombok kezelse. Lehetsgnk van riasztsok s naptrbejegyzsek ksztsre s felgyeletre is, amelyek elrhetek sajt alkalmazsunkbl s a telefon beptett eszkzeibl is. Httrben fut adatszinkronizcit is megvalsthatunk alkalmazsunkban, amellyel apr darabokra sztbontva a csomagokat a httrben vgezhetnk szerver-kliens kommunikcit. De mirt is ebben a fejezetben trgyaljuk a fent emltett, egymstl teljes mrtkben klnbz dolgokat? A kzs dolog bennk: ezek mind a httrben kpesek dolgozni!

Multitasking
A fenti kifejezssel valsznleg mr mindenki tallkozott valahol. Egyetemi ra keretein bell, az internetet bngszve, de akr az opercis rendszer sgjnak olvassa kzben is belefuthatunk. Az alaptlet szerint a multitasking azrt felels, hogy az opercis rendszer egyszerre ne csak egy alkalmazst tudjon futtatni, hanem a kzponti feldolgozegysg (CPU) kapacitst kihasznlva ezek a programok egyms mellett dolgozhassanak, megfelelen teret engedve egymsnak. A val vilgra levettve a dolgot makroszkopikusan nzve mg mondhatjuk, hogy igazodtunk az eredeti feltevshez, azonban kzelrl tekintve ez nem igaz. A felhasznlt megtvesztjk a gyors CPU-nak ksznheten s elhitetjk vele, hogy valban egyszerre futtat szmos programot, de valjban nem msrl van sz, mint a multitasking-rendszer temez komponensrl, amely a vgrehajtand feladatokat a legoptimlisabb mdon juttatja el a kzponti egysghez, gy ezeket egyms utn nagyon gyorsan vgrehajtva valban a prhuzamossg rzett kapjuk. Asztali opercis rendszerek esetben mr nem igazn tallkozhatunk olyannal, amely ezt a rendszert ne tartalmazn, azonban a Windows Phone 7 els verzijban ezt mg nem talljuk legalbbis a fejlesztk ltal hasznlhat mdon nem. A kvetkezkben vlaszt fogunk r kapni, hogy mirt is volt ez gy.

113

5. Az alkalmazs letciklusa

A feladattemezs elmletben
Ez a rsz taln nem illeszkedik szorosan a knyv tmjhoz, azonban vlemnyem szerint nagyon rdekes tma, s nagyon sokat segt a Mangban lv megolds megrtsben persze ahhoz, hogy ezt a kedves Olvas is t tudja rezni, szintn csillog szemekkel kell, hogy tekintsen a szmtgpes algoritmusokra s klnbz matematikai problmkra. Ahogy azt mr emltettem, asztali opercis rendszerek esetben ma mr fel sem merl, hogy a hatalmas szmtsi kapacits mellett egy opercis rendszer megengedje magnak azt a luxust, hogy egyszerre csak egy programot szolgl ki. Azonban az utbbi vek sorn az informatika tesett egy jabb s egyben sokadik metamorfzisn, s az addigi nzetek j irnyba toldtak el. Okos telefonok, tblagpek, begyazott rendszerek jelennek meg sorra s mindegyik valamelyik npszer opercis rendszer mobilizlt vltozatt hasznlja fedlzeti szoftverknt. Gyorsan hozzszoktunk, s lassan elkpzelni sem tudjuk ezek nlkl az letnket (fleg amita a sz minden rtelmben kzssgi lnyek vagyunk). Azt vrjuk el ezektl a ktyktl, hogy ugyanazokat a feladatokat lssk el, amiket a szmtgpnk azonban a laptop s a telefon kztt is van nhny hatalmas klnbsg, csak jobban bele kell gondolni. Elsre ez a klnbsg nem tnik olyan nagynak! Az n laptopomban ngy processzormag van 2.4 GHz-es rajelen zemeltetve, mg a telefonomban kt processzormag 1.2 GHz-es teljestmnnyel. Ez matematikailag pont a fele lenne, de a kett a valsgban sszehasonlthatatlan. Mirt? A szmtgpem processzora rengeteg segdprocesszort, kzvetlenl elrhet s msodlagos trat, valamint ehhez tartoz magas teresztkpessg vezetrendszert tartalmaz, megfelel energiaellts s hts mellett. Ezek a segdprocesszorok villmsebessggel vgeznek el szmos sszetett aritmetikai mveletet, s a szmtsi sorok vgn az eredmnyeket nagy szlessg buszokra tovbbtjk. Ezzel szemben a telefonom a szmtgpem drablis hardvereit egyetlen chipbe tmrti, ezt gy hvjuk, hogy SoC (System on a Chip). Egyetlen apr chip feladata a CPU, a GPU (grafikus szmtsi egysg) s egyb vezrlk szerepeinek felvllalsa minimlis energiaellts s hts hinya mellett! Amikor telefonunkon egy jtkkal jtszunk, annak a szmtsi feladatai mind ugyanahhoz a chiphez futnak be, s annak kell biztostania a msodpercenknti 30 kpkockt (telefonokon ez a szabvnyos kpkockaszm msodpercenknt) ahhoz, hogy egy jtk lvezhet legyen. Nem beszlve arrl, hogy az egyms mellett fut alkalmazsok llapotait meg kell tartani, ezrt az operatv memrinkat is a lehet legjobban be kell osztanunk. A feladatunk az, hogy van X darab folyamatunk (itt ne Windows vagy egyb opercis rendszer folyamatra gondoljunk, a processzor szemszgbl nzzk a problmt, elemi szint folyamatokrl beszlnk), s ezeket gy kellene temeznnk a processzor fel, hogy mindegyik folyamat dolgozhasson valamennyit, s gy a felhasznl azt az rzetet kapja, hogy egyszerre, egyms mellett futnak az alkalmazsai. A legegyszerbb megolds gy nz ki, hogy azt mondjuk, egyik folyamatot sem heztetjk ki, mindegyik kap lehetsget felszlalni, azonban csak bizonyos ideig. Egysgesen mindegyik kap pldul 100 ms processzoridt, ezzel gazdlkodhat egy menetben. Jn elszr A folyamat, dolgozik 100 milliszekundumig, utna t kveti B, utna jn C, majd ha C vgzett, akkor megint A folyamat kerl elre a sorban. Ahhoz, hogy szrevegyk, mi ezzel a problma, nzznk egy pldt! A folyamatnak sszesen 350 ms idre lesz szksge ahhoz, hogy elvgezzen minden szmtst. Ez esetben ngyszer fog magnak lefoglalni egy 100 ms hossz intervallumot, de az utols iterciban 50 ms alatt befejezi a feladatt s terminl, gy 50 ms resen marad. Ebbl ltszik, hogy 50 ms processzorid el lett pazarolva. A fenti algoritmust round-robin temezsi algoritmusnak hvjk, s nagy elnye, hogy knnyen implementlhat. Azonban vannak htrnyai. Ha tl rvid egy idszelet, akkor a tl sok vlts lassulshoz fog vezetni, ha pedig tl hossz egy intervallum, akkor alacsonyabb idigny folyamatok el fogjk pazarolni a nagyobbak ell a szmtsi idt. s az utols mondatbl kvetkezik mg egy problma! Ha van egy nagyobb priorits folyamatunk, akkor ki lesz heztetve, s ez alaposan ellentmond az eredeti feltevsnknek, miszerint semelyik folyamatot nem heztetjk ki. Ezeken a problmkon hivatott segteni a prioritsos temezs algoritmusa. Itt minden folyamat kap egy prioritsi rtket, ezek alapjn cskken sorrendbe lltjuk ket, s a legmagasabb priorits megkezdheti a futst. Azonban, hogy az elejn megelzznk slyos problmkat - mint pldul a vgtelen ideig tart futs - illetve optimalizljunk is, bevezetjk itt is az idszeleteket. A legmagasabb

114

Multitasking priorits futhat bizonyos ideig, azonban ha lejrt az id, akkor a kvetkez legmagasabb priorits kap processzoridt. A vgtelen futs elkerlsnek rdekben pedig minden iterci vgn cskkentjk a prioritsi rtket, gy az eddig legmagasabb priorits kevsb lesz fontos a kvetkez krben. A mai modern opercis rendszerek is ilyen alapelvekre plnek, s azt gondolom, a fenti pldk s szmolsok utn senki szmra sem ktsges, hogy egy mobiltelefon esetben ezeknek az optimlis implementlsa komoly kihvst jelent. A helyzet messze nem olyan egyszer, mint az opercis rendszerek nagy testvrei esetben: meg kell tallni az arany kzputat az energiaigny, hardver kihasznlsa s teljestmnye kztt.

A multitasking megvalstsa WP 7.5 platformon


Az eredeti Windows Phone 7 opercis rendszer nem tartalmazta a multitasking lehetsgt (ellenben tbb szl alkalmazsokat rhattunk), ez a Mango frisstssel jtt. Azonban gondoljunk csak bele jobban, mit is jelent egy mobiltelefon esetben az, hogy tbb programot futtat! Nincs tlca, ahol egy szempillants alatt vlthatunk az alkalmazsok kztt, nincsenek ablakok, ahol egyms takarsban futnak a programok kln rajzterleteken. Akkor mit nyerhetnk tbb program futtatsval? A vlaszt kt rszben kapjuk meg. Elszr is nzzk az eredeti Windows Phone 7 opercis rendszert! Ha bezrtunk egy alkalmazst, vagy az alkalmazs valamilyen okbl passzv sttuszba kerlt (alkalmazsfelletek kztt naviglunk pl. egy fnykp ksztsekor, vagy tl sokig nem hasznltuk a telefont, s elment pihenni, stb.), akkor valahova el kellett menteni az aktulis llapotot, majd amikor visszatrt a felhasznl az alkalmazshoz, akkor vissza kellett tlteni az elzleg elmentett adatokat. A vlasz msik rsze pedig mg sokkal szembetnbb! Bngsznk, s kzben szeretnnk zent hallgatni. A telefonnal rkezett, Microsoft ltal ksztett alkalmazsok esetben ez eddig is mkdtt! Mi is azt szeretnnk, hogy a sajt alkalmazsunkban lejtszott zene akkor is tovbb folytatdjon, ha ppen nem a sajt alkalmazsunk aktv vagy a telefon aludni trt. Igen, erre mostantl fogva lehetsgnk van! Nem kell egyszerre ltnunk az alkalmazsokat egy kis kpernyn, nem kell ablakban futniuk, ettl mg ott lehetnek a httrben, s ugyangy szksgk lehet a processzorra. A Microsoft az eredeti Windows Phone 7 opercis rendszerben nem akarta a telefonok korltozott hardver erforrsa, energiaignye s az alkalmazs letciklus-modellje miatt bevezetni a multitaskingot. Ezt azonban elbbutbb knytelen volt implementlni, hiszen olyan kpessgrl beszlnk, amelyet nem lehet kikerlni. Az 5-1 brn lthat, hogyan is pl fel egy alkalmazs letciklusa. Az egsz egyetlen nagy llapotgppel rhat le, amelynek kzppontjban az az llapot ll, amikor az alkalmazs fut. Azonban mi van olyankor, ha nem fut ppen? Tbb minden is trtnhet. Megmaradt az elbbiek sorn ismertetett llapotments mechanizmus is, de ez tovbb bvlt azzal, hogy a Windows Phone temez rendszere eldntheti, mit tesz az alkalmazsunkkal, s az pldul egy navigcis mvelet sorn ott maradhat a memriban. Az llapotok mentsnek a ksbbiekben tbb mdjt is megnzzk, s lthatjuk majd, hogyan vlthatunk gyorsan az alkalmazsok kztt a multitaskingnak ksznheten.

115

5. Az alkalmazs letciklusa

5-1. bra: A Windows Phone 7.5 alkalmazsok llapotai Nzzk meg, hogy az egyes llapotok s esemnyek mit jellnek! A ksbbiek sorn mg szmos alkalommal hasznosnak bizonyulhat ez a tuds. Launching esemny: j alkalmazspldnyt indtottunk, azaz kivlasztjuk a Start felleten vagy az alkalmazslistbl az alkalmazs lapkjt, esetleg egy rtestshez tartoz zenet. Ha az alkalmazs logikja nem ignyel mst, akkor itt ne folytassunk munkafolyamatot, ez valban egy teljesen j pldny legyen persze ez all vannak kivtelek. Ez a kdbl kezelhet llapotok kz tartozik. Tovbb fontos, hogy itt erforrsignyes mveletet ne vgezznk, az alkalmazst engedjk betltdni minl gyorsabban, nagyobb adategysgek betltst mgttes szlon hajtsuk vgre! Vannak olyan alkalmazsok, ahol a sttusz nem fontos (pldul egy kzssgi oldal kliense, ahova az j hreket az alkalmazs kvetkez indtsakor jra le fogjuk tlteni). Azonban gondoljunk pldul egy kpszerkeszt programra, ahonnan vletlen a vissza gombhoz rve kilptnk. Amikor visszatrnk az alkalmazsba, szeretnnk az elz munkafolyamatot folytatni, gy vigyznunk kell arra, hogy az llapotot folyamatosan mentsk az adatveszts elkerlse vgett. Tovbb vigyzzunk, hogy nagy adatmennyisgeket ne tltsnk be s mentsnk ki egyszerre, ezt a feladatot vgezzk el egy mgttes szlon! Running: az alkalmazs egszen addig futtats alatt llapotban fog maradni, amg valamilyen felhasznli interakci hatsra nem naviglunk valamerre, vagy ppen a felhasznl interakci hinyban a telefon nem tr aludni. OnNavigatedFrom esemny: akkor jtszdik le, ha a felhasznl elnavigl az adott alkalmazsfelletrl, vagy az alkalmazs deaktivlt llapotba kerlt. Itt el kell mentennk az

116

llapotok kezelse aktulis oldal llapott, s ha a felhasznl visszatr ide, akkor helyre kell lltanunk. rdemes mg figyelni arra is, hogy ha visszafel szeretnnek naviglni az adott oldalrl, akkor nem kell llapotot mentennk, mivel a kvetkez alkalommal, mikor ide visszatr a felhasznl, jra ltrejn a fellet. A megvalsts mdja termszetesen nagyban fgg az alkalmazs logikjtl. Deactivated esemny: ez az llapot akkor jelentkezik, ha a felhasznl tvlt egy msik alkalmazsra, vagy megnyomja a Start gombot, illetve ha hossz ideig nem volt felhasznli interakci, s a telefon zroldik. Fontos megemlteni, hogy ez az llapot kvetkezik be akkor is, ha valamilyen Chooser segtsgvel az alkalmazs az opercis rendszer beptett eszkzeit szeretn hasznlni, pldul a kamert, kp kivlasztst, e-mail zenet rst, s gy tovbb. Ennek az esemnynek a hatsra mindenkppen el kell mentennk az alkalmazs llapott! Ennek mdjt a ksbbiek sorn rszletesen megnzzk. Dormant: miutn a Deactivated llapot bekvetkezett, az alkalmazs folyamata s a hozz tartoz szlak lelltsra kerlnek, a rendszer mg megprblja az alkalmazshoz tartoz adatokat a memriban tartani, hogy gy azok ksbb gyorsan visszanyerhetk legyenek. A folyamat teljesen automatikus, azonban legynk vele vatosak, mivel ha az alkalmazsunk utn egy erforrsignyesebb alkalmazst indt a felhasznl, akkor a mi alkalmazsunk valban lezrsra kerl! Az esemny hatsra le kell mentennk az llapott, az eddig elfoglalt memriaterlet pedig felszabadtsra kerl. Tombstoned: a Windows Phone 7 rendelkezik egy Dictionary<T > tpus gyjtemnnyel, amelyen keresztl objektumokat menthetnk el. Ennek mkdst mg rszletezni fogjuk, azonban a mechanizmus ebben az llapotban nyeri el igazn az rtelmt. Az alkalmazs lelltsra kerl, az adatokat nem rzi meg automatikusan a rendszer, de a fent emltett gyjtemnyt elmenti, gy onnan vissza tudjuk majd az llapotot tlteni. Vigyzzunk vele, mert ha a telefont pl. jraindtjk, akkor a gyjtemny elveszik, gy ebben az esetben ms utat kell vlasztanunk! Activated esemny: ha Domant vagy Tombstoned llapotbl tr vissza az alkalmazsunk, akkor az Activated esemny fog lejtszdni. Itt tudjuk leellenrizni, hogy hova volt az llapot elmentve, s ettl fggen tudjuk visszalltani. OnNavigatedTo esemny: akkor kvetkezik be, amikor a felhasznl egy j alkalmazsfelletre navigl, vagy amikor az adott lap az alkalmazs indulsa utn elszr kerl betltsre. Itt szksges leellenrizni azt, hogy egy j pldnyra van-e szksgnk, vagy egy lementett llapotot szeretnnk helyrelltani! Closing esemny: az alkalmazs lezrsa eltti utolsnak lezajl esemny. Nagyon fontos vigyzni arra, hogy itt maximum 10 msodpercig tartzkodhat az alkalmazs, ha ezt tllpi, a folyamatban lv mveletek befejezse nlkl fog lellni. Itt teht nem clszer erforrsignyes mveleteket hasznlnunk!

llapotok kezelse
Az elz rszekben alaposan vgignztk, hogy mi minden trtnik a httrben, amelybl mi semmit sem ltunk. Megnztk, milyen llapotok kztt ingzik egy alkalmazs az letciklusa sorn, s milyen teendink vannak az egyes esetekben. Egy dolgot azonban mg nem lttunk: Hogyan kell ezeket gyakorlatban megvalstani?

letciklus-esemnyek kezelse
Az 5-1. abrn lthattuk, mely esemnyekkel kell foglalkoznunk, s az brt kvet lersban szerepelt szvegesen is, hogy az egyes esemnyeknl mi a tennivalnk. Az ttekinthetsg kedvrt az albbi tblzatban sszefoglalom az esemnyeket s a hozzjuk tartoz mveleteket:

117

5. Az alkalmazs letciklusa

Esemny Launching Activated Deactivated Closing OnNavigatedFrom OnNavigatedTo

Vgrehajtand mvelet Minimlis kd, semmi erforrsignyes mveletet ne vgezznk! lltsuk helyre az llapotot, ha lehet FAS (Fast Application Switching) segtsgvel! Mentsk el az llapotot! Ha lezrdott az alkalmazs, akkor biztostsuk a perzisztens trolst! Utlagos mveleteket vgezznk, vigyzzunk a 10 msodperces idhatrra! Ha nem visszafel naviglunk, akkor mentsk el az adott felhasznl fellethez tartoz llapotot! Amennyiben nem egy j pldnyra van szksgnk, a trbl lltsuk helyre az alkalmazs llapott!

Tancs: Egy Windows Phone alkalmazs ne tartalmazzon opcit a kilpsre, ezt a feladatot hagyjuk meg a telefon vissza gombjnak! Prbljuk ki mindezt a gyakorlatban! Indtsuk el a Visual Studio 2010-et, s hozzunk ltre egy j projektet a File New Project parancs segtsgvel! A megjelen dialguson a C# nyelv Silverlight for Windows Phone szekcibl vlasszuk ki az egyszer Windows Phone Application sablont, s az alkalmazsnak adjuk az AppLifecycle nevet (5-2 bra)! A fejezet sorn vgig ezt a projektet fogjuk hasznlni.

5-2. bra: A fejezethez szksges projekt ltrehozsa Ha megnyitjuk az App.xaml.cs fjlt, akkor lthatjuk, hogy a fenti tblzatbl ngy klnbz esemnyvezrl mr elre el lett ksztve. Pillanatnyilag mg nem tudjuk ket semmilyen hasznos dologra felhasznlni, azonban azrt, hogy lssuk azok vgrehajtsi sorrendjt, helyezznk el minden esemnyvezrlhz egy trspontot, ahogyan az 5-3. brn is lthat! A megjelen felleten vlasszuk a

118

llapotok kezelse Windows Phone 7.1 belltst s hagyjuk jv! Ha ezzel megvagyunk, akkor hajtsuk vgre a kvetkez lpseket, s figyeljk meg, hogy az egyes esetekben hol ll meg a kd vgrehajtsa! Az F5 segtsgvel Debug zemmdban futtassuk az alkalmazst! Ennek hatsra elindul az emultor. A kd vgrehajtsa megll az Application_Launcing esemnykezelnl. Ez a mkds annak tudhat be, hogy az alkalmazsnak ez volt az els elindtsa. Ezutn az emultoron nyomjuk le a Start gombot! Ennek hatsra gy tnik, mintha az alkalmazsunk kilpett volna. A Visual Studio most az Application_Deactivated esemnykezeln elhelyezett trspont hatsra megll. Az alkalmazs llapota megvltozott, s ha valamilyen logika mr megvalstsra kerlt volna, akkor itt kellene a llapotot mentennk. Kt esemnynkkel mg nem tallkoztunk, ezrt F5 segtsgvel jra indtsuk el az alkalmazst! Az jra meg fog llni a Launching esemnynl. Lptessk tovbb! Most az emultoron nyomjuk le a Back (vissza) gombot, s figyeljk meg, hogy mi trtnik! Megllt a vgrehajts az Application_Closing esemnyvezrlnl. Ez azt jelenti, hogy innentl fogva 10 msodpercnk van az alkalmazs llapotnak elmentsre, utna vgrvnyesen kilpnk!

Az Application_Activated esemnyvezrl egyszer sem kerlt meghvsra. Ezt az okozta, hogy az alkalmazst egyszer sem futtattuk le az emultoron tallhat pldny jrafuttatsval. Ezt hiba is prbltuk volna meg, a Visual Studio hibakeres elengedi az alkalmazspldnyunkat, miutn megnyomtuk a Back vagy Start gombok valamelyikt.

5-3. bra: trspontok elhelyezse az App.xaml.cs fjlban Egyelre nem sok minden trtnt, mindssze lttuk, hogy melyik esemny mikor jtszdik le. A kvetkez rszben alkalmazsunkat gy alaktjuk t, hogy az elmentse a legutbbi llapotot s a kvetkez indtskor visszaolvassa azt.

Az alkalmazs llapotnak mentse s helyrelltsa


Ha az alkalmazsunk adatorientlt, s a felhasznl ltal tett mdostsokat el kell trolnia, akkor a memriban tallhat objektumokat perzisztens trolba kell elmentennk. Erre tbbfle lehetsgnk van (st, van ahol egy lehetsgen bell is tbb irnyba gazik el az t). Elszr is vlasszuk szt a mveletet az alapjn, hogy az alkalmazs vglegesen lellt-e, vagy csak szneteltetsre kerlt valamilyen formban! Tudjuk, hogy a szneteltetsnek kt mdja is van. Ha Dormant llapotba kerlt a telefon, azaz

119

5. Az alkalmazs letciklusa minden hozz tartoz adat a memriban maradt, akkor rendkvl gyorsan folytathat a munkafolyamat, manulisan semmit sem kell helyrelltanunk. Ekkor kizrlag azt kell megvizsglnunk, hogy hasznlhat-e a Fast Application Switching mechanizmus. Ezt az Application_Activated esemnyvezrln bell tesszk meg:
private void Application_Activated(object sender, ActivatedEventArgs e) { if ( e.IsApplicationInstancePreserved ) { // dormant llapotban voltunk, nem kell semmit sem tennnk manulisan } else { // sajnos nem dormant volt, vissza kell hoznunk az adatokat } }

Ha nem Dormant llapotban volt az alkalmazsunk, akkor neknk kell gondoskodnunk az adatok mentsrl. Erre egyik lehetsgnk a Tombstoning llapotban hasznlhat PhoneApplicationService, amely tartalmaz egy Dictionary<T> tpus generikus gyjtemnyt, s az ebben eltrolt objektumokat a telefon automatikusan elmenti, amikor a Deactivated esemny lejtszdik. Ennek nagy elnye, hogy szintn gyorsan visszanyerhetjk az adatokat, htrnya viszont, hogy ez nem teljesen perzisztens megolds. Ha a telefont jraindtjuk, vagy egy frissts miatt az alkalmazsunk vglegesen lell, akkor az adatai elvesznek. Erre jelenthet megoldst az adatok szerializlsa az Isolated Storage-ba. Miutn kzvetlen fjlrendszer hozzfrsnk nincs, de mgis a telefon trkapacitst szeretnnk hasznlni adatok mentsre, gy az egyik megolds. Szmos szerializcis mdszert hasznlhatunk (binris, JSON, XML, DataContract, stb.), azonban ezek kzl egyik sem tud sebessgben versenyezni az elz megoldsokkal. Msik lehetsg lenne a Mangban megjelent SQL CE adatbzismotor hasznlata ezt rszletesebben az adatkezelssel foglalkoz fejezet trgyalja. Alaktsuk t az alkalmazsunkat gy, hogy az kilistzza a telefon szntmit, s ha a felhasznl kivlaszt egyet, akkor azt lthatv teszi! Sajnos, tnylegesen a telefon tmjt nem tudjuk kdbl vltoztatni (legalbbis nem leglisan), taln majd egy kvetkez Windows Phone verziban. Hozzunk ltre egy j osztlyt, amely a sznek nevt s hexadecimlis kdjt trolja! Ahhoz, hogy az osztlybl ltrehozott pldnyokat menteni tudjuk (Isolated Storage vagy a telefon beptett PhoneApplicationService megoldsa segtsgvel), annak sorosthatnak kell lennie, mgpedig a DataContractSerializer segtsgvel. Az ehhez szksges objektumok Windows Phone esetben is implementlsra kerltek, semmi mst nem kell tennnk, mint felvenni a System.Runtime.Serialization assembly-t a knyvtr referencik kz!
[DataContract] public class PhoneTheme { [DataMember] public string Name { get; set; } [DataMember] public string HexValue { get; set; } }

120

llapotok kezelse Szksgnk lesz egy egyszer felhasznli felletre is, amely mindsszesen egy listt fog tartalmazni a ListBox vezrlvel megvalstva. Miutn sajt entitsokkal dolgozunk, a vezrl alapesetben nem lenne alkalmas azok megjelentsre, gy egy sablon segtsgvel talaktjuk. Ennek hatsra a httere a trolt szn lesz, s minden listaelem kzepn szvegesen is megjelenik majd az entits neve:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ListBox x:Name="accentList"> <ListBox.Resources> <DataTemplate x:Key="AccentItemTemplate"> <Grid Width="400" Height="100" Margin="28,0,0,20" Background="{Binding HexValue}"> <Border BorderBrush="White" BorderThickness="2"/> <TextBlock HorizontalAlignment="Center" Text="{Binding Name}" VerticalAlignment="Center" FontSize="24" /> </Grid> </DataTemplate> </ListBox.Resources> <ListBox.ItemTemplate> <StaticResource ResourceKey="AccentItemTemplate"/> </ListBox.ItemTemplate> </ListBox> </Grid>

Most mr van olyan entits osztlyunk, amely kpes az elemeket trolni, s van hozz egy felhasznli felletnk, amely megjelenti azokat. Hozzuk ltre a tnyleges listnkat is! Egyszer esettel van dolgunk, elegend lesz egy List<T> generikus listapldny, amelyet helyben inicializlunk is az j elemek megadsval. Nyissuk meg a MainPage.xaml.cs fjlt, s hozzuk ltre a kvetkez adattagot:
private { new new new new new new new new new new }; List<PhoneTheme> themes = new List<PhoneTheme> PhoneTheme PhoneTheme PhoneTheme PhoneTheme PhoneTheme PhoneTheme PhoneTheme PhoneTheme PhoneTheme PhoneTheme { { { { { { { { { { Name Name Name Name Name Name Name Name Name Name = = = = = = = = = = "Blue", HexValue = "#FF1BA1E2" }, "Brown", HexValue = "#FFA05000" }, "Green", HexValue = "#FF339933" }, "Lime", HexValue = "#FFA2C139" }, "Magenta", HexValue = "#FFD80073" }, "Mango", HexValue = "#FFF09609" }, "Pink", HexValue = "#FFE671B8" }, "Purple", HexValue = "#FFA200FF" }, "Red", HexValue = "#FFE51400" }, "Teal", HexValue = "#FF00ABA9" },

Mieltt elsiklannk felette, szksgnk lesz egy metdusra, amely a szvegesen megadott sznkdokat gy alaktja t, hogy a Silverlight azt megjelenthesse. De mit is tud a Silverlight megjelenteni? Hiszen XAML kdban is nvvel vagy hexadecimlis kddal adjuk meg a szneket, itt mirt nem j ez? A XAML-ben megadott kdot az objektum kpes interpretlni, s a szksges vltoztatsokat elvgezni automatikusan, azonban erre nincs lehetsgnk mgttes kdbl. Itt a Brush alaposztly valamelyik leszrmazottjt kell segtsgl hvnunk, amely a mi esetnkben a SolidColorBrush lesz, ez egyszn kitltst tesz lehetv. Ennek az objektumnak a konstruktora egy Color tpus objektumpldnyt vr, gy a szvegesen megadott sznkdunkat ilyen tpusra kell talaktanunk. Ennek az elvgzse rendkvl egyszer:
private SolidColorBrush GetColorFromHex( string color ) { return new SolidColorBrush( Color.FromArgb( Convert.ToByte( color.Substring( 1, 2 ), 16 ), Convert.ToByte( color.Substring( 3, 2 ), 16 ),

121

5. Az alkalmazs letciklusa

Convert.ToByte( color.Substring( 5, 2 ), 16 ), Convert.ToByte( color.Substring( 7, 2 ), 16 ) ) ); }

Kattintsunk tervezi nzetben kettt a telefon felletn, s a Visual Studio ltrehozza a Loaded esemnykezelt. Ebben els dolgunk az, hogy az elbb ltrehozott listt tadjuk a felleten elhelyezett ListBox vezrlnek. Ezt knnyedn megtehetjk, mivel a ListBox ItemsSource tulajdonsgnak a feltltse utn a Silverlight adatkt motor automatikusan kivezeti a listaelemeket a felletre, ahol a vezrl a nemrg ltrehozott sablon segtsgvel meg is jelenti azokat. Itt viszont lesz mg egy feladatunk! Ha el volt mentve az llapot, akkor azt itt helyre kell lltanunk! Elszr nzzk ezt meg a telefon beptett eszkzvel megvalstva, amelyet a PhoneApplicationService osztlyon keresztl rhetnk el! Ennek az osztlynak van egy State nevezet gyjtemnye, amelyen megvizsgljuk, hogy tartalmazza-e a Theme nev kulcsot. Ha igen, akkor nem elszr hasznljuk az alkalmazst, s korbban mentettnk mr llapotot. Nincs is ms dolgunk, mint kiolvasni a kulcshoz tartoz rtket s a felleten tlltani az adott sznre a htteret:
void MainPage_Loaded(object sender, RoutedEventArgs e) { accentList.ItemsSource = themes; if ( PhoneApplicationService.Current.State.ContainsKey( "Theme" ) ) LayoutRoot.Background = GetColorFromHex( ((PhoneTheme)PhoneApplicationService.Current.State[ "Theme" ]).HexValue ); }

Valahol az elbb betlttt objektumot el is kellett mentennk, erre a legmegfelelbb hely a listban kivlasztott elem vltoztatst jelz esemny. Ha a tervezi nzetben dupln kattintunk a ListBox vezrlre, akkor a Visual Studio ltrehozza a SelectionChanged esemnykezelt, ezen bell dolgozunk tovbb. Le kell krdeznnk az aktulisan kivlasztott elemet. Mivel az adatkt motor felhasznlsval a tnyleges objektumpldnyokat adtuk t a ListBox-nak, gy lekrdezhetjk magt az elemet, de ugyangy megfelelne az index is, mivel a forrslistt az osztly tovbbra is trolja:
private void accentList_SelectionChanged(object sender, SelectionChangedEventArgs e) { PhoneTheme theme = accentList.SelectedItem as PhoneTheme; LayoutRoot.Background = GetColorFromHex( theme.HexValue ); PhoneApplicationService.Current.State[ "Theme" ] = theme; }

Mieltt futtatnnk az alkalmazst, tennnk kell a belltsok kztt is egy vltoztatst. A Mangban a multitasking bevezetsvel az emultor is megvltozott. Ez alaprtelmezsben nem engedlyezi a Tombstoning llapot tesztelst. Ahhoz, hogy ezt engedlyezzk, jobb egrgombbal kattintsunk a projekt nevre, s vlasszuk a Properties opcit! Ezen bell vlasszuk a Debug flet, s az egyetlen itt tallhat Tombstone upon deactivation while debugging opcit jelljk be! Ezek utn futtathatjuk az alkalmazst.

122

llapotok kezelse

5-4. bra: Alv llapot engedlyezse Visual Studiban A tesztelst a kvetkez lpsekben vgezzk el: Indtsuk el Debug mdban az emultort s benne az alkalmazst! Vlasszunk ki egy sznt a listbl, majd a Start gomb segtsgvel lpjnk ki! Itt be tudjuk tlteni az Internet Explorert vagy egy msik, az emultorra teleptett alkalmazst. Lpjnk ki a vissza gombbal, s trjnk vissza a sajt alkalmazsunkhoz! Az llapota megfelelen helyre lesz lltva. (Ha nem a Resuming llapot kvetkezik be, akkor zrjuk be az emultort, s fordtsuk jra a projektet, majd futtassuk jra!

5-5. bra: Az alkalmazs futsnak pillanatfelvtelei A fenti mdszer nem menti el az adatokat vgrvnyesen. Ha valban perzisztlni szeretnnk azokat, akkor az Isolated Storage-ba kell mentennk. Mivel ltalnosthat megoldst szeretnk mutatni s nem csak az alkalmazsra specifikusat, gy az adatsorostst vlasztottam. Az entitsosztlyt fel kell kszteni DataContractSerializerrel val egyttmkdsre, most ezt ki is prbljuk. Szksgnk van egy alkalmazsszint statikus pldnyra a PhoneTheme osztlybl, a memriban ide fogjuk menteni a felleten vgzett vltoztatsokat, s ide fogjuk majd visszatlteni azokat. Ezenkvl kt metdusra is szksgnk van mg, az egyik feladata az adatok mentse, a msik pedig azok visszatltse.

123

5. Az alkalmazs letciklusa

public static PhoneTheme Theme { get; set; } private void SaveData() { using ( IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication() ) { using ( IsolatedStorageFileStream stream = file.CreateFile( "theme.xml" ) ) { // j DataContractSerializer pldny, a megfelel tpussal elltva DataContractSerializer serializer = new DataContractSerializer( Theme.GetType() ); // az objektum sorostsa a megnyitott adatfolyamra serializer.WriteObject( stream, Theme ); } } } private void LoadData() { using ( IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication() ) { // vizsgljuk meg ltezik-e mr a fjl if ( !file.FileExists( "theme.xml" ) ) Theme = new PhoneTheme { Name = "Blue", HexValue = "#FF1BA1E2" }; else using ( IsolatedStorageFileStream stream = file.OpenFile( "theme.xml", FileMode.Open, FileAccess.Read ) ) { // ltezett a fjl, gy megfelel tpussal visszaolvassuk az adatokat. DataContractSerializer serializer = new DataContractSerializer( typeof( PhoneTheme ) ); Theme = (PhoneTheme)serializer.ReadObject( stream ); } } }

A beolvass esetre megvizsgltuk, hogy ltezik-e mr a fjl, gy a LoadData() metdus is nyugodtan hasznlhat. Nincs is ms dolgunk, mint az alkalmazs indtsakor s lelltsakor meghvni az oda tartoz metdusokat (nem szksges megklnbztetni, hogy milyen tpus indtsrl s lelltsrl van sz).
private void Application_Launching(object sender, LaunchingEventArgs e) { LoadData(); } private void Application_Activated(object sender, ActivatedEventArgs e) { if ( e.IsApplicationInstancePreserved ) { } else { LoadData(); } } private void Application_Deactivated(object sender, DeactivatedEventArgs e) { SaveData(); }

124

Folyamatok a httrben

private void Application_Closing(object sender, ClosingEventArgs e) { SaveData(); }

A felhasznl fellet mgttes kdja az albbiak szerint mdosul, felhasznlva az alkalmazsszinten elhelyezett statikus objektumpldnyt:
void MainPage_Loaded(object sender, RoutedEventArgs e) { accentList.ItemsSource = themes; LayoutRoot.Background = GetColorFromHex( App.Theme.HexValue ); } private void accentList_SelectionChanged(object sender, SelectionChangedEventArgs e) { PhoneTheme theme = accentList.SelectedItem as PhoneTheme; LayoutRoot.Background = GetColorFromHex( theme.HexValue ); App.Theme = theme; }

Folyamatok a httrben
A fejezet elejn emltettem, hogy a Windows Phone 7 nem engedte az alkalmazsoknak, hogy amikor nem k voltak eltrben, a httrben mveleteket vgezzenek. Rszletesen lertam, hogyan mkdik a multitasking, s ennek hinyban mirt nem tehette az opercis rendszer ezeket a funkcikat elrhetv.

Elmleti ttekints
Alapesetben egy alkalmazsra gy tekintnk, hogy annak az eltrben kell futnia. Azonban vannak olyan esetek, amikor szeretnnk, hogy olyankor is trtnjen valami, amikor a felhasznl ppen ms alkalmazst futtat, vagy egyltaln nem is hasznlja a telefonjt. Tipikus eseteket is felsorolhatunk: Van egy zenelejtsz alkalmazsunk. A felhasznl valsznleg nem fogja folyamatosan a kezben a telefonjt, s nem hasznlja aktvan, lehet, hogy kzben egy knyvet olvas, vagy ppen a munkjt vgzi. Ilyenkor a telefon alv llapotba helyezn a lejtsznkat, s a zene lejtszsa megszakadna. Szeretnnk, ha a zene lejtszsa folytatdna a httrben. Fzshez ksztnk egy idmr alkalmazst, amelynek az a feladata, hogy bizonyos id letelte utn riasszon bennnket, gy biztosan nem felejtjk ott tovbb az telt, s az nem fog odagni. Fzs kzben biztosan nem hasznljuk a telefonunkat, gy ebben az esetben is kellemetlen lenne, ha alv llapotba kerlne az alkalmazs. Megjegyzsknt megemltenm, akr azt is megoldhatjuk, hogy a telefon ne tudjon aludni, amg manulisan ki nem lpnk az alkalmazsbl. Ezzel azonban az akkumultort nagyon hamar lemerthetjk, gy hasznlata nem javasolt. Idjrs-figyel alkalmazst ksztnk, amelynek extra funkcija, hogy vihar kzeledse esetn idben riaszt bennnket. A funkci riasztshoz kapcsold rszre pontosan azok az elvek rvnyesek, amit az elz listapontban emltettem, viszont itt mg valamivel szmolnunk kell. Az idjrs-adatokat nem elegend akkor lekrnnk egy webes szolgltatstl, amikor a felhasznl az alkalmazsunkat hasznlja, mert gy nem biztos, hogy mindig a legfrissebb informcikkal fogunk rendelkezni! Szinkronizlnunk kell a httrben, ez pedig idrl idre adatok letltst jelenti a felhasznl beavatkozsa nlkl is.

A fenti pldkat szndkosan vlasztottam, mg tallkozni fogunk velk az alfejezetek sorn, ahol rszletesen bemutatom ezeket az eseteket.

125

5. Az alkalmazs letciklusa A Windows Phone Mango egy energiatakarkos mdjt vlasztotta a httrmveletek kezelsnek. Elre pontosan meghatrozott feladatkr szerint dolgozhat alkalmazsunk a httrben, s akkor is csak rvid ideig. Ha tl alacsony a telefon akkumultornak a tltttsgi szintje, vagy ha a felhasznl akarja, akkor a httrben l folyamatok futtatsi joga megvonhat az alkalmazstl. Termszetesen akkor is kikapcsolsra fognak kerlni, amikor az alkalmazsunk eltrben fut, gy aktv llapotban ms mdot kell tallnunk az egybknt httrben fut feladatok elltsra. Ezeknek a folyamatoknak a neve Background Agents, s ez csak gyjtnv, a vals feladatok sorn ezek tbb specilis vltozatt vehetjk hasznlatba. Ezeket az genseket Task tpusok gyjtik magukba, melyek kzl kettt rgtn rdemes megemlteni:
PeriodicTask: periodikusan (pldul minden 30. percben) meghvdik, s valamilyen

gyorsan vgrehajthat feladatot lt el.


ResourceIntensiveTask: nagyobb szmtsi feladatok elltsra szolgl (pl. adatok

tmrtse/kitmrtse), legfeljebb 10 percig futhat. Az gensek ltrehozsa sorn tbbszr tallkozunk olyan esettel, amikor kln projektben (s ezrt kln .dll llomnyban) helyezkedik el az gens feladatt ler kd, amely az a WPAppManifest.xml fjlon keresztl kapcsoldik az alkalmazshoz. lljon itt egy plda ennek az llomnynak a szerkezetre:
<ExtendedTask Name="BackgroundTask"> <BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="LocationTaskAgent" Source="LocationTaskAgent" Type="LocationTaskAgent.ScheduledAgent" /> </ExtendedTask>

Zenelejtszs integrlsa sajt alkalmazsokba


Az sszes npszer mobil opercis rendszerre szmos zene- s videlejtsz szoftver ltezik. Sajnlatosan Windows Phone-ra eddig egyltaln nem volt lehetsgnk sajt lejtszk ksztsre, de mg a beptett Zune lejtszval sem tudtuk integrlni alkalmazsainkat. A Windows Phone Mango megjelensvel szerencsre ez gykeresen megvltozott! A multitasking bevezetsvel a Microsoft ltrehozta a httrben fut folyamatokat. A zene lejtszsrt felels gens mlyen az opercis rendszerben tallhat Zune komponensbe van integrlva, gy hasznlhatjuk a hangervezrls hardveres gombjait, vagy a telefon zrolst felold kpernyjn tallhat zenelejtszs kezelfelletet is. Amikor alkalmazsunk zent jtszik le, az adott audi bekerl a Zune Media Queue-ba, gy ugyanabban a bnsmdban rszesl, mint brmelyik zennk a mdiagyjtemnyben. A Mango megjelensvel nemcsak egy ilyen genst, hanem rgtn kettt is kapunk. Az AudioPlayerAgent egy listt vr zeninkbl, melyek helyben troltak vagy akr egy tvoli cmen elrhetek is lehetnek. Itt vigyznunk kell arra, hogy a telefon szmra fogyaszthat audio formtumokkal kdolt zenei llomnyokra hivatkozzunk. Az AudioStreamingAgent esetben mi rhatjuk meg azt a komponenst, amely a zenei informcit kpes dekdolni, s gy olyan forrsadattal dolgozhatunk, amilyennel csak szeretnnk. A kvetkez mintaalkalmazsban az AudioPlayerAgent-et hasznljuk fel, gy hasznos, ha most az elejn el is ksztnk nhny MP3 zeneszmot a kedvenceink kzl! Adjunk hozz meglv alkalmazsunkhoz egy j lapot! A projekt gyorsmenjbl vlasszuk ki az Add New Item Windows Phone Portrait Page parancsot, s nevezzk el a fjlt AudioPlayerPage.xaml-nek! A felletet az albbi kdok szerint alaktsuk ki, az csak egy lejtszs, egy elre- s egy htratekers gombot tartalmaz:
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="BACKGROUND AUDIO PLAYER" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="play a song" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

126

Folyamatok a httrben

<StackPanel Orientation="Horizontal" Width="420" Margin="18,40,18,0" VerticalAlignment="Top"> <Button Content="prev" x:Name="prevButton" Height="140" Width="140" Click="prevButton_Click"/> <Button Content="play" x:Name="playButton" Height="140" Width="140" Click="playButton_Click"/> <Button Content="next" x:Name="nextButton" Height="140" Width="140" Click="nextButton_Click"/> </StackPanel> <TextBlock x:Name="txtCurrentTrack" Height="75" HorizontalAlignment="Left" Margin="12,193,0,0" VerticalAlignment="Top" Width="438" TextWrapping="Wrap" /> </Grid>

Hozzunk ltre egy j mappt s msoljuk bele az MP3 fjlokat, amiket szeretnnk majd lejtszani! Jelljk ki a zenefjlokat, jobb kattintssal rajtuk a Properties parancsot vlasztva lltsuk be a Copy To Output Directory tulajdonsgot a Copy if newer opcira! Az n projekt struktrm az 5-6. brn lthat, ehhez hasonl eredmnyt kell kapnunk.

5-6. bra: A projekt struktrja Kvetkez tennivalnk a zenefjlok tmsolsa az Isolated Storage-ba. Fontos megemlteni, hogy az AudioPlayerAgent csak Isolated Storage-ban s tvoli elrsi ton elhelyezett audio fjlokat tud lejtszani, a Zune gyjtemnynkhz nincs hozzfrse, gy Zune-on keresztl a telefonra msolt zenket ne is prbljuk meg elrni! Az App.xaml.cs fjlban helyezzk el az albbi metdust, s ne felejtsk azt az App osztly konstruktorbl meghvni! Termszetesen a zeneszmokat tartalmaz fjlok listjt mindenkinek a sajt fjljaira kell szabnia.

127

5. Az alkalmazs letciklusa

using System.IO.IsolatedStorage; using System.Windows.Resources; private void CopyToIsolatedStorage() { using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) { string[] files = new string[] { "1-01 Mr. Know It All.mp3", "1-02 What Doesn't Kill You (Stronger).mp3", "1-03 Dark Side.mp3" }; foreach (var _fileName in files) { string _filePath = "Audio/" + _fileName; if (!storage.FileExists(_filePath)) { StreamResourceInfo resource = Application.GetResourceStream( new Uri(_filePath, UriKind.Relative)); using (IsolatedStorageFileStream file = storage.CreateFile(_fileName)) { int chunkSize = 4096; byte[] bytes = new byte[chunkSize]; int byteCount; while ((byteCount = resource.Stream.Read(bytes, 0, chunkSize)) > 0) { file.Write(bytes, 0, byteCount); } } } } } }

Van mr teht lejtszhat zeneszmunk. Mg felhasznli fellet is van hozz, azonban mg nem mkdik az alkalmazsunk, tbb dolog is hinyzik ehhez! Elszr is, ha futtatjuk emultorban a projektet, akkor nem a megfelel fellet jelenik meg. Ehhez be kell lltani, hogy melyik lap (Page objektum) legyen az alkalmazs indtsakor az alaprtelmezett. Ezt gy tudjuk megtenni, hogy a projekten bell tallhat Properties mappban az ott lv WPAppManifest.xml fjlban trjuk a szksges hivatkozst a kvetkezre:
<Tasks> <DefaultTask </Tasks>

Name ="_default" NavigationPage="MusicPlayerPage.xaml"/>

Ezek utn, ha futtatjuk, akkor mr a megfelel felletet fogjuk ltni. Azonban mg mindig nem mkdik! Van hrom gombunk, az ezekhez tartoz funkcionalitst meg kell rnunk! A BackgroundAudioPlayer egy singleton osztly, gy azt pldnyosts nlkl a megfelel nvtr feloldsa utn hasznlhatjuk is. Ennek az osztlynak a mveleteit tudjuk arra felhasznlni, hogy a zeneszmok kztt vltogassunk, meglltsuk vagy elindtsuk az aktulis zeneszmot, esetleg lekrdezzk a zenelejtsz sttuszt. A kvetkezkben a feladatunk az, hogy ezeket a mveleteket fel is hasznljuk. Figyelnnk kell a zenelejtszs sttuszra is, ennek fggvnyben vltoztatjuk a lejtszs/szneteltets gomb tartalmt, illetve az aktulis zeneszmrl megjelentett informcit. Mivel a zene lejtszsa az alkalmazsbl val kilpskor is folytatdik, gy vigyznunk kell arra is, hogy az alkalmazs jbli eltrbe kerlse esetn a gombok megfelel llapotban jelenjenek meg a felleten.

128

Folyamatok a httrben

using System.Windows.Navigation; using Microsoft.Phone.BackgroundAudio; private void prevButton_Click(object sender, RoutedEventArgs e) { BackgroundAudioPlayer.Instance.SkipPrevious(); } private void playButton_Click(object sender, RoutedEventArgs e) { if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState) { BackgroundAudioPlayer.Instance.Pause(); } else { BackgroundAudioPlayer.Instance.Play(); } } private void nextButton_Click(object sender, RoutedEventArgs e) { BackgroundAudioPlayer.Instance.SkipNext(); } // ezt a konstruktorban helyezzk el! BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged); void Instance_PlayStateChanged(object sender, EventArgs e) { switch (BackgroundAudioPlayer.Instance.PlayerState) { case PlayState.Playing: playButton.Content = "pause"; break; case PlayState.Paused: case PlayState.Stopped: playButton.Content = "play"; break; } if (null != BackgroundAudioPlayer.Instance.Track) { txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title + " by " + BackgroundAudioPlayer.Instance.Track.Artist; } } protected override void OnNavigatedTo(NavigationEventArgs e) { if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState) { playButton.Content = "pause"; txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title + " by " + BackgroundAudioPlayer.Instance.Track.Artist; } else { playButton.Content = "play"; txtCurrentTrack.Text = ""; } }

129

5. Az alkalmazs letciklusa Ha fordtjuk s futtatjuk a projektet, azt tapasztaljuk, hogy a zenk lejtszsa mg mindig nem mkdik. Ez nem is csoda, hiszen egy nagyon fontos komponens mg hinyzik! Ez nem ms, mint maga a zent lejtsz gens. Ptoljuk a hinyossgot, s a Solution Explorerben adjuk hozz egy j projektet jelenlegi megoldsunkhoz! Vlasszuk ki a projekt gyorsmenjbl az Add New Project parancsot, majd projekt tpusaknt a Windows Phone Audio Playback Agent-et vlasszuk! Adjuk neki az AudioPlayer nevet! A Visual Studio ltrehozza a projektet s abban egy AudioPlayer.cs fjlt, amelyben dolgozni fogunk. Mieltt tovbbhaladnnk, adjuk hozz az j projekt referencijt a Windows Phone projektnkhz! Szksgnk lesz egy listra, amely a zenefjlokra hivatkozik, ebben a listban AudioTrack tpus objektumpldnyokat sorolunk fel. Az AudioTrack konstruktora egyms utn a kvetkez paramtereket fogadja: zenefjl, dal cme, elad, lemez cme, lemez kpe. Szksgnk lesz mg egy szmllra is, amely azt trolja, hogy ppen melyik zeneszmot jtsszuk le! Ha annak rtke egyenl a lista mretvel, akkor tl vagyunk az utols zeneszmon, s a nulladik sorszmra kell ugranunk. Ha visszafel lpkednk a zeneszmok kztt, akkor pedig a logikt megfordtva, 0 utn a lista utols elemre ugrunk. Ezek utn nincs semmi ms dolgunk, mint a szksges helyeken meghvni a lejtszsrt felels fggvnyt, illetve vltani listban a felhasznl ignye szerint:
static int currentTrackNumber = 0; private static List<AudioTrack> _playList = new List<AudioTrack> { new AudioTrack(new Uri("1-01 Mr. Know It All.mp3", UriKind.Relative), "Mr. Know It All", "Kelly Clarkson", "Stronger", null), new AudioTrack(new Uri("1-02 What Doesn't Kill You (Stronger).mp3", UriKind.Relative), "Stronger", "Kelly Clarkson", "Stronger", null), new AudioTrack(new Uri("1-03 Dark Side.mp3", UriKind.Relative), "Dark Side", "Kelly Clarkson", "Stronger", null), new AudioTrack(new Uri("http://traffic.libsyn.com/wpradio/WPRadio_29.mp3", UriKind.Absolute), "Episode 29", "Windows Phone Radio", "Windows Phone Radio Podcast", null) }; private void PlayNextTrack(BackgroundAudioPlayer player) { if (++currentTrackNumber >= _playList.Count) { currentTrackNumber = 0; } PlayTrack(player); } private void PlayPreviousTrack(BackgroundAudioPlayer player) { if (--currentTrackNumber < 0) { currentTrackNumber = _playList.Count - 1;

130

Folyamatok a httrben

} PlayTrack(player); } private void PlayTrack(BackgroundAudioPlayer player) { player.Track = _playList[currentTrackNumber]; } protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState) { switch (playState) { case PlayState.TrackReady: player.Play(); break; case PlayState.TrackEnded: PlayNextTrack(player); break; } NotifyComplete(); } protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: PlayTrack(player); break; case UserAction.Pause: player.Pause(); break; case UserAction.SkipPrevious: PlayPreviousTrack(player); break; case UserAction.SkipNext: PlayNextTrack(player); break; } NotifyComplete(); }

Teszteljk alkalmazsunkat emultorban, vagy akr les eszkzn, hogyha rendelkezsnkre ll! Az 5-7. bra az alkalmazst mutatja be futs kzben.

131

5. Az alkalmazs letciklusa

5-7. bra: Az Audio Player alkalmazs futs kzben

Figyelmeztetsek s riasztsok kezelse


A Windows Phone Mango lehetv teszi, hogy sajt riasztsokat s emlkeztetket ksztsnk. Pldknt egy sajt alkalmazsomat mutatom be, amely fzs kzben segt nekem. A neve Cook Timer s megtallhat a Windows Phone Marketben. Hrom klnbz idztt tudunk belltani, melyek egymstl fggetlen mrik az id elrehaladst, s amikor elkszlt az adott tel, figyelmeztetnek bennnket. Termszetesen ehhez nem kell folyamatosan hasznlnunk az alkalmazst, az nyugodtan deaktivlt llapotba kerlhet, a figyelmeztetsek akkor is mkdni fognak! Ezeket a ScheduledActionService objektum felgyeli, melyen keresztl egy j emlkeztett be tudunk temezni, illetve ha a felhasznl vltoztatst vgzett a httrben, esetleg le szeretn lltani a riasztst, akkor ki tudjuk azt keresni s trlni tudjuk a sorbl. j idzts hozzadsra a kvetkez kdrszlet mutat pldt:
private void MakeAlarm() { alarm = new Alarm( Name ); alarm.Content = "Time is up!\n" + Name + " is/are done now!"; alarm.BeginTime = DateTime.Now.AddMinutes(Math.Ceiling( beginTime.Value )); alarm.ExpirationTime = DateTime.Now.AddMinutes(Math.Ceiling(beginTime.Value )) .AddSeconds( 10 ); alarm.RecurrenceType = RecurrenceInterval.None; alarm.Sound = new Uri( "Sounds/House Fire Alarm.mp3", UriKind.Relative ); ScheduledActionService.Add( alarm ); }

A fenti pldban lthat, hogy a riasztsnak egy nevet kell adnunk, definilni kell a megjelentend tartalmt, s meg kell adni a riaszts idpontjt, illetve azt, hogy jra emlkeztessen-e. Sajt hangokat is rendelhetnk hozz, azonban ekkor figyeljnk arra, hogy az adott MP3 az alkalmazs mell legyen

132

Folyamatok a httrben csomagolva, ne Zune mdia knyvtrbl akarjuk elrni, mert ahhoz itt sincs hozzfrsnk! Ha idkzben szeretnnk lelltani a riasztst s trlni a sorbl, akkor arra a kvetkez kdrszlet mutat pldt:
void CleanupOldReminder( AlarmItem item ) { var reminder = ScheduledActionService.Find( item.Title ); if ( reminder != null && reminder.IsScheduled == false ) ScheduledActionService.Remove( reminder.Name ); }

Az 5-8. bra az alkalmazst mutatja be mkds kzben.

5-8. bra: a Cook Timer alkalmazs mkds kzben

Adatok letltse a httrben


Elkpzelhet, hogy az alkalmazsunk idrl idre adatokat szeretne szinkronizlni valamilyen szerver oldali komponenssel, esetleg nagyobb llomnyok letltse vlt szksgess. A Windows Phone Mango bevezette a Background File Transfer objektumokat, melyek HTTP s HTTPS protokollokon kpesek adatokat forgalmazni. Sajnos az FTP protokoll hasznlata jelenleg nem tmogatott. Mieltt rszletesen megnznnk, hogyan is trtnik letlts, nzzk meg azokat a korltozsokat, amelyekkel szmolnunk kell! Mretkorltok: Adatforgalmazs tpusa Fjl feltltse Fjl letltse mobil csatornn (3G, HSDPA, stb) Fjl letltse WIFI hlzaton (akkumultorrl) Maximlis mret 5 MB 20 MB 100 MB

133

5. Az alkalmazs letciklusa Egyb korltozsok: Korltozs tpusa Az adatforgalmaz sorban lv elemek szma Maximlis rtk 5 (a teljestett letltseket manulisan kell trlnnk kdbl)

Egyidej adatforgalmazs adott telefonrl (tbb 2 alkalmazs ltal) Maximlisan betemezhet (vrakozsi sorba kerlnek) HTTP fejlcek szma krsenknt HTTP fejlcek maximlis mrete letltsek 500 15 16 KB kln-kln

Fontos azt is tudni, hogy a letltsek szneteltetsre kerlnek, ha 3G hlzat esetben 50 Kbps s WIFI esetben 100 Kbps al cskken a hlzat tereszt kpessge. Kt objektumtpus segt bennnket ezeknek a feladatoknak a megvalstsban. Az egyik a BackgroundTransferRequest, amely lerja magt a krst egyetlen tvoli llomnyra mutatva. A msik a BackroundTransferService, ez egy olyan sorknt kpzelhet el, amely egyesvel vgrehajtja az tadott letlts-krseket. A BackgroundTransferRequest objektumnak meg kell adnunk, hogy honnan kell a letltst vgeznie, s a HTTP protokoll melyik igjt szeretnnk hozz hasznlni. Miutn fjlrendszerbe fognak letltdni a fjlok, gy egy olyan helyi elrsi tra is szksgnk lesz, ahova ezeket a Windows Phone bemsolhatja. Azt is megadhatjuk, hogy milyen belltsok mellett szeretnnk az adatforgalmazst engedlyezni. Ilyen bellts pldul az, hogy csak a cellulris hlzaton, esetleg Wifin keresztl kvnjuk ezt lehetv tenni, esetleg vrjunk tlt csatlakoztatsra, hanghvs megzavarhatja-e a letltst (ha nem 3G hlzaton vagyunk, hanem mondjuk GPRS vagy EDGE mdban mkdnk, akkor ez elfordulhat), s gy tovbb. Ha a belltsokkal vgeztnk, akkor a kivtelkezelst figyelembe vve megkezdhetjk a letltst a BackgroundTransferService objektum segtsgvel. A kvetkez kdrszlet a Silverlight 4.0 fejlesztknek cm knyv PDF vltozatt tlti le a httrben:
// Silverlight 4.0 fejlesztknek knyv pdf-ben string transferFileName = "http://goo.gl/9dkcY"; Uri transferUri = new Uri( Uri.EscapeUriString( transferFileName ), UriKind.RelativeOrAbsolute ); BackgroundTransferRequest request = new BackgroundTransferRequest( transferUri ); request.Method = "GET"; //megadjuk, hogy hova tltse le a fjlt string downloadFile = transferFileName.Substring(transferFileName.LastIndexOf( "/" ) + 1 ); Uri downloadUri = new Uri( "shared/transfers/" + downloadFile, UriKind.RelativeOrAbsolute ); request.DownloadLocation = downloadUri; request.TransferPreferences = TransferPreferences.AllowCellularAndBattery; try { // a httrben betemezzk a letltst BackgroundTransferService.Add(request); } catch(Exception ex) { // ha valami problma volt }

134

sszefoglals

sszefoglals
A fejezetben lthattuk, hogy az els Windows Phone 7 verzihoz kpest amely alig egy vvel ezeltt jelent meg mennyit fejldtt az opercis rendszer Mango kdnev legjabb kiadsa. Az j multitasking krnyezet szmos j dolgot tesz lehetv a fejlesztknek, amelyre eddig csak nagyon nehzkesen vagy esetleg egyltaln nem tallhattunk megoldst. Az elmleti bevezetst kveten gyakorlatban is lthattuk azokat a lpseket, melyek az alkalmazst segtik beilleszkedni a Windows Phone letciklus modelljbe, s arrl gondoskodnak, hogy semmilyen esetben se veszhessenek el a felhasznl munkafolyamataihoz tartoz adatok. Lthattuk, hogy nem vgezhetnk akrmit szabadon a httrben, minden feladatnak specilisan a hozz illeszked feladat kategriba kell kerlnie, ahol a megfelel objektumok vgrehajtjk az ltalunk megvalstott feladatok logikjt.

135

6. Alapvet telefonos funkcik hasznlata


A Windows Phone 7 platform megalkotsa sorn az egyik legfontosabb szempont a biztonsg, a rendszer sebezhetetlensge volt. Emiatt a platform natv, a CLR rteg alatt fut biztonsgi mechanizmusokkal rendelkezik, de ennek ksznhet az is, hogy az sszes alkalmazs gynevezett sandbox-ban, vagyis a tbbi programtl elzrt homokozban fut. Ez a sajt tr tartalmazza az alkalmazs izollt trhelyt (Isolated Storage) s a program kontextust, oly mdon, hogy ahhoz kls alkalmazsok ne tudjanak hozzfrni, st annak ltezsrl ne is tudhassanak. Ennek kvetkezmnye az, hogy a programok nem egy felhasznl kontextusban futnak, valamint a teljes httrtrra vonatkoz fjlrendszer fogalma sem rtelmezhet az alkalmazsok szemszgbl. Az alkalmazsok teht egyms ell rejtve futnak s lteznek, viszont elfordulnak olyan ltalnos feladatok, amelyekre szmos programnak szksge lehet. Ilyen feladat egy telefonhvs indtsa, e-mail vagy SMS kldse, fnykpek ksztse, de ide tartozik a mdiatr s a kapcsolattr elrse is. Ezeket a funkcikat a platform rszeknt szlltott alkalmazsok valstjk meg. Azrt, hogy ezekhez fejlesztknt mi is hozzfrhessnk, bevezettk az gynevezett taszkok (Task) rendszert. A taszkok a platform fbb funkciihoz hozzfrst biztost programok, amelyek ugyan szintn sandboxban futnak, de brmely alkalmazs ltal elrhetek az SDK-n keresztl. A taszkok a Microsoft.Phone.Tasks nvtrben tallhatak, indtsuk a pldnyostst s helyes paramterezst kvet Show() fggvnyhvssal trtnik. Egy taszk indtsakor alkalmazsunk a httrbe kerl, deaktivldik, a futtatott feladat pedig aktvv vlik. Ms szavakkal: kontextusvlts trtnik, amelynek mkdst bvebben az 5. fejezet taglalja. A folyamat lefutst, az rintett llapotokat s az ezek kzti esemnyeket a 6-1 bra mutatja.

6-1 bra: Esemnyek s llapotvltozsok taszk indtsakor A taszkok kt f csoportra bonthatk: a valamilyen adatot visszatrsi rtkknt szolgltat Chooserekre s az egyszer programindtst elvgz Launcherekre. Egy telefonhvs indtsa pldul egy Launcher, hiszen nem vrunk semmi adatot, a lnyeg csupn a feladat elvgzse. Ezzel szemben egy fnykp ksztse sorn rtelmetlen lenne, ha nem kapnnk vissza az elkszlt kpet, teht ezt a funkcit egy Chooser valstja meg.

137

6. Alapvet telefonos funkcik hasznlata A Mango verziban elrhet Launcherek az albbiak: Launcher neve
EmailComposeTask MediaPlayerLauncher PhoneCallTask SmsComposeTask WebBrowserTask SearchTask MarketplaceDetailTask MarketplaceHubTask MarketplaceReviewTask MarketplaceSearchTask

Megvalstott funkci E-mail zenet rsa s kldse Megadott mdia (video / audio) lejtszsa Telefonhvs indtsa SMS rsa Bngsz indtsa Webes keress Alkalmazs rszleteinek mutatsa a Marketplace kliensben Marketplace kliens indtsa Vlemny rsa alkalmazsunkrl a Marketplace-re Keress indtsa a Marketplace kliensben

A Chooserek listja: Choose neve


SavePhoneNumberTask SaveContactTask SaveEmailAddressTask EmailAddressChooserTask AddressChooserTask CameraCaptureTask PhoneNumberChooserTask PhotoChooserTask SaveRingtoneTask GameInviteTask

Megvalstott funkci Telefonszm mentse a kapcsolatok trba j partner felvtele a kapcsolatlistra E-mail cm mentse a kapcsolatok trba E-mail cm kivlasztsa kapcsolatlistnkrl Cm kivlasztsa kapcsolatlistnkrl Kp ksztse alkalmazsunk szmra Telefonszm kivlasztsa kapcsolatlistnkrl Fnykp kivlasztsa a fnykptrbl Csenghang mentse Tbb rsztvevs jtkokban a partnerek meghvst teszi lehetv

Tbb olyan taszk is ltezik, amely feladatt egy-egy beptett vezrl is kpes elltni. Amennyiben viszont nincsenek egyedi ignyeink a funkcival kapcsolatban, akkor nemcsak egyszerbb a taszk hasznlata, de a platform tbbi rszvel konzisztens megoldst is biztost. Ez a felhasznl szmra sokkal egysgesebb rendszerkpet s knnyebb kezelhetsget garantl.

A pldaalkalmazs ltrehozsa
A fejezet els rszben a felsorolt taszkokkal fogunk rszletesen megismerkedni. Ehhez hozzunk ltre egy j projektet 06 Integrating with the Phone nvvel! Mivel a Chooserek s Launcherek kt jl szeparlhat rszre osztjk a feladatot, rdemes ezek mentn kln lapokra bontani a megjelentsi felletet is. Erre elegns mdszer a 4. fejezetben bemutatott Pivot vezrl, amit legegyszerbben a Windows Phone Pivot Application projektsablon kivlasztsval (6-2 bra) helyezhetnk el alkalmazsunkban.

138

A pldaalkalmazs ltrehozsa

6-2 bra: Windows Phone Pivot Application sablon kivlasztsa a projekt ltrehozsakor A kvetkez dialgusban mindenkppen vlasszuk a Windows Phone OS 7.1-es verzit, mivel a taszkok egy rsze csupn a Mango frisstssel vlt elrhetv! A sablonbl generlt projekt felptst (6-3 bra) rdemes tzetesebben tvizsglni, mivel pldt mutat arra, hogyan tudjuk az MVVM modellnek megfelelen szervezni kdunkat.

6-3 bra: A sablon ltal generlt projekt Ez a megkzelts a lehet legjobban elvlasztja a klnbz felelssgeket (adatszolgltats, logika, megjelents), s kihasznlja a Silverlight ltal biztostott adatktsi mechanizmust. A ViewModels mappa fogja ssze azokat az osztlyokat, amelyek az egyes oldalak, megjelentsi felletek ltal elvrt formban troljk az egyb adatforrsbl szrmaz informcit. Ilyen adatforrs pldul a SampleData MainViewModelSampleData.xaml llomnya, ami XAML formtumban rgzt nhny tesztbejegyzst a tervezsidej megjelentshez (a Blend s a Visual Studio design fellete is ezt hasznlja). Ahhoz, hogy ezt a forrst a tervez eszkzk meg is jelentsk, csak az albbi attribtumokat kell hozzadni a PhoneApplicationPage deklarcijhoz (termszetesen a sablon alapjn ezt a VS mr megtette helyettnk):

139

6. Alapvet telefonos funkcik hasznlata

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"

Futtatskor azonban nem ezeket az adatokat fogjuk ltni, ugyanis a MainViewModel osztly rendelkezik egy LoadData metdussal, ami a vals adatok ellltsrt felels. A Model osztly pldnyt az App.xaml.cs lltja el, s publiklja egy statikus mez formjban:
private static MainViewModel viewModel = null; //... public static MainViewModel ViewModel { get { // ViewModel ltrehozsnak elhalasztsa addig, amg szksgnk nem lesz r if (viewModel == null) viewModel = new MainViewModel(); return viewModel; } }

A megjelentsrt a MainPage.xaml s a hozz tartoz kdfjl felels. Mivel a Pivot sablont vlasztottuk, az oldal kzponti eleme ez a vezrl. Hasznlathoz hivatkoznunk kell a Microsoft.Phone.Controls nvtrre, de ezt a Visual Studio mr megtette helyettnk, st felvett kt lapot a Pivotba, s azokon egyegy ListBoxot helyezett el. A listk adatkts hasznlatval trjk elnk a ViewModelekben definilt publikus tulajdonsgokat.
xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls" ... <Grid x:Name="LayoutRoot" Background="Transparent"> <!--Pivot Control--> <controls:Pivot Title="MY APPLICATION"> <!--Pivot item one--> <controls:PivotItem Header="first"> <!--Double line list with text wrapping--> <ListBox x:Name="FirstListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Margin="0,0,0,17" Width="432" Height="78"> <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </controls:PivotItem> <!--Pivot item two--> <controls:PivotItem Header="second"> <!--Triple line list no text wrapping--> <ListBox x:Name="SecondListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Margin="0,0,0,17">

140

A pldaalkalmazs ltrehozsa

<TextBlock Text="{Binding LineOne}" TextWrapping="NoWrap" Margin="12,0,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/> <TextBlock Text="{Binding LineThree}" TextWrapping="NoWrap" Margin="12,-6,0,0" Style="{StaticResource PhoneTextSubtleStyle}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </controls:PivotItem> </controls:Pivot> </Grid>

A megjelents s az adatok megismerse utn mr csak a kt oldal kztti kapocs kialaktsa maradt htra. Az oldal kontextust a MainPage konstruktora lltja a megfelel ViewModelre:
// Constructor public MainPage() { InitializeComponent(); // Adatkts DataContext = App.ViewModel; this.Loaded += new RoutedEventHandler(MainPage_Loaded); } // Adatok betltse, amint elkszlt az oldal. private void MainPage_Loaded(object sender, RoutedEventArgs e) { if (!App.ViewModel.IsDataLoaded) { App.ViewModel.LoadData(); } }

A generlt projekt megvizsglsval egy kis betekintst nyerhettnk az MVVM architekturlis minta hasznlatba, viszont ha komolyan rdekldnk a tma irnt, akkor a Silverlight 4: A technolgia, s ami mgtte van cm knyv 10. fejezete tkletes kiindulpontot jelent a tanulshoz. Alaktsuk t a projektet a taszkok tesztelshez szksges formba! A Pivot kt lapot tartalmazzon, egyet a launcherek s egyet a chooserek szmra. Minden taszk indtsra vegynk fel kln gombot, ezek pozicionlst pedig bzzuk egy StackPanelre! A StackPanelt viszont mindenkppen egy ScrollVieweren bell definiljuk, hiszen ezzel biztosthat az, hogy a panel grgethetv vlik, amennyiben a tartalom tlnylik a rendelkezsre ll helyen!
<controls:Pivot Title="Integrating with the Phone"> <controls:PivotItem Header="launchers"> <ScrollViewer> <StackPanel> <Button Content="PhoneCallTask" Name="btnPhoneCallTask" Click="btnPhoneCallTask_Click"/> <Button Content="SmsComposeTask" Name="btnSmsComposeTask" Click="btnSmsComposeTask_Click"/> <Button Content="WebBrowserTask" Name="btnWebBrowserTask" Click="btnWebBrowserTask_Click" /> <Button Content="EmailComposeTask" Name="btnEmailLauncher" Click="btnEmailLauncher_Click" /> <Button Content="MediaPlayerLauncher" Name="btnMediaLauncher" Click="btnMediaLauncher_Click" /> <Button Content="SearchTask" Name="btnSearchTask"

141

6. Alapvet telefonos funkcik hasznlata

Click="btnSearchTask_Click"/> </StackPanel> </ScrollViewer> </controls:PivotItem> <controls:PivotItem Header="choosers"> <ScrollViewer> <StackPanel> <Button Content="SavePhoneNumberTask" Name="btnSavePhone" Click="btnSavePhone_Click" /> <Button Content="PhoneNumberChooserTask" Name="btnPhoneNumberChooserTask" Click="btnPhoneNumberChooserTask_Click" /> <Button Content="CameraCaptureTask" Name="btnCameraCaptureTask" Click="btnCameraCaptureTask_Click" /> <Button Content="PhotoChooserTask" Name="btnPhotoChooserTask" Click="btnPhotoChooserTask_Click" /> <Image Name="imgResult" Width="400" Height="400" /> </StackPanel> </ScrollViewer> </controls:PivotItem> </controls:Pivot>

A launcherek s chooserek listjrl hinyoznak a Marketplace-szel kapcsolatos taszkok, mivel ezeket a 12. fejezet rszletesen taglalja. Ezenfell flsleges klnbsget tenni a telefonszmot vagy e-mail cmet szolgltat s mdost feladatok kztt, hiszen mkdsk teljesen azonos, csupn az rintett tulajdonsg klnbzik. A chooserek lapja tartalmazzon egy Image vezrlt is, hiszen a visszatrsi rtkek tartalmazhatnak szveget s kpet is! A szveges vlaszok megjelentsre tkletes egy felugr ablak (MessageBox), de vizulis elemeket ez sajnos nem tartalmazhat.

Launcherek
PhoneCallTask
Telefonhvs indtsakor ktelez megadni a hvand telefonszmot. Emellett egy nevet is megjelenthetnk, de ennek hinya sem okoz problmt:
private void btnPhoneCallTask_Click(object sender, RoutedEventArgs e) { PhoneCallTask phoneCallTask = new PhoneCallTask(); // a tagols nem ktelez, de gy is megadhatjuk a szmot phoneCallTask.PhoneNumber = "00361/123-4567"; // ezt nem ktelez megadni phoneCallTask.DisplayName = "WP7 support"; phoneCallTask.Show(); }

A Show() metdus elindtja a taszkot, ami elszr lehetsget ad a felhasznlnak a hvs elindtsra vagy elutastsra. A hvs lebonyoltsa a megszokott felleten trtnik, a kihangostsi, nmtsi lehetsgekkel, majd a hvst sszegz zenetet lthatjuk (6-4 bra).

142

Launcherek

6-4 bra: Telefonhvs lebonyoltsa alkalmazsunkbl

SmsComposeTask
Sms kldsekor lehetsgnk van megadni a cmzettek listjt s az zenet szvegt is, de mindkt rtk elhagyhat:
private void btnSmsComposeTask_Click(object sender, RoutedEventArgs e) { SmsComposeTask smsComposeTask = new SmsComposeTask(); smsComposeTask.To = "123-4567; 987-6543"; smsComposeTask.Body = "szveg"; smsComposeTask.Show(); }

A feladat indtsakor a megadott rtkek megjelennek az sms-ek kldst vgz alkalmazsban. A cmzetteket a + gombra kattintva kiegszthetjk, ahogyan az zenet szvegt is trhatjuk. Az ApplicationBaron tallhat gombokkal mdiaelem csatolsra s zenet diktlsra is lehetsgnk van. Termszetesen a klds az emultoron meg fog hisulni, amit az zenetvltsban jelez szmunkra a rendszer(6-5 bra).

6-5 bra: Sms kldse SmsComposeTask hasznlatval

143

6. Alapvet telefonos funkcik hasznlata

EmailComposeTask
Levelek kldshez szksgnk van egy levelez szerverre is. Szerencsre ez nem jelent kln feladatot, hiszen a telefon konfigurlsa sorn valsznleg minden felhasznl bellt egy felhasznli fikot, amelyet a szolgltatsok ignybevtele sorn hasznl. A levelek kldse eltt a taszk megkrdezi a felhasznlt, hogy melyik fikot szeretn hasznlni a feladathoz, ezt kveten jelenik csak meg a szerkeszt fellet. Mivel az emultoron jelenleg nincs md arra, hogy ilyen fikokat lltsunk be, a levlklds sajnos nem lesz tesztelhet, csak kszlkre teleptve (6-6 bra). Kt megolds ltezik arra, hogy ezt a funkcit kiprbljuk. Az egyik az, hogy telefonkszlkre teleptjk az alkalmazsunkat, a msik pedig az, hogy keresnk egy a Microsoft ltal nem tmogatott emultort, ami alkalmas ennek a szolgltatsnak a kiprblsra. Mi a kszlken val kiprblst ajnljuk, ugyanis az a megbzhatbb, de bizonyos esetekben j tudni arrl, hogy ltezik ms megolds is. (Ezeket az emultorokat tbbnyire ingyenesen tlthetjk le.)

6-6 bra: A levlklds sajnos nem elrhet az emultorrl


private void btnEmailLauncher_Click(object sender, RoutedEventArgs e) { EmailComposeTask emailTask = new EmailComposeTask(); // tbb cmzett megadsa emailTask.To ="alpha@test.com; bravo@test.com"; // msolat kldse emailTask.Cc = "charlie@test.com"; // rejtett msolat emailTask.Bcc = "delta@test.com"; emailTask.Subject = "trgy"; emailTask.Body = "zenet szvege"; // task indtsa emailTask.Show(); }

Az zenet minden adata a kdbl is bellthat, de lehetsg van arra is, hogy ezek nlkl, pusztn a Show() fggvnyhvssal egy res e-mail alkalmazst nyissunk.

WebBrowserTask
Gyakori igny alkalmazsokban teljes weboldalak megjelentse. Erre tkletes megolds a WebBrowser vezrl, viszont ez nmagban csak egy megjelent s rtelmez fellet, a beptett Internet Explorer 9 elnyeit, az als URL svot, a kedvencek s elzmnyek rendszerezst s mg szmos funkcit elvesztnk a hasznlatval. Ha nincsenek olyan egyedi ignyeink, mint pldul sajt elemek felvtele az ApplicationBarba, akkor rdemes lehet a bngsz programot elindt WebBrowserTaskot hasznlnunk:
private void btnWebBrowserTask_Click(object sender, RoutedEventArgs e) { WebBrowserTask webBrowserTask = new WebBrowserTask(); // elavult, mr ne hasznljuk! //webBrowserTask.URL = "xy.com";

144

Launcherek

webBrowserTask.Uri = new Uri("http://www.devportal.hu/wp7", UriKind.Absolute); webBrowserTask.Show(); }

A bngsz els indtsakor engedlyt kr a bngszs adatainak felhasznlsra a Bing keres tovbbfejlesztsnek rdekben. Vlasztsunkat kveten az oldal betltdik az Internet Explorer 9 mobilos vltozatba. A bngsz a Mango frisstsnek hla teljes HTML 5 tmogatssal rendelkezik, gy a generlt oldal teljesen megegyezik a szmtgpeken megszokottal. J plda erre az Orchard keretrendszerben elksztett HTML 5-t hasznl https://devportal.hu/wp7 oldal, ami a 6-7 brn lthat.

6-7 bra: A https://devportal.hu/wp7 oldal egy WebBrowserTaskban megjelentve

MediaPlayerLauncher
A platform kt rendkvl egyszeren hasznlhat lehetsget biztost mdiaelemek lejtszsra. Az egyik a Toolboxban megtallhat MediaElement vezrl, ami teljes testreszabhatsgot biztost szmunkra, a msik pedig a pr kdsorral paramterezhet MediaPlayerLauncher taszk (6-8 bra). A taszk hasznlatakor a pldnyostst kveten meg kell adnunk a lejtszand video vagy audio elem cmt, ami lehet loklis vagy tvoli, internetrl szrmaz is. Ennek megfelelen ki kell vlasztanunk, hogy relatv vagy abszolt cmzsrl van sz. A pldban egy internetes videt vlasztottam, gy most abszolt cmzst alkalmazunk. Ha a telefonon tallhat tartalmat szeretnnk lejtszani, akkor meg kell adnunk, hogy az alkalmazssal teleptett vagy az Isolated Storage-be mentett mdit cmznk meg, ezt pedig a MediaPlayerLauncher Location tulajdonsgn keresztl tehetjk meg.
private void btnMediaLauncher_Click(object sender, RoutedEventArgs e) { MediaPlayerLauncher mpl = new MediaPlayerLauncher(); mpl.Media = new Uri(@"http://mschannel9.vo.msecnd.net/o9/mix/09/wmv/key01.wmv", UriKind.Absolute); //mpl.Location = MediaLocationType.Data; mpl.Controls = MediaPlaybackControls.All; mpl.Show(); }

145

6. Alapvet telefonos funkcik hasznlata A Controls tulajdonsgon keresztl kivlaszthatjuk, hogy milyen elre definilt vezrlk jelenjenek meg a mdialejtszban. Ez a mez a MediaPlaybackControl enumerci (All, FastForward, None, Pause, Rewind, Skip, Stop) egy rtkt veheti fel. A 6-8 brn az sszes elem egyttes hasznlata lthat.

6-8 bra: MediaPlayerLauncher taszk egy vide lejtszsa kzben, minden beptett vezrlvel

SearchTask
Keres funkcit megvalst taszk. Segtsgvel a megadott kulcssz alapjn kereshetnk a weben, akr kpek kztt, de ha engedlyeztk a Location Servicest, akkor a pozcink krli kiemelt helyek kztt is. A Mango jdonsga az n. App Connect, aminek hla a keress a Marketplace alkalmazsait is megvizsglja, s a tbbi tallat eltt ajnlja az illeszked alkalmazsokat. A keresszt a taszkon bell mdosthatjuk, a beviteli mez jobb szln tallhat mikrofon gombra kattintva akr diktlva is. A tallatok egy Pivot vezrln jelennek meg, aminek lapjait a 6-9 bra mutatja.
private void btnSearchTask_Click(object sender, RoutedEventArgs e) { SearchTask searchTask = new SearchTask(); searchTask.SearchQuery = "pizza"; searchTask.Show(); }

6-9 bra: A SearchTask tallatainak listja

146

Chooserek

Chooserek
A chooserek kz tartoznak azok a taszkok, amelyek adatot szolgltatnak alkalmazsunk szmra, valamint azok is, amelyekkel a mveletek kimenetrl, esetleges meghisulsukrl kell rtestennk a felhasznlt. Egy telefonhvs indtsa launcher, mivel egy fellp hibrl azonnal rtesl a felhasznl, de egy telefonszm mentst indtvnyoz SavePhoneNumberTask kimenete kzvetlenl nem rzkelhet, hibja pedig adatvesztshez vezethet. Emiatt az ilyen taszkok visszatrsi rtkkel rendelkeznek, ami tartalmazhat egy kivtelt (Exception), illetve a futs kimenetelt (sikeres, meghisult), valamint brmilyen a taszk jellegbl add adatot (pl. kpet). A taszkok termszetesen kln szlon futnak, gy a kommunikci egy esemnykezel (Completed) implementlsval trtnik. A plda sorn ebben a metdusban egy prbeszdablakban fogjuk megjelenteni a szveges visszatrsi rtkeket, a kpeket pedig a gombok alatt tallhat Image vezrlben. Egy vals alkalmazs sorn ez a megkzelts nem lenne mkdkpes, mivel a MessageBox megjelentse, azaz a Completed esemnykezel kzvetlenl az Application_Activated utn fut le, mgis kpes megfogni programunk aktivldst. Ez azt jelenti, hogy amg nem zrtuk be a MessageBoxot az OK gombbal, addig a rendszer gy rzkeli, hogy az llapotvlts esemnykezelje fut. Ennek az a kvetkezmnye, hogy ha tl sokig hagyjuk fent a prbeszdablakot, akkor a rendszer az alkalmazs esemnyeinek 10 msodperces idkorltja miatt lelltja programunk futst. Az llapottmenetek mkdsvel az 5. fejezet foglalkozik rszletesen.

SavePhoneNumberTask
Az els megvizsglt chooser esetben nem valamilyen szolgltatott adatra, hanem a mvelet eredmnyessgre vagyunk kvncsiak. Ennek megfelelen a taszk felparamterezse utn definilnunk kell egy esemnykezel fggvnyt, amely akkor fut le, amikor a taszk futsa mr befejezdtt, s jra a mi alkalmazsunk kerl eltrbe. A SavePhoneNumberTask a Contacts alkalmazst indtja el, amelyben lehetsget biztost arra, hogy valamely ismersnk adatait egy j telefonszmmal egsztsk ki. A visszatrsi rtk TaskResult mezje a TaskResult felsorols egyik lehetsges rtkvel jelzi a futs kimenetelt, amit neknk kell a felhasznl fel tovbbtanunk egy zenetdoboz megjelentsvel:
private void btnSavePhone_Click(object sender, RoutedEventArgs e) { SavePhoneNumberTask spn = new SavePhoneNumberTask(); spn.PhoneNumber = "0000/1234567"; spn.Completed += (s, result) => { switch (result.TaskResult) { case TaskResult.OK: MessageBox.Show("Telefonszm elmentve!"); break; case TaskResult.Cancel: MessageBox.Show("Ments megszaktva!"); break; case TaskResult.None: MessageBox.Show("A telefonszm mentse nem sikerlt!"); break; } }; spn.Show(); }

A Completed esemnykezeljt megadhatjuk kln eljrsknt is, de mivel egyszer, rvid kdrl van sz, amit egszen biztos, hogy nem fogunk mshol hasznlni, rdemes lambda kifejezssel megadott anonim metdust alkalmazni.

147

6. Alapvet telefonos funkcik hasznlata A Contacts alkalmazs indulsakor nhny elre definilt partner kzl vlaszthatunk, amelyek a tesztelsek megknnytsre kerltek be az emultorba. Ha itt kivlasztunk egy partnert, akkor a telefonszm mentsre lehetsget biztost oldal kvetkezik. A mdostsok mentse utn a kapcsolat adatait rszletez oldalra kerlnk, ahonnan a Back gomb megnyomsval trhetnk vissza a taszkot indt alkalmazsba. Ekkor fut le az ltalunk definilt esemnykezel, ami megvizsglja s az ltalunk definilt eljrs alapjn jelzi a visszatrsi rtket. A folyamat a 6-10 brn tekinthet meg.

6-10 bra: Egy telefonszm mentsnek lpsei s a visszatrsi rtk megjelentse

PhoneNumberChooserTask
A PhoneNumberChooserTask szintn a Contacts alkalmazst nyitja meg, viszont ez a taszk mr adatot is szolgltat a hv alkalmazs szmra. A Completed esemnykezel msodik paramtere egy PhoneNumberResult pldny, amin keresztl elrhetjk a kivlasztott partner nevt s telefonszmt (611 bra):
private void btnPhoneNumberChooserTask_Click(object sender, RoutedEventArgs e) { PhoneNumberChooserTask phoneNumberChooser = new PhoneNumberChooserTask(); phoneNumberChooser.Completed += (s, result) => { if (result.Error == null && result.TaskResult == TaskResult.OK) { string name = result.DisplayName; string number = result.PhoneNumber; MessageBox.Show(string.Format("Nv: {0}\nTelefonszm:{1}", name, number)); } }; phoneNumberChooser.Show(); }

6-11 bra: A kivlasztott partner neve s telefonszma

148

Chooserek

CameraCaptureTask
A kamera hasznlatnak legegyszerbb mdja egy CameraCaptureTask indtsa. A Mango frisstssel megjelent a PhotoCamera osztly is az eszkzkszletben, errl a fejezet kvetkez rszben lesz sz.
private void btnCameraCaptureTask_Click(object sender, RoutedEventArgs e) { CameraCaptureTask cameraTask = new CameraCaptureTask(); cameraTask.Completed += (s, result) => { if (result.TaskResult == TaskResult.OK) { // System.Windows.Media.Imaging.BitmapImage BitmapImage bmp = new BitmapImage(); bmp.SetSource(result.ChosenPhoto); imgResult.Source = bmp; } }; cameraTask.Show(); }

Az emultor szerencsre egy kamera mkdst is szimullni tudja, ha nem is naplements tjkpekkel, de a clra tkletesen megfelel mozg fekete kockval szembeslhetnk a taszk indtsakor. A feladat egy Streammel tr vissza, amit nem lehet kzvetlenl kpforrsknt hasznlni, ezrt be kell vezetnnk egy BitmapImage vltozt is. Ez a SetSource metdusval mr fel tudja dolgozni a streamet, gy a kapott kpet meg tudjuk jelenteni (6-12 bra).

6-12 bra: Kp ksztse CameraCaptureTask hasznlatval

PhotoChooserTask
A PhotoChooserTask egy kp kivlasztst teszi lehetv a telefon mdiatrbl. Az osztly rendelkezik egy ShowCamera tulajdonsggal, amit ha engedlyeznk, akkor kikerl a klnbz kptrak listja al egy CameraCaptureTaskot indt gomb is. Meghatrozhatjuk az ltalunk elvrt kp dimenziit is a PixelHeight s PixelWitdh tulajdonsgok rtknek belltsval. Ha ezeket resen hagyjuk, akkor a teljes kivlasztott kpet visszakapjuk, abban az esetben viszont, ha a dimenzik rgztse mellett dntnk, akkor lehetsgnk lesz a kpen kijellni a kvnt terletet.

149

6. Alapvet telefonos funkcik hasznlata

private void btnPhotoChooserTask_Click(object sender, RoutedEventArgs e) { PhotoChooserTask photoChooserTask = new PhotoChooserTask(); // lehetsget adhatunk a kamera taszk indtsra is egy gomb engedlyezsvel photoChooserTask.ShowCamera = true; // dimenzik belltsa photoChooserTask.PixelHeight = 50; photoChooserTask.PixelWidth = 200; photoChooserTask.Completed += (s, result) => { if (result.TaskResult == TaskResult.OK && result.OriginalFileName != null) { MessageBox.Show(result.OriginalFileName); BitmapImage bmp = new BitmapImage(); bmp.SetSource(result.ChosenPhoto); imgResult.Source = bmp; } }; photoChooserTask.Show(); }

A pldakdban egy 50 pixel magas s 200 pixel szles kpet szeretnnk beolvasni, gy a taszk lehetsget knl egy ekkora terlet kijellsre, s csupn az ezen bell tallhat kprszt adja majd vissza alkalmazsunk szmra (6-13 bra).

6-13 bra: Meghatrozott mret kp kivlasztsa s megjelentse

Adatok megosztsa alkalmazsok kztt


A taszkok rendszere mellett a Mango frisstssel bekerlt egy j lehetsg az alkalmazsok kzti adatmegosztsra. Az j fejleszti kszletben megjelent ugyanis a PhoneDataSharingContext osztly, ami egy kijellt trterleten kpes lekrdezseket futtatni, a tallatokat pedig generikus listn szolgltatja a hv alkalmazsnak. Jelenleg kt implementcija, a Contacts s az Appointments osztly rhet el. Ezek bemutatsra vegynk fel egy j lapot a korbban hasznlt pivotra datasharing nvvel! Az j lapon definiljunk egy-egy gombot, valamint egy j kpet a kt feladathoz:
<controls:PivotItem Header="datasharing"> <ScrollViewer> <StackPanel> <Button Content="Contacts" Name="btnContacts" Click="btnContacts_Click" /> <Button Content="Appointments" Name="btnAppointments" Click="btnAppointments_Click" /> <Image Name="imgDataSharing" Width="400" Height="400" />

150

Adatok megosztsa alkalmazsok kztt

</StackPanel> </ScrollViewer> </controls:PivotItem>

Contacts
A Contacts osztly a telefonon trolt sszes kapcsolatunkhoz hozzfrst biztost alkalmazsunk szmra. Segtsgvel nv, e-mail cm, telefonszm vagy minden mez alapjn kereshetnk, a tallatoknak pedig minden informcijhoz hozzfrhetnk. A partnerlista egyik nagyszer tulajdonsga az, hogy a klnbz helyekrl szrmaz adatokat sszefsli, s egy kzs trban teszi hozzfrhetv. Ez azt jelenti, hogy aki a SIM krtynkra mentett ismersnk, de szerepel pldul a facebookos vagy hotmailes ismerseink listjn is, annak sszes adatt egyetlen helyrl, transzparens mdon rhetjk el. Teht annak ellenre, hogy tbb informciforrsunk is van, ezek unijaknt egy felhasznlt ltunk a partnerlistnkon (nmely esetben a felhasznlk sszekapcsolst neknk kell elvgeznnk, hiszen a nv nem egyedi azonost egy szemly esetben). Ennek termszetes velejrja az, hogy egy felhasznl tartalmazhat tbb telefonszmot, e-mail cmet, de akr olyan ellentmondsos helyzetek is kialakulhatnak, amikor egy partnernk tbb szlinappal, prkapcsolattal (ennek megtlse nyilvn felhasznlfgg) rendelkezik. A Contacts nem tl meglep mdon a Contact osztly pldnyainak listjt szolgltatja. Az ezen keresztl elrhet tulajdonsgok az albbi tblzatban tallhatk: Tulajdonsg
Accounts Addresses Birthdays Children Companies CompleteName DisplayName EmailAddresses IsPinnedToStart Notes PhoneNumbers SignificantOthers Websites GetPicture()

Lers Azon forrsok listja, amelyeken partnernk a felhasznl (pl. Live, facebook, stb.) Cmek listja Partnernk sszes szlinapjnak listja Ismers gyermekei Munkahelyek listja A partner teljes neve. Tpusosan elrhet a nv sszes rsze (Nickname, FirstName, MiddleName, LastName). Megjelentett nv E-mail cmek listja Boolean rtk, megmutatja, hogy kitztk-e a felhasznl hivatkozst a kezdlapra. A partnerhez rgztett jegyzeteink listja A partner telefonszmai. Tartalmazzk a szmot s a telefonszm tpust is (otthoni, cges, mobil, stb.) A partner prkapcsolatai Weblapok listja Ugyan nem tulajdonsg, hanem metdus, de fontos megjegyezni, hogy a felhasznl kpnek lekrsre is van lehetsgnk.

Az emultoron szerepl kapcsolatlista j kiindulsi alap a tesztelshez, de a biztonsg kedvrt egsztsk ki pldul Chris Sells adatait azokkal az informcikkal, amiket le szeretnnk krdezni! A mdostsokhoz hasznlhatjuk akr a SavePhoneNumberTaskot is, mivel a telefonszm mdostst kveten a Contacts alkalmazsban maradunk addig, amg a Back gombbal vissza nem naviglunk az alkalmazsunkba. Itt vlasszunk egy profilkpet, s tltsk ki a JobTitle, Birthday, SignificantOther s OfficeLocation tulajdonsgokat!

151

6. Alapvet telefonos funkcik hasznlata A mdostsokat kveten rjuk meg a Contacts gomb klikk esemnykezeljt!
private void btnContacts_Click(object sender, RoutedEventArgs e) { Contacts contacts = new Contacts(); contacts.SearchCompleted += (s, result) => { var contact = result.Results.First(); // felhasznl kpnek lekrse BitmapImage bmp = new BitmapImage(); bmp.SetSource(contact.GetPicture()); imgDataSharing.Source = bmp; // egyb adatok string name = contact.CompleteName.FirstName; string company = contact.Companies.First().CompanyName; string title = contact.Companies.First().JobTitle; string birthday = contact.Birthdays.First().ToShortDateString(); string significantOther = contact.SignificantOthers.First(); string note = contact.Notes.First(); // megjelents string formatStr = "Name: {0}\nCompany: {1}\nTitle: {2}\n" + "Birthday: {3}\nSignificantOther: {4}\nNote: {5}"; MessageBox.Show(string.Format(formatStr, name, company, title, birthday, significantOther, note)); }; // csak a nevek kztt keresnk contacts.SearchAsync("c", FilterKind.DisplayName, null); }

A fenti kdban minden listnak csak az els elemt krdeztk le, de termszetesen a keress ettl fggetlenl felhasznlk listjt adja vissza, ahol a tulajdonsgok tbbsge szintn egy IEnumerable pldny. A fggvny futsnak eredmnye a 6-14 brn lthat.

6-14 bra: Partner adatainak lekrdezse PhoneDataSharingContext hasznlatval

Appointments
A naptrbejegyzsek lekrdezse a kapcsolatok kezelshez hasonlt, viszont mivel ezek az adatok mindenkppen felhasznli fikhoz ktdnek (Live, Hotmail, Facebook, stb.), sajnos az emultoron mindig egy res listt fogunk visszakapni. A bejegyzst megtestest Appointment osztly fbb tulajdonsgai a kvetkez tblzatban lthatk:

152

Kamera hasznlata taszk nlkl

Tulajdonsg
Account Attendees Details StartTime EndTime IsAllDayEvent IsPrivate Location Organizer Status Subject

Lers A naptrbejegyzst trol felhasznli fik Rsztvev felhasznlk (Attendee lista) A bejegyzs szveges lersa Kezds ideje Befejezs ideje Boolean, egsz napos esemnyrl van-e sz? Mindenki ltal lthat vagy privt esemny? A tallkoz helye (szvegknt) A szervez szemly (Attendee pldny) Rszvteli llapotunk A bejegyzs trgya rviden

Alkalmazsa teht nagyon hasonlt a partneradatok lekrdezshez. A SearchAsync() hvsa j szlon elindtja a keresst, a visszatrsi rtket pedig a SearchCompleted esemnykezelben hasznlhatjuk fel:
private void btnAppointments_Click(object sender, RoutedEventArgs e) { Appointments apps = new Appointments(); apps.SearchCompleted += (s, result) => { var events = result.Results; if (events != null && events.Count() > 0) { var myEvent = events.OrderBy(c => c.StartTime).First(); string formatStr = @"A kvetkez esemny {0} napon kezddik, trgya: {1}, rsztvevi pedig:\n{2}"; StringBuilder builder = new StringBuilder(); foreach (var item in myEvent.Attendees) { builder.AppendFormat("{0}\n", item.DisplayName); } MessageBox.Show(string.Format(formatStr, myEvent.StartTime.ToShortDateString(), myEvent.Subject, builder.ToString())); } }; apps.SearchAsync(DateTime.Now, DateTime.Now.AddMonths(6), null); }

Kamera hasznlata taszk nlkl


A CameraCaptureTask hasznlatn tl lehetsgnk van kzvetlenebb mdon is kommuniklnunk a kszlk kamerival. Az opercis rendszer Mango verzija ugyanis elrhetv teszi szmunkra a fnykpek ksztst lehetv tev PhotoCamera s a videorgztst megknnyt VideoCaptureDevice osztlyokat. Ezek mkdse nagyrszt hasonlt egymshoz, a klnbsg fknt az adatok trolsakor mutatkozik meg. Mindkt esetben az Isolated Storage-be vagy a Media Library-ba menthetnk, de vide rgztsekor a folyamatos adatfolyam miatt a FileSink segdosztlyt is hasznlnunk kell. A kvetkez plda sorn vals idej kpet fogunk mutatni a kamera kprl, s lehetsget adunk fnykp ksztsre akr a f, htlapon lv kamert, akr az ellapon lvt hasznlva.

153

6. Alapvet telefonos funkcik hasznlata Mindenekeltt a WMAppManifest.xml llomnyban jelezzk, hogy alkalmazsunk fogja hasznlni a kszlk kamerit. Ehhez egsztsk ki a Capabilities szekcit a kt kamera azonostjval (a htlapon lv kamera bejegyzse valsznleg mr a generlt llomnyban is megtallhat):
<Capabilities> <Capability Name="ID_HW_FRONTCAMERA"/> <Capability Name="ID_CAP_ISV_CAMERA"/> ... </Capabilities>

Vegynk fel egy Windows Phone Landscape Page -et projektnkbe Camera nvvel (6-15 bra)! Ez a sablon egy olyan oldalt generl, amely csak Landscape mdban jelenik meg, de termszetesen ez kt tulajdonsg mdostsval felldefinilhat.

6-15 bra: Windows Phone Landscape Page sablon Mivel az oldalt a tovbbiakban fektetett mdban fogjuk hasznlni, rdemes az emultort is ehhez igaztani. Ehhez az emultor jobb oldali menjben talljuk a jobbra s balra forgat gombokat (6-16 bra).

6-16 bra: Emultor forgatsa Adjunk hozz egy gombot az eddig szerkesztett MainPage oldalhoz, ami az j Camera.xaml oldalunkra fog naviglni!
<Button Content="Camera" Name="btnCamera" Click="btnCamera_Click" /> // kdfjl: private void btnCamera_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/Camera.xaml", UriKind.Relative)); }

Mieltt nekillnnk a kdfjlban ltrehozni minden objektumot s a funkcionalitst implementlni, gondoljuk vgig, hogy mire lesz szksgnk! Mivel kt kamera kpt egyszerre nem tudjuk kezelni, lehetv kell tennnk a felhasznl szmra, hogy vltani tudjon azok kztt. Erre tkletesen megfelel egy Slider, ami kt rtket vehet fel. Azrt is szerencss ez a vlaszts, mert az opercis rendszer legtbb belltsnl is gy vannak megvalstva a kapcsolk, s az sohasem baj, ha a platformmal konzisztensek maradunk. A kapcsol llstl fgg a kirajzolt kp s az adatments forrsa. Egy gombbal pedig

154

Kamera hasznlata taszk nlkl lehetsget kell adnunk a fnykp ksztsre is, viszont a feldolgozs idejre ezt inaktvv is kell tennnk. Ltszik, hogy itt az elz taszkindtsoknl bonyolultabb dolgunk lesz, pldul adatktseket is meg kell valstanunk. Ennek rdekben a feladatot a fejezet elejn lert modell szerint egsztsk ki, azaz hozzunk ltre egy ViewModelt az oldal szmra! A ViewModels mapphoz adjunk hozz egy j osztlyt CameraViewModel nvvel, ez pedig valstsa meg az INotifyPropertyChanged interfszt:
public class CameraViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (null != handler) { handler(this, new PropertyChangedEventArgs(propertyName)); } } }

Ez az osztly troljon minden tulajdonsgot s logikt, amit a Camera.xaml-nek a megjelents sorn alkalmaznia kell! Vegyk is fel ezeket az albbiak szerint:
public PhotoCamera Camera { get; set; } private VideoBrush cameraBrush; /// <summary> /// Az l kpet megjelent VideoBrush /// </summary> public VideoBrush CameraBrush { get { return cameraBrush; } set { cameraBrush = value; NotifyPropertyChanged("CameraBrush"); } } private bool isCameraChooserEnabled; /// <summary> /// True, ha mindkt kamera elrhet, azaz a vlaszt /// slide-nak aktvnak kell lennie /// </summary> public bool IsCameraChooserEnabled { get { return isCameraChooserEnabled; } set { isCameraChooserEnabled = value; Deployment.Current.Dispatcher.BeginInvoke(() => { NotifyPropertyChanged("IsCameraChooserEnabled"); }); } } private bool isFrontCamera; /// <summary> /// True, ha az ellapi kamera aktv, egybknt false /// </summary> public bool IsFrontCamera {

155

6. Alapvet telefonos funkcik hasznlata

get { return isFrontCamera; } set { isCameraChooserEnabled = value; Deployment.Current.Dispatcher.BeginInvoke(() => { NotifyPropertyChanged("IsFrontCamera"); }); } } private bool isPhotoEnabled; /// <summary> /// True, ha kszen llunk fnykp ksztsre, /// azaz a fot gomb aktv /// </summary> public bool IsPhotoEnabled { get { return isPhotoEnabled; } set { isPhotoEnabled = value; Deployment.Current.Dispatcher.BeginInvoke(() => { NotifyPropertyChanged("IsPhotoEnabled"); }); } } /// <summary> /// Fnykp ksztse /// </summary> public void TakePhoto() { // nem kszthetnk j kpet, amg ezt nem dolgoztuk fel IsPhotoEnabled = false; Camera.CaptureImage(); }

A kdban kiemelem azokat a tulajdonsgokat, amelyeket ktnnk kell egy vezrlhz a megjelent oldalon. Ezeknl a set metdust gy kell mdostani, hogy az rtkadst kveten egy NotifyPropertyChanged hvssal jelezzk a mgttes rtk vltozst. Emiatt nem lehet a rvidtett public string PropertyName { get; set; } formtumot hasznlni, a teljes kifejtsre van szksg. Szerencsre ez a prop + TAB + TAB bersval legenerlhat, s gy a gpels nagy rszt megszhatjuk. Mivel a kamerval kapcsolatos feladatok nem az UI szlon futnak, szksgnk lesz a Dispatcher hasznlatra, hogy a vltozsokat a felhasznli felleten is megjelenthessk. Kezdjk el leprogramozni a vezrl logikjt! A kt kamert egyszerre nem tudjuk kezelni, gy valahol meg kell oldanunk a kivlasztott eszkz esemnyeinek figyelst, mg a msik kamert ki kell kapcsolnunk. Magtl rtetd vlaszts erre az IsFrontCamera tulajdonsg set metdusa, mivel a kamera kivlasztsakor kzvetlenl ez az eljrs fog futni. Itt szabaduljunk meg egy Dispose hvssal a korbbi kamertl, majd pldnyostsunk egy megfelel tpus PhotoCamera-t (Primary, FrontFacing)! Definiljuk az j objektum CaptureImageAvailable esemnykezeljt, ami a kp elkszltekor fog lefutni. Emellett gondoskodjunk az IsCameraChooserEnabled tulajdonsg kezelsrl is, mivel az objektum inicializlsa viszonylag sok idt vesz ignybe, s ha mg ekzben kamert vltunk, akkor a Dispose() hvs a flksz objektumon hibt fog eredmnyezni.
public bool IsFrontCamera { get { return isFrontCamera; } set

156

Kamera hasznlata taszk nlkl

{ isFrontCamera = value; // elzleg belltott kamera trlse, ha volt if (Camera != null) { Camera.Dispose(); } if (isFrontCamera) {// ellapi kamera Camera = new PhotoCamera(CameraType.FrontFacing); } else {// htlapi kamera Camera = new PhotoCamera(CameraType.Primary); } // Init lezrsa eltt ne lehessen kamert vltani (Dispose) IsCameraChooserEnabled = false; Camera.Initialized += (s, e) => { if (PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing) && PhotoCamera.IsCameraTypeSupported(CameraType.Primary)) { // kameravlts jbli engedlyezse IsCameraChooserEnabled = true; } }; Camera.CaptureImageAvailable += (s, e) => { string name = DateTime.Now.ToShortTimeString() + ".jpg"; // TODO: ments megrsa // jra fotzhatunk IsPhotoEnabled = true; Deployment.Current.Dispatcher.BeginInvoke(() => { // visszajelzs kldse (UI szl) MessageBox.Show(name + " mentve!"); }); }; NotifyPropertyChanged("IsFrontCamera"); } }

A kp mr elkszl, azt viszont mg csak a telefon pozcijbl tudjuk kikvetkeztetni, hogy mit fotztunk. Ennek kikszblsre csak annyi a teendnk, hogy a korbban deklarlt ecsetet sszektjk a kamerval, mg ugyanebben a set metdusban, pldul a NotifyPropertyChanged("IsFrontCamera"); hvsa eltt:
// ... // VideoBrush belltsa a kivlasztott kamerra cameraBrush.SetSource(Camera); NotifyPropertyChanged("IsFrontCamera"); }

A tulajdonsgok halmaza s a logika mr ksz, mr csak inicializlni kell az rtkeket. Vegynk fel erre egy j fggvnyt, LoadData nvvel:

157

6. Alapvet telefonos funkcik hasznlata

public void LoadData() { CameraBrush = new VideoBrush(); IsPhotoEnabled = true; if (PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing) && PhotoCamera.IsCameraTypeSupported(CameraType.Primary)) { // mindkt kamera elrhet --> vlaszthassunk IsCameraChooserEnabled = true; IsFrontCamera = true; } else { // csak az egyik kamera rhet el (vagy egyik sem) IsCameraChooserEnabled = false; if (PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing)) { IsFrontCamera = true; } else if (PhotoCamera.IsCameraTypeSupported(CameraType.Primary)) { IsFrontCamera = false; } else { MessageBox.Show("Nincs elrhet kamera!"); } } }

Ennek az eljrsnak az a feladata, hogy kidertse, hozzfrnk-e egyltaln a kamerkhoz, s ennek megfelelen inicializlja a tulajdonsgokat. Nem lenne szp megolds, ha ezt a ViewModelt egy Camera objektum pldnyostan, ehelyett vegynk fel egy statikus tulajdonsgot az App osztlyban, amin keresztl a View elri a hozz tartoz ViewModelt:
private static CameraViewModel cameraVM; public static CameraViewModel CameraVM { get { if (cameraVM == null) { cameraVM = new CameraViewModel(); } return cameraVM; } }

A Camera.xaml kdfjljban pedig mdostsuk gy a konstruktort, hogy az krje el az App osztlytl a statikus ViewModelt, majd ezt lltsa be DataContextnek! Amint az oldal betltdtt, inicializljuk az rtkeket a LoadData meghvsval:
CameraViewModel ViewModel; public Camera() { InitializeComponent(); ViewModel = App.CameraVM; DataContext = ViewModel;

158

Kamera hasznlata taszk nlkl

this.Loaded += (s, e) => { ViewModel.LoadData(); }; }

Ezzel be is fejeztk a logika megrst s a ViewModel behuzalozst, mr csupn a megjelent felletet kell ltrehoznunk. A fektetett megjelents miatt a bal oldalra kerlhet az lkpet mutat Canvas, jobbra mell pedig a vezrl gombok:
<Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.ColumnDefinitions> <ColumnDefinition Width="600" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <!--ContentPanel - place additional content here--> <Canvas Name="ContentCanvas" Width="600" Height="440" Background="{Binding CameraBrush}"> </Canvas> <StackPanel Grid.Column="1"> <Button Name="btnPhoto" Content="Kp" Click="btnPhoto_Click" IsEnabled="{Binding IsPhotoEnabled}"/> <Slider Value="{Binding IsFrontCamera, Mode=TwoWay}" IsEnabled="{Binding IsCameraChooserEnabled}" Minimum="0" Maximum="1"/> </StackPanel> </Grid>

A CameraBrush httrnek val bektsvel festjk fel a pillanatnyi kpet a Canvas felletre, a gombhoz pedig bektjk az IsPhotoEnabled tulajdonsgot, gy az csak akkor lesz aktv, amikor nincs folyamatban lv kpfeldolgozs. A Slider lesz az a vezrl, amellyel a kamerk kztt vlthatunk, amennyiben az IsCameraChooserEnabled tulajdonsg true rtket tartalmaz. Fontos, hogy az adatkts ktirny legyen, gy a vezrl rtknek mdostsval a mgttes tulajdonsg rtke is vltozik! Egyetlen feladatunk maradt htra, a kpksztst indt gomb esemnykezeljnek megrsa. Mivel a ViewModel megvalstja a mveletet, itt csupn egy fggvnyhvsra van szksgnk:
private void btnPhoto_Click(object sender, RoutedEventArgs e) { ViewModel.TakePhoto(); }

Ha sehol nem hibztunk, akkor a projekt teleptse utn a 6-17 brn lthat elrendezst fogjuk ltni. A kivlasztott kamert az alapjn tudjuk azonostani, hogy a mozgkpet jelkpez fekete tglalap melyik irnyban mozog. Az ellapon lv kamera kivlasztsa esetn ez a mozgs az ramutat jrsval ellenttes lesz, a htlapon lv f kamera esetben pedig azzal megegyez.

159

6. Alapvet telefonos funkcik hasznlata

6-17 bra: A kamerk kpt mutat alkalmazs fellete A slider rtknek megvltoztatst kveten a tglalap irnyt vlt, amibl tudhatjuk, hogy a kamera vltsa megtrtnt. Kp ksztsekor a gomb egy idre inaktvv vlik, majd a feldolgozs vgn egy zenetablakban kapunk rtestst a feladat befejezdsrl (6-18 bra).

6-18 bra: rtests a feldolgozs befejezdsrl Mr csak annyi maradt htra, hogy a kapott kppel kezdjnk is valamit, pldul troljuk el a kszlk mdiatrban. Ehhez egy MediaLibrary pldnyra lesz szksgnk, amelyen keresztl hozzfrhetnk a telefonon trolt zenkhez s kpekhez. Az osztly a Microsoft.Xna.Framework szerelvny rsze, ezrt hivatkozzunk erre a dll-re projektnkben! A trols szintn a ViewModel dolga, gy a MediaLibrary tpus library objektumot a CameraViewModel osztlyban deklarljuk:
// Microsoft.Xna.Frameword dll! MediaLibrary library = new MediaLibrary();

A ments akkor trtnjen, amikor a kp mr elkszlt, de a felhasznl szmra mg nem kldtk el az rtestst errl! gy hibakezelsre is lehetsgnk van de ettl most eltekintnk. A ments helye a CaptureImageAvailable esemnykezel, ahol korbban mr egy // TODO: ments megrsa sort hagytunk, ezt cserljk most ki az albbiaknak megfelelen:

160

sszefoglals

Camera.CaptureImageAvailable += (s, e) => { string name = DateTime.Now.ToShortTimeString() + ".jpg"; // ments a mdiatrba library.SavePictureToCameraRoll(name, e.ImageStream); // jra fotzhatunk IsPhotoEnabled = true; Deployment.Current.Dispatcher.BeginInvoke(() => { // visszajelzs kldse (UI szl) MessageBox.Show(name + " mentve!"); }); };

A funkci mkdst a fejezet korbbi rszeiben bemutatott PhotoChooserTask segtsgvel ellenrizhetjk. Az n emultoromon pldul a 6-19 bra mvszeti remekmvei kszltek.

6-19 bra: A kamerk ltal ksztett kpek Az emultor ezeknl a kpeknl is klnbsget tesz a kt eszkz kztt, az ellapon lv kamera kpt ugyanis egy bal oldalra mutat srga ptty, mg a htlapon lvt egy felfel mutat jelkpezi.

sszefoglals
A fejezet sorn rengeteg olyan lehetsggel ismerkedtnk meg, amelyek egyszer hozzfrst biztostanak a telefon valamely funkcijhoz. Vgigvettk az erre knlt taszkokat, megklnbztetve a visszatrsi rtket is szolgltat choosereket s a csupn feladatindtst knl launchereket. Ezt kveten megnztk a partner- s naptrbejegyzsi adatok elrsre megoldst knl egyb lehetsgeket is a PhoneDataSharingContext hasznlatval. A fejezet vgn pedig egy pldaalkalmazs rsn keresztl lthattuk, hogy hogyan tudunk a taszkoknl kzvetlenebb mdon hozzfrni a kamerkhoz s azok kpt a mdiatrban rgzteni.

161

7. Tovbbi telefonos funkcik hasznlata


Eddig jobbra a telefon szoftveres kpessgeivel jtszottunk, most azonban egy kicsit mlyebbre hatolunk. Ebben a fejezetben azt vizsgljuk, hogyan tudjuk kihasznlni a Windows Phone 7.5 opercis rendszert futtat telefonokba alapfelszereltsgknt beptett szenzorokat, vagyis rzkelket.

Az rintkperny kezelse
Elsknt azzal az rzkelvel foglalkozunk, amely ma mr elengedhetetlen rsze okostelefonjainknak, s amelyet a felhasznl lassan mr anlkl hasznl, hogy egyltaln szrevenn azt. Ez az rintkperny ktsgkvl a legfontosabb szenzor. Br ma teljesen termszetesnek szmt, hogy ott van a telefonban, nhny vvel ezeltt mg ritkn ptettk bele. A Silverlight for Windows Phone tbb szinten teszi elrhetv a fejleszt szmra az rintkperny esemnyeit. Attl fggen, hogy milyen bonyolultan szeretnnk hozzfrni, figyelhetnk az egyszer esemnyekre, mint a Tap (rints) s trsai, lemehetnk egy szinttel mlyebbre a Manipulation esemnyekhez, vagy a legmlyebb szintre, a Touch.FrameReportedig, ahol a nyers adatokkal dolgozhatunk. Minl mlyebb szinten programozunk, annl pontosabb, bonyolultabb algoritmusokat pthetnk az esemnyekre, de annl tbb munknk is lesz vele.

Alapvet rintsi esemnyek


Ezeknek az esemnynek a kezeli egy GestureEventArgs tpus paramterrel rendelkeznek, mely azonfell, hogy ismerik a RoutedEventArgs leszrmazottakra jellemz Handled, illetve OriginalSource tulajdonsgokat tulajdonkppen csak annyi hasznos informcival szolgl, hogy lekrdezhet belle az esemny bekvetkezsnek helye. Tegyk hozz: elg gyakran mg ez az informci sem rdekes. Az esemny kivltsnak helyt a GetPosition metdussal krdezhetjk le, amely egy UIElement tpus paramtert vr; ehhez a vizulis elemhez kpest adja vissza az rints pozcijt. Ebbe a kategriba hrom esemny tartozik: 7-1 tblzat: rintsi esemnyek Esemny
Tap

Lers A Tap esemny akkor kvetkezik be, amikor a felhasznl megrinti egy elem fellett tulajdonkppen ez a kattints megfelelje az rintkpernyn, azzal a klnbsggel, hogy Tap esetn nem lehet megklnbztetni bal/jobb egrgombot s egyb egrre jellemz tulajdonsgokat, s ennek az rints miatt rtelme sincsen. Szintn a UIElementbl szrmaz vezrlkn s vizulis elemeken rtelmezett a DoubleTap esemny. Akkor kvetkezik be, amikor a felhasznl rvid idn bell ktszer megrinti egy vizulis elem fellett. A harmadik rintsi esemny, amit a UIElement osztlyon definiltak, a Hold. Ez akkor kvetkezik be, amikor a felhasznl megrint egy vizulis elemet, de ujjt nem emeli fel, hanem kb. egy msodpercig rajta hagyja az elemen.

DoubleTap

Hold

Lssuk, hogyan lehet felhasznlni ezeket az esemnyeket!

163

7. Tovbbi telefonos funkcik hasznlata Ksztsnk egy Windows Phone Application sablonra pl alkalmazst, s helyezznk el benne konkrtan a ContentPanel nev Gridben egy ngyzetet!
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Rectangle x:Name="rect" Width="100" Height="100" Fill="{StaticResource PhoneAccentBrush}" /> </Grid>

A megoldand feladat annyi, hogy tapintsra a ngyzet forduljon el kzppontja krl 10 fokkal jobbra! Ehhez arra lesz szksg, hogy elhelyezznk a ngyzetben egy transzformcit, amit lltgathatunk. Forgatsra a RotateTransform a legmegfelelbb, de alkalmazhatunk CompositeTransformot, vagy ha tbb klnll transzformcira lesz szksgnk, TransformGroupot is. A transzformcit a UIElement RenderTransform tulajdonsgn keresztl tudjuk belltani. Az albbi kd szemllteti, hogy hogyan tudunk ilyen transzformcit ltrehozni XAML-ben:
<Rectangle x:Name="rect" Width="100" Height="100" Fill="{StaticResource PhoneAccentBrush}"> <Rectangle.RenderTransform> <RotateTransform Angle="0"/> </Rectangle.RenderTransform> </Rectangle>

A forgats alapesetben a vizulis elem befoglal ngyzetnek bal fels sarka krl trtnik. Ezt gy tudjuk tlltani az elem kzppontjra, hogy tlltjuk a Rectangle RenderTransformOrigin tulajdonsgt. Itt 0 s 1 kztt relatvan adhatjuk meg, hogy az egyes tengelyeken hol helyezkedjen el a kzppont.
<Rectangle x:Name="rect" Width="100" Height="100" Fill="{StaticResource PhoneAccentBrush}" RenderTransformOrigin=".5,.5"> ... </Rectangle>

Ezutn mr csak fel kell iratkozni a Tap esemnyre ezt a szoksos mdon tehetjk meg:
<Rectangle x:Name="rect" Width="100" Height="100" Fill="{StaticResource PhoneAccentBrush}" Tap="rect_Tap" RenderTransformOrigin=".5,.5"> ... </Rectangle>

A mgttes kdban pedig csak mdostanunk kell az elbb ltrehozott transzformci Angle tulajdonsgt. Ez fokokban adja meg, hogy mennyivel kell elfordulnia az elemnek a RenderTransformOriginben megadott pont krl. Termszetesen a RenderTransform tulajdonsg nem RotateTransform tpus elvgre 5-6 msik transzformci-tpust is tudnia kell fogadni , gy t kell alaktanunk, hogy az Angle-t lssuk:
private void rect_Tap(object sender, GestureEventArgs e) { ((RotateTransform)rect.RenderTransform).Angle += 10; }

Teszteljk le az alkalmazst! A ngyzet nyomkods hatsra forog (7-1 bra).

164

Az rintkperny kezelse

7-1 bra: A Tap esemny hatsa Ha egy transzformcit gyakran akarunk a mgttes kdban hasznlni, egyszerbb, ha adunk neki egy nevet az x:Name tulajdonsgon keresztl. gy megkmlhetjk magunkat a sok tpuskonverzitl. Oldjuk meg azt is, hogy a ngyzet nyomva tartsa (Hold) esetn a ngyzet nagyobbra njn, kt gyors egyms utni tapints (DoubleTap) pedig alaphelyzetbe lltsa! Iratkozzunk fel a Hold esemnyre!
<Rectangle x:Name="rect" Width="100" Height="100" Fill="{StaticResource PhoneAccentBrush}" Tap="rect_Tap" Hold="rect_Hold" RenderTransformOrigin=".5,.5"> ... </Rectangle>

Az esemnykezelben nveljk meg a ngyzet mrett!


private void rect_Hold(object sender, GestureEventArgs e) { rect.Width += 20; rect.Height += 20; }

Tesztelsnl lthat, hogy a Hold esemny hatsra a ngyzet 20-20 kppontonknt n. (Emellett persze tovbbra is mkdik a Tap, teht ha 1 mp-en bell felengedjk az ujjunkat, akkor elfordul a ngyzet.)

7-2 bra A Hold (s a Tap) esemny hatsa 165

7. Tovbbi telefonos funkcik hasznlata A DoubleTap megoldsa is az elbb lertakat kveti. Elszr is fel kell iratkozni az esemnyre:
<Rectangle x:Name="rect" Width="100" Height="100" Fill="{StaticResource PhoneAccentBrush}" Tap="rect_Tap" DoubleTap="rect_DoubleTap" Hold="rect_Hold" RenderTransformOrigin=".5,.5"> <Rectangle.RenderTransform> <RotateTransform Angle="0"/> </Rectangle.RenderTransform> </Rectangle>

Ezutn a mgttes kdban vissza kell lltani alaphelyzetbe az elzleg megvltoztatott hrom tulajdonsgot:
private void rect_DoubleTap(object sender, GestureEventArgs e) { rect.Width = 100; rect.Height = 100; ((RotateTransform)rect.RenderTransform).Angle = 0; }

Multitouch manipulcik
Az elz esemnyek egyetlen ujj rintst jelzik vissza felnk. A Windows Phone-nal felszerelt telefonokban alapkvetelmny a legalbb ngy rintsi pontot kezelni kpes kapacitv kijelz, gy elviekben semmi nem gtolja a felhasznlt abban, hogy elre megfontolt szndkkal egyszerre tbb ujjval is megrintse a kijelzt. Az esemnyek msodik szintje a tbbpontos (multitouch) rintsek kezelst is lehetv tev gynevezett Manipulation esemnyek csoportja. Itt is hrom esemnyt tallunk: 7-2 tblzat: Manipulation esemnyek Esemny
ManipulationStarted

Lers A ManipulationStarted esemny akkor kvetkezik be, amikor a felhasznl megrinti a kijelzt. Ehhez nem kell tbb ujjt hasznlnia mr egy rintstl is kivltsra kerl az esemny. Ennek egyik paramtere egy ManipulationStartedEventArgs tpus objektum. Ennek ManipulationContainer tulajdonsga megadja, hogy mely objektumhoz viszonytva trtnik a manipulci (ez maga a manipullt objektum), illetve a ManipulationOrigin tulajdonsg, ami a manipulls indtsakor a ManipulationContainer bal fels sarkhoz viszonytott pozcit adja meg teht hogy hol nyomtk meg az elemet, amit megnyomtak. Hasznos lehet mg tudni, hogy szintn a ManipulationStartedEventArgs rsze a Complete metdus. Ha ezt meghvjuk, az opercis rendszer lezrtnak tekinti a manipulcit, teht ha a felhasznl tovbbra is a kijelzn tartja ujjt, nem a ManipulationDelta, hanem a ManipulationCompleted esemny fut majd le. Ksztsk be a telefont, ha tbbrintses esemnyeket szeretnnk tesztelni az emultor nem tmogatja a tbb rintst.

166

Az rintkperny kezelse

Esemny
ManipulationDelta

Lers A manipulci idtartama alatt, vagyis amg legalbb egy ujj rinti a kijelzt, a ManipulationDelta esemnyt kaphatjuk el. Ennek ManipulationDeltaEventArgs paramtere szintn tartalmaz egy ManipulationContainer s egy ManipulationOrigin tulajdonsgot, illetve Complete metdust, amelyek a korbban ismertetettel egyez mkdsek. Ezenkvl kt taln legfontosabb tulajdonsga a CumulativeManipulation s a DeltaManipulation. Tpusuk megegyezik: ManipulationDelta, amely a tbb ujj ltal kifejtett manipulcit sszegzi. Ennek Scale tulajdonsgbl megkapjuk azt, hogy a tbb ujj arnyban mennyit tvolodott egymstl vagy kzeledett egymshoz, Translation tulajdonsgbl pedig, hogy mennyit toldott el az ujjak ltal kijellt kzppont. A klnbsg a CumulativeManipulation s a DeltaManipulation kztt, hogy elbbi a manipulci kezdete ta sszegylt eltrseket mutatja, mg utbbi csak annak vltozst, vagyis a legutbbi ManipulationDelta esemny ta trtnt elmozdulst. Emltsre mlt ezenfell a ManipulationDeltaEventArgs Velocities tulajdonsga, melybl az ujjak egymstl val tvolodsnak (ExpansionVelocity) s az eltolsnak a (LinearVelocity) sebessgt kaphatjuk meg. Amikor az utols ujj is elhagyja az rintkpernyt, a ManipulationCompleted esemnyt jelzi a rendszer. Ennek ManipulationCompletedEventArgs tpus paramtere egy TotalManipulation nev, ManipulationDelta tpus tulajdonsgon keresztl adja tudtunkra, hogy a manipulci kezdete ta mekkora eltols s tmretezs trtnt, FinalVelocities tulajdonsgval pedig azt mutatja, hogy az utols ujj felemelsekor milyen sebessg volt az tmretezs s eltols.

ManipulationCompleted

A kvetkezkben arra fogjuk felhasznlni ezt a hrom esemnyt, hogy egy Drag mveletet hajtsunk vgre, vagyis lehetv tegyk, hogy a felhasznl ujjmozdulatok segtsgvel hzzon arrbb egy objektumot a felleten. Emellett pedig a felhasznl kt ujjnak kzeltsvel vagy tvoltsval kpes lesz nvelni s cskkenteni a ngyzet mrett. A Windows Phone Application sablon alapjn ksztett alkalmazs MainPage lapjnak ContentPaneljbe ezttal egy Bordert helyezznk el, magt a ContentPanelt pedig mdostsuk Gridrl Canvas tpusra!
<Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Border Name="brd" Width="100" Height="100" BorderBrush="BlanchedAlmond" Background="{StaticResource PhoneAccentBrush}" /> </Canvas>

Az tmretezst egy ScaleTransform segtsgvel szeretnnk vgrehajtani egsztsk ki ezzel a Bordert!

167

7. Tovbbi telefonos funkcik hasznlata

<Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Border Name="brd" Width="100" Height="100" BorderBrush="BlanchedAlmond" Background="{StaticResource PhoneAccentBrush}" RenderTransformOrigin=".5,.5"> <Border.RenderTransform> <ScaleTransform x:Name="st" /> </Border.RenderTransform> </Border> </Canvas>

Iratkozzunk fel a hrom Manipulation esemnyre a Borderen!


<Border Name="brd" Width="100" Height="100" BorderBrush="BlanchedAlmond" Background="{StaticResource PhoneAccentBrush}" ManipulationStarted="brd_ManipulationStarted" ManipulationDelta="brd_ManipulationDelta" ManipulationCompleted="brd_ManipulationCompleted"> ... </Border>

A manipulci indulsakor s vgn vizulis visszajelzst akarunk adni a felhasznlnak arrl, hogy ha mozgatja ujjait, melyik objektum vltozik. Indulskor lthatv tesszk a Border kerett, a vgn pedig ismt eltntetjk. Csak egy-egy sor nem tl bonyolult C#-kdra lesz szksgnk:
private void brd_ManipulationStarted(object sender, ManipulationStartedEventArgs e) { brd.BorderThickness = new Thickness(5); } private void brd_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) { brd.BorderThickness = new Thickness(0); }

A ManipulationDelta, vagyis az ujjak elmozdulst jelz esemny kezeljnek megrsa ennl kicsit bonyolultabb. Els krben csak az elmozdtst (vagyis a Drag effekt megvalstst) nzzk meg. Az eltolst a brd nev Bordernk Canvas.Left s Canvas.Top tulajdonsgainak vltoztatsval lltjuk vagyis a Bordert az t tartalmaz Canvas bal fels sarkhoz kpest mozgatjuk. Mivel ez a tulajdonsg n. attached property (csatolt tulajdonsg, amelyet nem az az objektum definil, amelyen hasznljuk), nem kzvetlenl a Borderen talljuk, hanem a GetValue s SetValue metdusok segtsgvel krhetjk le, illetve llthatjuk be:
private void brd_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) { brd.SetValue(Canvas.LeftProperty, (double)brd.GetValue( Canvas.LeftProperty) + e.DeltaManipulation.Translation.X * st.ScaleX); brd.SetValue(Canvas.TopProperty, (double)brd.GetValue( Canvas.TopProperty) + e.DeltaManipulation.Translation.Y *st.ScaleY); }

Mivel minden egyes elmozdulskor szeretnnk az elz pozcihoz kpest elmozdtani a vizulis elemet, a DeltaManipulationt vesszk ignybe. Ennek Translation tulajdonsga egy X s egy Y rtkkel adja meg, hogy hny kpponttal kell arrbb mozgatnunk a Bordert. Hasonl mdon valsthatjuk meg a tbbujjas tmretezst. Itt a Borderbe gyazott ScaleTransform objektum ScaleX s ScaleY tulajdonsgt lltgatjuk. Mivel arnyokrl van sz (az esemny argumentuma azt adja meg, hogy a korbbi hnyszorosra ntt a mret), nem sszeadunk, hanem az elbb emltett tulajdonsgokat felszorozzuk a megfelel sklzsi komponenssel. Kln kell kezelnnk a

168

Az rintkperny kezelse nulla tmretezs esett: ki kell szrni, klnben a ngyzet eltnne, amikor az ujjak kztti tvolsg nem vltozna rzkelhet mrtkben.
private void brd_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) { brd.SetValue(Canvas.LeftProperty, (double)brd.GetValue( Canvas.LeftProperty) + e.DeltaManipulation.Translation.X * st.ScaleX); brd.SetValue(Canvas.TopProperty, (double)brd.GetValue( Canvas.TopProperty) + e.DeltaManipulation.Translation.Y *st.ScaleY); if (e.DeltaManipulation.Scale.X != 0) st.ScaleX *= e.DeltaManipulation.Scale.X; if (e.DeltaManipulation.Scale.Y != 0) st.ScaleY *= e.DeltaManipulation.Scale.Y; }

Ennyi az egsz, a program tesztelhet! Figyeljk meg, hogy az elmozdts trtnhet a Canvashoz kpest akr negatv irnyba is, vagyis ki tudjuk rngatni a Bordert a Canvasrl! Ha az tmretezs mkdst is tesztelni szeretnnk, mindenkppen szksgnk lesz egy telefonra is (7-3 bra).

7-3 bra: A ngyzet, eredeti pozcijbl elmozgatva

A nyers rintsi adatok kezelse


Ahogy lthattuk, a Manipulation esemnyek segtsgvel j nhny, magasabb szinten nem tmogatott ujjmozdulat kezelse megvalsthat. Azonban ekkor nem frnk hozz a rszletekhez, amelyek lerjk, hogy pontosan mi is trtnik az rintfelleten. Az esemnyek csak annyit kzlnek velnk, hogy a tbb ujj elmozdulsbl mit szmoltak ki. Gyakran ez elg is, akad azonban olyan szituci, amikor pontosabb, mlyebb szint adatokra van szksgnk. Ekkor siet segtsgnkre a Touch osztly.

A Touch.FrameReported esemny
A Touch osztly csupn egyetlen esemnnyel br, ez a FrameReported. Brmilyen vltozs trtnik az rintfelleten egy ujj megrinti a kpernyt, elmozdul, stb. , kapunk rla egy FrameReported esemnyt. Ennek esemnyargumentuma TouchFrameEventArgs tpus. Egyetlen tulajdonsga a TimeStamp nev integer, melynek segtsgvel az esemnyek egymstl val idben egymstl val tvolsgt mrhetjk le. Ha ki akarjuk kapcsolni, hogy a magasabb szint esemnyeket is feldobja a rendszer, a TouchFrameEventArgs osztly SuspendMousePromotionUntilTouchUp metdusnak meghvsval rhetjk ezt el. Amg minden ujj el nem engedi a kijelzt, csak FrameReported esemnyeket kapunk. A TouchFrameEventArgs kt olyan metdust biztost, amelyekkel kvethetjk az ujjak pillanatnyi llapott. A GetPrimaryTouchPoint az elsdleges rintsi pontot adja vissza amelyik legkorbban megrintette a kpernyt. A GetTouchPoints az sszes aktulis rintsi pontot visszaadja. Mindkt metdus egy UIElement paramtert vr: ehhez az elemhez kpest adja vissza a pontokat. 169

7. Tovbbi telefonos funkcik hasznlata Az elbbi metdusok visszatrsi tpusa TouchPoint, illetve TouchPointCollection. A TouchPoint tpus objektumok Action tulajdonsga megadja, hogy ppen milyen esemny trtnt az adott ponton. Ennek hrom rtke lehet: Down (rints), Move (elmozduls) s Up (felengeds). A Position tulajdonsg megadja, hogy hol trtnt az esemny, a Size pedig, hogy mekkora a lenyomott fellet. A TouchDevice tulajdonsg kicsit flrevezet nev: nem az rintst kivlt eszkzt azonostja (hiszen az mindig ugyanaz lenne), hanem az rintst kivlt ujjat. Ezzel tudjuk megklnbztetni, hogy az egyes TouchPointok mely ujjhoz tartoznak. Ennyi alapozs utn mr csak egy kis logika kell egy fak egyszersg, de tbb rintst kezel rajzprogram ltrehozshoz. Amikor a felhasznl megrinti a kpernyt, egy nagyobbacska krt jelentnk meg az ujja alatt, majd ahogy mozgatja az ujjt a kijelzn, kisebb krket. Amikor egy ujjt felengedi, az ahhoz az ujjhoz tartoz krket eltntetjk. Emellett persze az egyazon ujjhoz tartoz krk mindig ugyanazzal a sznnel jelennek meg, de minden ujj mssal. A Windows Phone Application sablonnal ltrehozott alkalmazs MainPage.xaml fjljban cserljk le a ContentPanel tpust Canvasra! A XAML-ben ezzel el is vgeztk minden dolgunkat:
<Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Canvas>

A mgttes kdban elszr is fel kell iratkoznunk a Touch osztly FrameReported esemnyre. Ezt pldul a MainPage konstruktorban tehetjk meg:
public MainPage() { InitializeComponent(); Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported); }

Ezutn hozzuk ltre az esemnykezel metdust, s krjk le benne az rintsi pontokat a ContentPanel (a Canvasunk) bal fels sarkhoz kpest!
void Touch_FrameReported(object sender, TouchFrameEventArgs e) { var pts = e.GetTouchPoints(ContentPanel); }

Ezutn menjnk vgig az rintsi pontokon! Elszr azokat kezeljk, amelyek jak, vagyis ahol ppen megrintettk a kpernyt! Ezt az Action tulajdonsg Down rtke jelzi. Rajzoljunk egy 50*50 kppont mret krt a lenyoms helyn! A sznt egy kis segdosztllyal vlasztjuk ki, amelyet kzzel runk meg. Minimlis Reflectionnel, a Colors felsorolt tpus tulajdonsgainak megszmllsval visszaadunk egy sznt az integer rtkbl, mindezt egy bvt fggvnnyel:
using System.Linq; using System.Windows.Media; namespace LowLevelTouch { /// <summary> /// Integerek sznn alaktsa. /// </summary> public static class IntColorConversion { static int colorscount = 0; static IntColorConversion() { colorscount = typeof(Colors).GetProperties().Count(); }

170

Az rintkperny kezelse

public static Color ToColor(this int id) { return (Color)typeof(Colors).GetProperties()[id + 1 % colorscount] .GetValue(null, null); } } }

Ez utn a kis kitr utn mr meg tudjuk rni a krt ltrehoz kdot. Kt aprsgra gyeljnk: troljuk el az jonnan ltrehozott kr Tag tulajdonsgban a TouchDevice.Id-t, illetve ne felejtsk el megjelenteni a krt azzal, hogy hozzadjuk a ContentPanel gyermekelemeihez!
void Touch_FrameReported(object sender, TouchFrameEventArgs e) { var pts = e.GetTouchPoints(ContentPanel); foreach (TouchPoint p in pts) { if (p.Action == TouchAction.Down) { Ellipse el = new Ellipse { Width = 50, Height = 50, Tag = p.TouchDevice.Id, Fill = new SolidColorBrush(p.TouchDevice.Id.ToColor()) }; el.SetValue(Canvas.LeftProperty, p.Position.X - 25); el.SetValue(Canvas.TopProperty, p.Position.Y - 25); ContentPanel.Children.Add(el); } } }

A Tag tulajdonsg igazi funkcival nem rendelkezik pont olyan helyzetekre kszlt, amikor szeretnnk valamilyen, a vizulis elemhez kapcsold adatot, objektumot eltrolni, hozzrendelni az elemhez. A mr korbban a kijelzn lv ujjak tovbbi tjnak kirajzolsa hasonl elven trtnik. A Move Action rtkkel rendelkez elemek pozcijra egy-egy kisebb krt rajzolunk:
void Touch_FrameReported(object sender, TouchFrameEventArgs e) { var pts = e.GetTouchPoints(ContentPanel); foreach (TouchPoint p in pts) { if (p.Action == TouchAction.Down) { Ellipse el = new Ellipse { Width = 50, Height = 50, Tag = p.TouchDevice.Id, Fill = new SolidColorBrush(p.TouchDevice.Id.ToColor()) }; el.SetValue(Canvas.LeftProperty, p.Position.X - 25); el.SetValue(Canvas.TopProperty, p.Position.Y - 25); ContentPanel.Children.Add(el); } else if (p.Action == TouchAction.Move) { Ellipse el = new Ellipse { Width = 20, Height = 20, Tag = p.TouchDevice.Id, Fill = new SolidColorBrush(p.TouchDevice.Id.ToColor()) }; el.SetValue(Canvas.LeftProperty, p.Position.X - 10); el.SetValue(Canvas.TopProperty, p.Position.Y - 10); ContentPanel.Children.Add(el); } } }

171

7. Tovbbi telefonos funkcik hasznlata Az utols lps, hogy amikor egy ujjbegy elereszti a kijelzt, trlnk minden pontot, ahol korbban megfordult. Ezrt troltuk el az Ellipse-ek Tag tulajdonsgban a TouchDevice.Id-t. Csupn annyi a dolgunk, hogy amikor egy Action az Up rtket vette fel, vgigszaladjunk a Canvasban lv Ellipseeken, s amelyiknek a Tag rtke megegyezik az aktulis Taggel, azt trljk.
void Touch_FrameReported(object sender, TouchFrameEventArgs e) { var pts = e.GetTouchPoints(ContentPanel); foreach (TouchPoint p in pts) { if (p.Action == TouchAction.Down) { Ellipse el = new Ellipse { Width = 50, Height = 50, Tag = p.TouchDevice.Id, Fill = new SolidColorBrush(p.TouchDevice.Id.ToColor()) }; el.SetValue(Canvas.LeftProperty, p.Position.X - 25); el.SetValue(Canvas.TopProperty, p.Position.Y - 25); ContentPanel.Children.Add(el); } else if (p.Action == TouchAction.Move) { Ellipse el = new Ellipse { Width = 20, Height = 20, Tag = p.TouchDevice.Id, Fill = new SolidColorBrush(p.TouchDevice.Id.ToColor()) }; el.SetValue(Canvas.LeftProperty, p.Position.X - 10); el.SetValue(Canvas.TopProperty, p.Position.Y - 10); ContentPanel.Children.Add(el); } else if (p.Action == TouchAction.Up) { var q = (from item in ContentPanel.Children where item is Ellipse && (int)((Ellipse)item).Tag == p.TouchDevice.Id select item as Ellipse).ToList(); foreach (Ellipse el in q) ContentPanel.Children.Remove(el); } } }

Az alkalmazs ksz, tesztelhet. Ha tbb sznt is szeretnnk ltni, akkor persze mindenkppen telefonon kell tesztelnnk (7-4 bra).

7-4 bra Nem Imagine Cup log 172

Helymeghatrozs Vegyk szre, hogy ha nagyon gyorsan rajzolunk, a krk elszakadhatnak egymstl! Ez azt mutatja, hogy gyorsabban hztuk vgig ujjunkat a kijelzn, mint ahogy a 60Hz frissts panel kvetni tudta volna. Kicsit bonyolultabb algoritmusokkal (legutols rintsi pontok eltrolsa, Line-ok hasznlata) ez is kikszblhet. J tudni: Ha a teljestmny is szempont, rdemes elgondolkodnunk rajta, mely esemny-rteget hasznljuk fel. A Microsoft ajnlsa ezzel s a telefon ms teljestmnyignyes alkalmazsainak helyes hasznlatval kapcsolatban az albbi linken rhet el: http://msdn.microsoft.com/enus/library/ff967560(v=VS.92).aspx#BKMK_UserInput Az rintkperny felhasznlsi mdjainak megismerse utn hatoljunk be az eszkzk belsejbe!

Helymeghatrozs
A Windows Phone-telefonok alapfelszereltsgnek rsze egy Assisted GPS, mely lehetv teszi a Fld krl kering GPS mholdak ltal a telefon pontos helynek meghatrozst. A helymeghatrozs azonban ennl jval tbbet jelent. Amikor a Windows Phone-on egy alkalmazs ignybe veszi a helymeghatrozst, a telefon csak a legvgs esetben nyl a GPS-hez. Hacsak nem kr a program nagy pontossg helymeghatrozst, az opercis rendszer elszr a cellainformcik s az esetleg elrhet, ismert wifi-pontok alapjn hatrozza meg a helyzetet. Ez, br tny, hogy nem mterre pontos, de ltalban elg cserbe pedig gyors, s keveset fogyaszt. A GPS lassabban ll be, hiszen meg kell tallnia 3-4 mholdat, illetve tbb energit fogyaszt, hiszen pldul a cellainformci keresse csupn az amgy is bekapcsolt llapotban lv mobilrendszert veszi ignybe. A helymeghatrozs hasznlata nagyon egyszer. A GeoCoordinateWatcher osztlyon keresztl nyerhetjk ki a szksges informcikat a telefonbl. A PositionChanged esemnyt akkor dobja fel egy GeoCoordinateWatcher objektum, amikor a MovementThreshold tulajdonsgban belltott, mterben mrt tvolsgra kerltnk az elz esemnyben rgztett pozcitl. Az esemny csak akkor kerl kivltsra, ha elzleg meghvtuk a GeoCoordinateWatcher Start metdust (s a Stopot mg nem). Fontos tulajdonsg mg a DesiredAccuracy. Ez adja meg, hogy mennyire pontos a helymeghatrozs, vagyis, hogy ignybe veszi-e a GPS-t a telefon. Ez a tulajdonsg csak lekrdezhet, de a GeoCoordinateWatcher konstruktorban be is llthatjuk (kt rtke: Default s High). A PositionChanged esemny msodik argumentuma GeoPositionChangedEventArgs<GeoCoordinate> tpus. Ennek egyetlen tulajdonsga Position tpus, mely egy Timestampet tartalmaz (egy DateTimeOffset, ami megmondja, mikor trtnt a mrs), valamint egy Location tulajdonsgot, mely GeoCoordinate tpus. A GeoCoordinate egy pldnybl kinyerhetjk a helymeghatrozs vzszintes s fggleges pontossgt (HorizontalAccuracy s VerticalAccuracy tulajdonsgok), valamint termszetesen a hosszsgi s szlessgi rtkeket (Longitude s Latitude tulajdonsgok). Ezenfell pedig informcit szolgltat arrl is, hogy a tengerszinthez kpest milyen magassgban van a telefon (Altitude tulajdonsg), merre tart (Course) s milyen gyorsan halad ebbe az irnyba (Speed). Hozzunk ltre egy alkalmazst a Windows Phone Application sablonnal! A MainPage ContentPanel Gridjt tltsk fel nhny elemmel az albbi mdon:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Grid.RowDefinitions> <RowDefinition Height="80" /> <RowDefinition Height="80" /> <RowDefinition Height="80" /> <RowDefinition Height="80" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition />

173

7. Tovbbi telefonos funkcik hasznlata

</Grid.ColumnDefinitions> <TextBlock Name="tbkLat" /> <TextBlock Name="tbkLong" Grid.Column="1" /> <TextBlock Name="tbkHorAccu" Grid.Row="1" /> <TextBlock Name="tbkVertAccu" Grid.Row="1" Grid.Column="1" /> <TextBlock Name="tbkTimeStamp" Grid.Row="2" /> <TextBlock Name="tbkSpeed" Grid.Row="2" Grid.Column="1" /> <Button Name="btnGetCoordinates" Content="Indts" Click="btnGetCoordinates_Click" Grid.Row="3" /> <CheckBox Name="cbHighAccuracy" Content="Nagy pontossg" Grid.Row="3" Grid.Column="1" /> </Grid>

Ahhoz, hogy a Geolocation API-t felhasznlhassuk, szksgnk lesz a System.Device dll-re, ezt adjuk hozz a projekt referenciihoz, majd ezek utn vegyk fel a System.Device.Location nvteret!
using System.Device.Location;

A MainPage-ben hozzunk ltre egy GeoCoordinateWatcher referencit! Ha a XAML-tervez nem hozta ltre automatikusan, akkor rjuk meg az egyelre res Click-kezel metdust is!
public partial class MainPage : PhoneApplicationPage { GeoCoordinateWatcher gcw = null; public MainPage() { InitializeComponent(); } private void btnGetCoordinates_Click(object sender, RoutedEventArgs e) { } }

Ezutn a gomb esemnykezeljben, ha mg null rtk a gcw referencink, hozzunk ltre egy GeoCoordinateWatcher pldnyt; a pontossgot attl fggen lltsuk be, hogy a felhasznl bekattintotta-e az erre vonatkoz jellngyzetet! rjunk fel egy metdust a PositionChanged esemnyre, s indtsuk el a figyelt! Vgl pedig lltsuk t a gomb szvegt! A null rtket tesztel elgazs else gban iratkozzunk le az esemnyrl, lltsuk le a figyelt, szabadtsuk fel azt, s rjuk vissza a gomb feliratt!
public partial class MainPage : PhoneApplicationPage { GeoCoordinateWatcher gcw = null; public MainPage() { InitializeComponent(); } private void btnGetCoordinates_Click(object sender, RoutedEventArgs e) { if (gcw == null) { gcw = new GeoCoordinateWatcher((bool)cbHighAccuracy.IsChecked ? GeoPositionAccuracy.High : GeoPositionAccuracy.Default);

174

Helymeghatrozs

gcw.PositionChanged += gcw_PositionChanged; gcw.Start(); btnGetCoordinates.Content = "Lellts"; } else { gcw.PositionChanged -= gcw_PositionChanged; gcw.Stop(); gcw.Dispose(); btnGetCoordinates.Content = "Indts"; } } void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { } }

Mr csak annyi dolgunk maradt, hogy amikor a gcw feldobja az esemnyt, megfelelen kezeljk: kirjuk a kapott adatokat a kpernyre.
void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { tbkLat.Text = e.Position.Location.Latitude.ToString(); tbkLong.Text = e.Position.Location.Longitude.ToString(); tbkHorAccu.Text = e.Position.Location.HorizontalAccuracy.ToString() + " m"; tbkVertAccu.Text = e.Position.Location.VerticalAccuracy.ToString() + " m"; tbkTimeStamp.Text = e.Position.Timestamp.DateTime.ToLongTimeString(); tbkSpeed.Text = e.Position.Location.Speed + " m/s"; }

Az alkalmazst ahogy minden rzkelket hasznl alkalmazst rdemes fizikai eszkzn tesztelni, de ha pp nincs kedvnk vagy lehetsgnk r, az emultor is megfelelhet. Az elindtott emultor mellett lthat dupla nylra (7-5 bra) kattints hatsra megjelen ablakban vlasszuk a Location flet, majd itt, a trkpre kattintgatva jelljk ki a pontokat, amit az emultornak vgig kell jrnia!

7-5 bra Az Additional Tools megnyitsa Ha megvannak a pontok, kapcsoljuk ki a fent lthat Live gombot, s kattintsunk a lejtszsra! Ha az emultorban elindtottuk a GeoCoordinateWatchert, lthatjuk, ahogy vltoznak a koordintk a szimulci kzben (7-6 bra).

175

7. Tovbbi telefonos funkcik hasznlata

7-6 bra A felvett tvonal lejtszsa Ne felejtsk el lelltani az rzkelket, amikor nincs rjuk szksg! A tkletes helyek erre az alkalmazs Deactivated s Closing esemnyei, illetve a PhoneApplicationPage-ek OnNavigatedFrom esemnye. Ez nemcsak a helymeghatroz, hanem a helyzetmeghatroz rzkelkre is vonatkozik.

Helyzetmeghatrozs
Nem a GPS az egyetlen szenzor, amit elrnk! Telefonunk helyzetnek meghatrozsa vagyis, hogy ppen hogyan tartja s mozgatja a felhasznl legalbb olyan fontos informcikkal szolglhat, mint a helye. A Windows Phone 7-nel szerelt eszkzknek tartalmazniuk kell tbbek kztt egy gyorsulsmrt (accelerometer), kzelsgi szenzort, de ezenkvl mg lehet bennk irnyt (magnetometer), illetve giroszkp. Nem mindegyik rhet el ezek kzl. Nha szoks a szenzorok kz sorolni a kamert s a mikrofont, jelen knyvben azonban mshol mutatjuk be ezek hasznlatt.

A gyorsulsmr hasznlata
A gyorsulsmr megadja, hogy milyen irnyban hat gyorsuls a telefonra; teht alapesetben ez egy a Fld kzppontja fel mutat vektor. Ahogy forgatjuk a telefont, a vektor X, Y s Z komponensei is vltoznak. A gyorsulsmrt az Accelerometer osztlyon keresztl rjk el. Ennek IsSupported nev statikus tulajdonsga megmondja, hogy elrhet-e a gyorsulsmr. Ez a tulajdonsg egybknt a tbbi rzkelosztlyon is megtallhat; rdemes ennek ellenrzsvel kezdeni a munkt. Egy Accelerometer objektum ltrehozsa utn a CurrentValueChanged esemnyen keresztl kapunk rtestst arrl, ha megvltozott az eszkz helyzete de itt is a Start s a Stop metdusok hvsa kztt trtnik csak figyels. A CurrentValueChanged esemny msodik argumentuma SensorReadingEventArgs<AccelerometerReading> tpus. Ennek SensorReading tulajdonsgban egy Timestamp nev tulajdonsgot tallunk (DateTimeOffset, hogy mennyi id telt el az elz mrs ta), illetve egy Acceleration nevt, amelyben az X, Y s Z komponenseket rjk el. A szoksos Windows Phone Application sablonra ptve egy egyszer gyessgi alkalmazst hozunk ltre. Egy kp ugrl a kpernyn, s ezt kell eltallni egy clkereszttel, melyet a gyorsulsmr segtsgvel (vagyis a telefon forgatsval) mozgatunk. Adjunk egy clt s egy clkeresztet brzol kpet a projekthez, majd a MainPage ContentPaneljt alaktsuk t Canvassz! Helyezznk el benne kt Image vezrlt, amelyek jelentsk meg a kpeket, illetve egy TextBlockot, amin majd a clba tallt lvseket szmlljuk! Ezenfell pedig iratkozzunk fel a ContentPanel Tap esemnyre:

176

Helyzetmeghatrozs

<Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" Tap="ContentPanel_Tap"> <TextBlock Name="tbkHits" Text="0" /> <Image Name="target" Source="kenny.png" /> <Image Name="crosshair" Source="crosshair-red.png" /> </Canvas>

A clpontot azonos idkznknt szeretnnk vletlenszeren elhelyezni, teht egy Timerre s egy Randomra lesz szksgnk valamint termszetesen egy Accelerometerre s egy integerre, amivel szmllunk.
public partial class MainPage : PhoneApplicationPage { Timer timer = null; Accelerometer accel = null; Random rand = new Random(); int hits = 0; public MainPage() { InitializeComponent(); } private void ContentPanel_Tap(object sender, GestureEventArgs e) { } }

Az Accelerometer a Microsoft.Devices.Sensors dll -ben tallhat. Adjuk hozz ezt a referencikhoz, majd a usingok kz rakjuk be a hasonl nev nvteret!Ezenfell mg a Microsoft.Xna.Framework nev dll-t kell felvennnk a referencik kz.
using Microsoft.Devices.Sensors;

Iratkozzunk fel az oldal Loaded esemnyre!


<phone:PhoneApplicationPage x:Class="AccelerometerHandling.MainPage" ... shell:SystemTray.IsVisible="True" Loaded="PhoneApplicationPage_Loaded">

Az esemnykezelben inicializljuk az objektumokat, s indtsuk el a gyorsulsmrt!


public partial class MainPage : PhoneApplicationPage { ... private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { if (Accelerometer.IsSupported) { accel = new Accelerometer(); timer = new Timer(TimerEvent, null, 5000, 5000); accel.CurrentValueChanged += new accel_CurrentValueChanged; accel.Start(); } else MessageBox.Show("Nincs gyorsulsmr. :("); } void accel_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) { }

177

7. Tovbbi telefonos funkcik hasznlata

private void TimerEvent(object o) { } private void ContentPanel_Tap(object sender, GestureEventArgs e) { } }

A Timer esemnynek kezeljben helyezzk t a clkpet egy vletlenszer pozcira! A Random osztly NextDouble metdusa egy 0 s 1 kztti rtket ad, ezt kell felszoroznunk a ContentPanel szlessgvel s magassgval, kivonva belle a clkp szlessgt s magassgt. Mivel az esemny nem a UI-szlon kvetkezik be, a Dispatcher objektumon keresztl tudjuk ezt megtenni. Ha kzvetlenl prbljuk, egy InvalidOperationException lesz a jutalmunk.
private void TimerEvent(object o) { Dispatcher.BeginInvoke(() => { target.SetValue(Canvas.LeftProperty, rand.NextDouble() * 430); target.SetValue(Canvas.TopProperty, rand.NextDouble() * 600); }); }

Ezutn ellenrizzk le, hogy amikor a felhasznl megtapintja a kijelzt, a kt kp fedi-e egymst, vagyis a clkereszt a clkp felett van-e! Ha igen, nveljk meg a szmll rtkt, s rjuk ki a kpernyre az aktulis rtket!
private void ContentPanel_Tap(object sender, GestureEventArgs e) { if (Math.Abs((double)target.GetValue(Canvas.LeftProperty) (double)crosshair.GetValue(Canvas.LeftProperty)) < 20 && Math.Abs((double)target.GetValue(Canvas.TopProperty) (double)crosshair.GetValue(Canvas.TopProperty)) < 20) { hits++; tbkHits.Text = hits.ToString(); } }

Mr csak a lnyeg maradt htra: kezeljk le a gyorsulsmr vltozst, mozgassuk a clkeresztet! Mivel a gyorsulsmr esemnye is httrszlon fut le, ezt a kdot is a Dispatcheren keresztl tudjuk csak gy futtatni, hogy problma nlkl hozzfrjen a UI-szlhoz. A kdban kiszmoljuk, hogy a jelenlegi X s Z tengelyen vett gyorsulssal hny kpponttal szksgeltetik arrbb tolni a clkeresztet, de mieltt mg ezt megtennnk, leellenrizzk, hogy ezzel nem csszna-e ki a clkereszt a ContentPanel valamelyik szln:
void accel_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) { Dispatcher.BeginInvoke(() => { double newLeft = (double)crosshair.GetValue(Canvas.LeftProperty) + e.SensorReading.Acceleration.X * 10; double newTop = (double)crosshair.GetValue(Canvas.TopProperty) + e.SensorReading.Acceleration.Z * 10; if (newLeft < 0) newLeft = 0; else if (newLeft > 450) newLeft = 450; if (newTop < 0) newTop = 0; else if (newTop > 700) newTop = 700; crosshair.SetValue(Canvas.LeftProperty, newLeft);

178

Helyzetmeghatrozs

crosshair.SetValue(Canvas.TopProperty, newTop); }); }

Az alkalmazs ksz, tesztelhet. Ha nem akarjuk vagy tudjuk fizikai eszkzn tesztelni, ismt az Advanced Toolsra lesz szksgnk, hogy irnytsuk a gyorsulsmrt.

7-7 bra Nem egy Korszer Hadvisels 3, de azrt lvezhet

A giroszkp hasznlata
Mg a gyorsulsmr a telefon helyzett mrte, a giroszkp segtsgvel megllapthatjuk, hogy a felhasznl hogyan mozgatja trben a telefont. Mivel a giroszkp nem tartozik a telefonok alapfelszereltsgbe, ezrt ne ptsnk r olyan programot, ami mkdshez mssal nem tudja ptolni ezt az rzkelt. A giroszkp hasznlata programozsi szinten alig tr el valamiben a gyorsulsmrtl! A giroszkpot a Gyroscope osztly egy pldnyn keresztl rjk el. A CurrentValueChanged esemnyre val feliratkozs s a Start metdus meghvsa utn egy httrszlon kapjuk az esemnyeket. A mintavtelezs a TimeBetweenUpdates tulajdonsgban megadott intervallummal trtnik. A CurrentValueChanged esemny msodik argumentuma jelen esetben SensorReadingEventArgs<GyroscopeReading> tpus. Ennek SensorReading tulajdonsga az, ami GyroscopeReading tpus, s trolja a szmunkra hasznos informcikat. Ezek kztt jelen esetben is van egy Timestamp nev, a korbbiakkal azonos funkcij DateTimeOffset. Msik tulajdonsga pedig a Vector3 tpus RotationRate. Ez a korbban mr megismert X, Y s Z nev, float tpus mezket tartalmazza, melyek az egyes tengelyeken mrt forgsi sebessget adjk meg radin per msodpercben. Pldaalkalmazsunk most is a Windows Phone Application sablonra pl, ContentPaneljben pedig elhelyeznk egy krt:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Ellipse Name="ellipse" Width="100" Height="100" Fill="{StaticResource PhoneAccentBrush}" /> </Grid>

179

7. Tovbbi telefonos funkcik hasznlata Emellett feliratkozunk az oldal betltdst jelz esemnyre:
<phone:PhoneApplicationPage x:Class="GyroHandling.MainPage" ... Loaded="PhoneApplicationPage_Loaded">

Adjuk hozz a projekthez a Microsoft.Devices.Sensors s a Microsoft.Xna.Framework referencikat, s a usingok kz tegyk be a Microsoft.Devices.Sensors nvteret!
using Microsoft.Devices.Sensors;

Adjunk hozz egy Gyroscope referencit az oldalhoz, s a Loaded esemnykezeljben ha van giroszkp hozzuk ltre, iratkozzunk fel CurrentValueChanged esemnyre, s indtsuk el!
public partial class MainPage : PhoneApplicationPage { Gyroscope gyro = null; public MainPage() { InitializeComponent(); } private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e) { if (Gyroscope.IsSupported) { gyro = new Gyroscope(); gyro.TimeBetweenUpdates = new TimeSpan(0, 0, 0, 0, 50); gyro.CurrentValueChanged += g_CurrentValueChanged; gyro.Start(); } else MessageBox.Show("Kevs a giroszkp."); } void g_CurrentValueChanged(object sender, SensorReadingEventArgs<GyroscopeReading> e) { } }

Ezutn mr csak kezelni kell az esemnyt. Amikor oldalt forgatjk a telefont, oldalirnyban nveljk meg a korbban ltrehozott kr mrett, amikor elre-htra dntik, akkor pedig fgglegesen:
void g_CurrentValueChanged(object sender, SensorReadingEventArgs<GyroscopeReading> e) { Dispatcher.BeginInvoke(() => { ellipse.Width = 100 + 350 * e.SensorReading.RotationRate.X; ellipse.Height = 100 + 600 * e.SensorReading.RotationRate.Z; }); }

Az alkalmazs ksz, mr csak egy olyan telefont kell tallni, amin tesztelni is tudjuk.

Az irnyt hasznlata
Az elzektl eltr mkds rzkel a magnetomter, lenykori nevn irnyt. Az irnythz tartoz objektum ltrehozsa s a kapcsold infrastrukturlis kd a mr megszokott. Az irnytt a Compass

180

Helyzetmeghatrozs osztly jelkpezi. Statikus IsSupported tulajdonsga megadja, hogy tmogatott-e ez a szenzor az eszkzn. Sajnos az emultor ezt sem tmogatja A pldnyosts utn itt is egy CurrentValueChanged nev esemnyre tudunk feliratkozni, illetve a Start s Stop metdusokkal elindtani, lelltani az irny figyelst. rdemes mg tudni, hogy feliratkozhatunk a Calibrate esemnyre is, mely arrl tjkoztat, hogy az opercis rendszer ppen kalibrlja az irnytt. A CurrentValueChanged esemny msodik argumentuma SensorReadingEventArgs<CompassReading> tpus. SensorReading tulajdonsgban ott van a jl ismert Timestamp tulajdonsg. Emellett pedig hrom msik, amelyekbl az irnyt kaphatjuk meg. A MagneticHeading nev lebegpontos rtk megadja, hogy fokokban mrve merre nz a telefon a mgneses szaki sarkhoz kpest. A TrueHeading ugyanezt teszi, csak a geogrfiai szaki sarkkal. Vgl a MagnetometerReading nev, Vector3 tpus tulajdonsg megadja, hogy a telefon X, Y s Z tengelyn mrve hny microtesla rzkelhet. Az utols tulajdonsg pedig a HeadingAccuracy nev double rtk, mely fokokban mrve megmondja, hogy mekkora a mrs pontatlansga. Akkor ksztsk el a Magnetomtert! A Windows Phone Application sablon ContentPaneljn jelentsnk meg egy kpet! Ennek tltszsgt szeretnnk gy belltani, hogy amikor pontosan szak pontosabban a mgneses szaki sark fel nznk, akkor jelenjen meg teljes egszben, amikor pedig elfordulunk szaktl, egyre halvnyabb (tltszbb) legyen; dl fel nzve teljesen tnjn el. Ezenkvl pedig egy TextBlockban megjelentjk a valdi szaki sarkhoz viszonytott irnyunkat. Az Image s TextBlock elemeket adjuk hozz a ContentPanelhez, illetve iratkozzunk fel az oldal Loaded esemnyre:
<phone:PhoneApplicationPage x:Class="MagnetometerHandling.MainPage" ... Loaded="PhoneApplicationPage_Loaded"> <Grid x:Name="LayoutRoot" Background="Transparent"> ... <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Image Name="img" Source="magneto.png" /> <TextBlock Name="tbkOpacity" Text="0" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="56" /> </Grid> </Grid> </phone:PhoneApplicationPage>

A szoksos mdon, a projekt referencii kz vegyk fel a Microsoft.Devices.Sensors nev dll-t, a usingok kz pedig az azonos nev nvteret!
using Microsoft.Devices.Sensors;

Adjunk hozz egy Compass mezt az oldalhoz, majd a Loaded esemnykezelben lltsuk azt be! Iratkozzunk fel a CurrentValueChanged esemnyre, s indtsuk el azt ha tmogatott az irnyt:
public partial class MainPage : PhoneApplicationPage { Compass compass = null; public MainPage() { InitializeComponent(); } private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e) { if (Compass.IsSupported)

181

7. Tovbbi telefonos funkcik hasznlata

{ compass = new Compass(); compass.CurrentValueChanged += compass_CurrentValueChanged; compass.Start(); } else MessageBox.Show("Keress olyan moht, amelynek a dli oldala fs!"); } void compass_CurrentValueChanged(object sender, SensorReadingEventArgs<CompassReading> e) { } }

A CurrentValueChanged esemny a megszokott mdon egy httrszlon trtnik, gy belsejben szintn megszokott mdon a Dispatcher s nmi matematika segtsgvel lltjuk be a kp Opacity s a TextBlock Text tulajdonsgt:
void compass_CurrentValueChanged(object sender, SensorReadingEventArgs<CompassReading> e) { Dispatcher.BeginInvoke(() => { tbkOpacity.Text = e.SensorReading.TrueHeading.ToString(); double maghead = 0; if (e.SensorReading.MagneticHeading == 0) maghead = 1; else if (e.SensorReading.MagneticHeading < 180) maghead = 1 - (e.SensorReading.MagneticHeading / 180); else maghead = (e.SensorReading.MagneticHeading - 180) / 180; img.Opacity = maghead; }); }

Ksz is a program, tesztelhet de csak telefonon, mivel az emultoron nem tmogatott az irnyt (7-8 bra).

7-8 bra: Mrjk meg a mgneses erket

182

Helyzetmeghatrozs

Az rzkelk egyttes hasznlata a Motion API segtsgvel


Az elzekben lert rzkelk hasznos informcikkal szolglnak a telefon helyzett illeten, de mindegyik csak egy-egy aspektusban tudja vizsglni azt. Ahhoz, hogy az alkalmazs szmra hasznos informcikat nyerjnk ki az rzkelktl rkez adatokbl, gyakran sok matematikzsra van szksg, illetve arra, hogy tbb rzkel adatait is sszevessk. A fejlesztk munkjt megknnytend a Microsoft a Windows Phone 7.5-ben beptett egy magasabb rteget is a helyzetrzkelk programozsi fellete (vagyis az Accelerometer, a Gyroscope s a Compass osztlyok) fl. Ez a Motion API, mely a helyzetrzkelk adatait felhasznlva knnyen kezelhet, relevns informcikat ad. Pldul nem szksges a gyorsuls komponenseibl kiszmolnunk, hogy ppen merre, mennyire fordult el a telefon, hanem a Motion API-n keresztl egyetlen tulajdonsgbl kiolvashat ez az adat. Emellett megkapjuk a nyers adatokat is, teht egyetlen objektumon keresztl elrhetnk mindent, amire szksgnk van a helyzetmeghatrozshoz. Radsul a Motion API hasznlata teljesen megegyezik a korbban ltott programozsi interfszekvel, teht ha korbban mr kezeltk a gyorsulsmrt vagy trsait, minden ismers lesz. A Motion API-t a Motion osztlyon keresztl rjk el. Ennek statikus IsSupported tulajdonsgbl tudhatjuk meg, hogy tmogatott-e a Motion API az eszkzn. A Start s a Stop metdusainak meghvsa kztt dobja fel a CurrentValueChanged esemnyt, melynek SensorReading tulajdonsga a kvetkez tulajdonsgokat tartalmazza: 7-3 tblzat: A MotionReading osztly tulajdonsgai Tulajdonsg
Attitude DeviceAcceleration DeviceRotationRate Gravity Timestamp

Tpus
AttitudeReading Vector3 Vector3 Vector3 DateTimeOffset

Szolgltatott informci Az eszkz helyzett adja meg. Az eszkz gyorsulsa ez a gravitci nlkl rtend. Az eszkz hrom tengelye krl vett forgsi egytthatk. A gravitci irnya. Az elz rzkel-esemny ta eltelt id.

Ahogy lthat, a Vector3 tpus tulajdonsgok tulajdonkppen a gyorsulsmr s a giroszkp adatait adjk vissza elbbit nmileg mdostott formban, klnvlasztva a gravitci irnyt s a tnyleges gyorsulst, ezzel is idt sprolva meg a fejlesztnek. Amennyiben nincs giroszkp a telefonban, a DeviceRotationRate egy nullvektort tartalmaz. Az igazi nvum az Attitude, melynek hrom fontos tulajdonsga a Pitch, a Roll s a Yaw. Ezek az egyes tengelyek krl vett elfordulsok, radinban mrve. A Pitch a telefon X-tengelye, a Roll az Y-tengely, a Yaw pedig a Z-tengely mentn vett elforduls. Ezek segtsgvel mindenfle tovbbi szmts nlkl megkapjuk a telefon helyzett a Fldhz kpest. Ksztsnk egy alkalmazst a Visual Studio Windows Phone Application sablonjnak segtsgvel! Iratkozzunk fel a MainPage Loaded esemnyre, illetve a ContentPanelben helyezznk el egy kpet! Ez utbbit szeretnnk a Motion API segtsgvel mozgatni, pontosabban forgatni tengelyei krl gy, ahogy a telefon forog:
<phone:PhoneApplicationPage x:Class="MotionApiHandling.MainPage" ... Loaded="PhoneApplicationPage_Loaded"> ... <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Image Name="img" Source="arrow.png" Height="550"></Image> </Grid> </Grid> </phone:PhoneApplicationPage>

183

7. Tovbbi telefonos funkcik hasznlata A telefon megdntst (amelyet a Yaw tulajdonsggal lltunk be) egy egyszer RotateTransform segtsgvel kezelhetjk. A msik kt tengelyen val elforgats ennl kicsit trkksebb, hiszen a kpet itt hromdimenzis objektumknt kellene kezelnnk. A Silverlight nem tmogatja a tnyleges hromdimenzis forgatst. Ellenben a vizulis elemek Projection tulajdonsga segtsgvel lehetsgnk van az objektumok virtulis, trbelinek tn elforgatsra. Helyezznk el egy RotateTransformot s egy PlaneProjectiont az Image-ben!
<Grid x:Name="ContentPanel" Grid.Row="1" <Image Name="img" Source="arrow.png" <Image.RenderTransform> <RotateTransform x:Name="rt" </Image.RenderTransform> <Image.Projection> <PlaneProjection x:Name="pp" </Image.Projection> </Image> </Grid> Margin="12,0,12,0"> Height="550"> />

/>

A XAML rsz ksz; adjunk hozz a projekthez egy referencit a Microsoft.Devices.Sensors s a Microsoft.Xna.Framework dll-ekre! A mgttes kdban emeljk is be a kt, ezekkel azonos nev nvteret a usingok kz!
using Microsoft.Devices.Sensors; using Microsoft.Xna.Framework;

Adjunk hozz a MainPage-hez egy Motion referencit, s a Loaded esemnykezelben, ha elrhet a Motion API, pldnyostsuk az objektumot, iratkozzunk fel CurrentValueChanged esemnyre, s indtsuk el a figyelst!
public partial class MainPage : PhoneApplicationPage { Motion m = null; public MainPage() { InitializeComponent(); } private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { if (Motion.IsSupported) { m = new Motion() { TimeBetweenUpdates = new TimeSpan(0, 0, 0, 0, 50) }; m.CurrentValueChanged += m_CurrentValueChanged; m.Start(); } else MessageBox.Show("Motion API not supported. :'("); } void m_CurrentValueChanged(object sender, SensorReadingEventArgs<MotionReading> e) { } }

A CurrentValueChanged esemny kezelmetdusban pedig a megszokott mdon, a Dispatcher segtsgvel a PlaneProjection s a RotateTransform megfelel rtkeit adjuk meg. A felhasznl fel nz Z-tengelyen vett elforgatst a Yaw adja meg, ezt a RotateTransformmal lltjuk be. A vzszintes, X-tengelyen vett elforgats a Pitch, az Y-tengelyen vett elforgats pedig a Roll. Ezeket rendre a PlaneProjection RotationX s RotationY rtkhez rendeljk hozz.

184

sszefoglals Mivel az rtkeket radinban kapjuk, de fokban kell megadni a PlaneProjection s a RotateTransform szmra, t kell alaktanunk ket. Erre a legegyszerbb mdszer, ha felhasznljuk a Microsoft.Xna.Framework nvtrben tallhat MathHelper osztlyt, melynek statikus tagjai az ilyen s ehhez hasonl mindennapi transzformcik elvgzst knnytik meg. Konkrtan a ToDegrees metdusra lesz szksgnk; ez egy radinban vett rtket fogad, s fokokban vve adja vissza.
void m_CurrentValueChanged(object sender, SensorReadingEventArgs<MotionReading> e) { Dispatcher.BeginInvoke(() => { pp.RotationX = MathHelper.ToDegrees(e.SensorReading.Attitude.Pitch); pp.RotationY = MathHelper.ToDegrees(e.SensorReading.Attitude.Roll); rt.Angle = MathHelper.ToDegrees(e.SensorReading.Attitude.Yaw); }); }

Ha van fizikai eszkznk, amire fel tudjuk tlteni az alkalmazst, akkor indulhat a tesztels. Az emultor sajnos egyelre nem tmogatja a Motion API-t.

sszefoglals
Ebben a fejezetben megismerkedhettnk a Windows Phone 7-nel szerelt eszkzkbe ktelezen vagy opcionlisan beptett rzkelk hasznlatval. Elszr az rintkperny esemnyeinek hrom rtegt tekintettk t a magas szint Tap s trsaitl a tbbrintses kezelst lehetv tev Manipulation esemnyeken keresztl a legals szinten lv Touch.FrameReported esemnyig, mellyel hozzfrnk a kijelz ltal szolgltatott nyers adatokhoz. Ezutn ttekintettk a telefon helynek megllaptst lehetv tev, s az A-GPS-t a cellainformcikkal s ismert wifik alapjn trtn lokalizlssal egyest GeoLocation API hasznlatt a GeoLocationWatcher osztlyon keresztl. Vgl pedig szmba vettk, hogy milyen egyb, helyzetmeghatroz rzkelk s programozsi felletek llnak rendelkezsnkre. A telefonra hat erket gy a gravitcit is mr gyorsulsmr, valamint a mgneses erk irnyt megad magnetomter minden telefon alapfelszereltsge, a telefon forgst mr giroszkp mr opcionlisan bepthet komponens. Ezeknek az eszkzknek a kezelse nagyon hasonl. A Windows Phone 7.5-ben megjelent Motion API rvn pedig mindenezeket a nyers adatokat akkumullva, relevns informcik formjban nyerhetjk ki az opercis rendszerbl.

185

8. Adatkezels
Minden nagyobb alkalmazsnl eljn az az id, amikor trolni kell adatokat a kszlken, legyen sz egyszer belltsokrl vagy sszetett adatokrl, amit relcis adatbzisban trolunk. Ebben a fejezetben megismerkedhetnk azzal, hogyan kezeljnk adatokat a Windows Phone 7 kszlknkn. A fejezetben kitrnk a kvetkez tmakrkre: IsolatedStorage megismerse ApplicationSettings hasznlata Hogyan olvassunk s rjunk fjlokat IsolatedStorage Tool-ok megismerse Loklis adatbzisok hasznlata

Isolated Storage
A Windows Phone 7-nl nem beszlhetnk klasszikus rtelemben a fjlkezelsrl: ha I/O mveleteket szeretnnk elvgezni a fjlrendszeren, akkor csak az Isolated Storage ll a rendelkezsnkre. Ahogy a neve is mutatja, ez egy trhely (Storage), ahol az alkalmazsunk kpes rni, olvasni, valamint az ltalnos fjlmveleteket is el tudja vgezni. Minden alkalmazs krhet magnak egy-egy ilyen elklntett trhelyet, vagyis az alkalmazsok nem frhetnek hozz egyms trhelyhez. Minden alkalmazs csak a sajt Isolated Storage-ben tud garzdlkodni, ott viszont gy, ahogy csak szeretn. Kzvetlen mdon teht nem rhetjk el a teljes fjlrendszert, csak s kizrlag az alkalmazsunk ltal hasznlt Isolated Storage-nket, gy ms alkalmazsok semmilyen mdon nem befolysolhatjk az alkalmazsunk mkdst, ezzel nvelve a biztonsgot s a fjlkrosods elkerlst. A Windows Phone 7 Isolated Storage megoldsa nagyon hasonl a Silverlightos Isolated Storage megoldshoz, mindssze annyi a klnbsg, hogy itt nincs megszabva kvta, mint a Silverlightnl, vagyis itt egy alkalmazs korltlanul gazdlkodhat a trhellyel. Br nincs mretkorlt az alkalmazsok kszti szmra, nhny szempontot clszer szem eltt tartani: Csak akkor hasznljuk a fjlrendszert, ha tnyleg szksges! A fjlkezels legyen transzparens a felhasznlk szmra! Ha tmeneti (Temp) fjlokat ksztnk, akkor lehetleg azonnal trljk azokat, amint mr nem hasznljuk, s nincs is tbb szksg rjuk! Bizonyos esetekben clszer ezeket a fjlokat szinkronizlni vagy archivlni a felhbe (Cloud), gy ha az alkalmazs trlsre kerl, a felhasznl adatai mg megmaradnak, illetve ha a felhasznl msik kliensen jelentkezik be, akkor a megszokott krnyezetvel tallkozhat. Settings: Kulcs/rtk adatokat trolhatunk benne (IsolatedStorageSettings). Leginkbb az alkalmazsunk belltsainak mentsre hasznljuk. Files and Folders: Fjlokat s mappkat kezelhetnk a segtsgvel (IsolatedStorageFile). Relation Data: Relcis adatokat trolhatunk egy loklis adatbzisban (SQL Server Compact Edition), amiket a Linq To SQL technolgival rhetnk el.

A Windows Phone SDK 7.1 verzija ta hromfle adatkezelsi mdszer ltezik a kszlken (8-1 bra):

187

8. Adatkezels

Alkalmazs
IsolatedStorageSettings (System.IO.IsoltedStorage)

Isolated Storage

Kulcs/rtk Prok

IsolatedStorageFile (System.IO.IsoltedStorage)
Fjlok s Mappk

DataConentext (System.Data.Linq)
Loklis adatbzis

8-1 bra: A Windows Phone 7 adatkezelsi lehetsgei A Windows Phone els, 7.0 vltozatban csak a Settings s a Files and Folders adatkezelsi mdszer llt a rendelkezsnkre, de a Mango frisststl kezdve arra is van lehetsgnk, hogy egy loklis adatbzisban relcis mdon troljunk adatokat. A kvetkez fejezetekben megismerkednk az sszes mdszerrel, amellyel adatokat kezelhetnk a Windows Phone kszlken. Krds: Ha lenne kt olyan WP7-es alkalmazs, ami ugyanazt a fjl alap adatforrst hasznlja, meg tudnm osztani valamilyen mdon az IsolatedStorage-ot? Vlasz: Nem. Ebben az esetben pldul egy webszolgltatson keresztl oldhatjuk meg a fjlok kzs hasznlatt.

Application Settings
A fjlrendszert ktflekppen rhetjk el: az els, egyszerbb eset egy kulcs/rtk pr trolsi mdszer, a msodik pedig a tradicionlis fjlkezels, ahol olvashatjuk s rhatjuk a fjl stream-et. Ebben a rszben az els mdszert, az Application Settings-et fogjuk megismerni. Amikor csak egyszer alkalmazs-belltsokat szeretnnk elmenteni vagy lekrdezni, akkor az ApplicationSettings kulcs/rtk pr trolsi mdszer a legclravezetbb megolds. Pldul: ha egy felhasznlnak egy szolgltats bejelentkezshez egy szvegdobozba kell bernia a felhasznli nevt, akkor a mobilon a munkt egyszerbb tehetjk szmra azzal, hogy ha mr egyszer berta, a httrben eltroljuk ezt a felhasznlnevet. Ha ksbb jra elindtja az alkalmazst, akkor a korbban megadott s eltrolt felhasznlnvvel automatikusan ki lesz tltve az adott szvegdoboz. Az ApplicationSettings tulajdonkppen egy sztr, amely megvalstja az IEnumerable<T> interfszt, teht minden olyan mveletet elvgezhetnk rajta, amit egy norml gyjtemnyen is, amint azt a 8-2 bra is illusztrlja.

188

Application Settings

8-2 bra: Bvt metdusok egsz sora ll a rendelkezsnkre Az ApplicationSettings egy specilis Dictionary<TKey, TValue> objektum, amely egy kulcs/rtk prost tud trolni, s ezeket az rtkprokat az adott alkalmazs IsolatedStorage-be menti el. Az albbi kdrszlet az IsolatedStorageSettings felptst mutatja be:
namespace System.IO.IsolatedStorage { public sealed class IsolatedStorageSettings : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IDictionary, ICollection, IEnumerable { public static IsolatedStorageSettings ApplicationSettings { get; } public int Count { get; } public ICollection Keys { get; } public ICollection Values { get; } public object this[string key] { get; set; } public public public public public public } } void void bool bool void bool Add(string key, object value); Clear(); Contains(string key);. Remove(string key); Save(); TryGetValue<T>(string key, out T value);

Ahhoz, hogy az IsolatedStorage-et elrjk, a System.IO.IsolatedStorage nvtrre, a fjlmvelethez pedig a System.IO nvtrre lesz szksgnk. Egy j kulcs/rtk prt tbbfle mdon hozhatunk ltre: egyszeren az Add metdus meghvsval, ebben az esetben az els paramter egy kulcs, aminek egyedinek kell lennie. Ha mr ltezik a kulcs, akkor egy System.ArgumentException-t kaphatunk, a msodik paramter pedig egy tetszleges objektum lehet. Az albbi pldban egy egyszer stringet lthatunk:
// Felhasznlnv hozzadsa j kulcs ltrehozsa IsolatedStorageSettings.ApplicationSettings.Add("UserName", "Attila");

Mivel ez egy Dictionary, ezrt a r vonatkoz szablyok lnek, gy pldul egy indexer segtsgvel is hozzadhatunk egy j kulcs/rtk-prt (gy tudjuk a mr ltez kulcsok rtkt is mdostani). Az

189

8. Adatkezels indexeres megoldsnl, ha az adott kulcs nem ltezik, akkor az ltrejn, abban az esetben, ha mr ltezik a kulcs, akkor a tartalmt fellrja a meghatrozott rtkkel.
// Felhasznlnv mentse /vagy mdostsa IsolatedStorageSettings.ApplicationSettings["UserName"] = "Attila";

Az adott kulcsok rtkt persze le is krdezhetjk, ehhez is hasznlhatunk kt mdszert: az egyik az itt bemutatott indexeres mdszer:
//Felhasznln lekrdezse var userName = IsolatedStorageSettings.ApplicationSettings["UserName"];

A msik lehetsg a TryGetValue metdus hasznlata:


string userValue; IsolatedStorageSettings.ApplicationSettings.TryGetValue<String>("Kulcs", out userValue);

Az Indexeres mdszer esetn, ha a kulcs nem tallhat meg a sztrban, akkor egy KeyNotFoundException-t fogunk kapni, mg ha a TryGetValue metdust hasznljuk, nem kapunk hibt. Ebben az esetben, ha a kulcs nem ltezik, akkor a userValue vltoz rtke res (null) lesz. A TryGetValue nagyon hasonlt a TryParse metdusokra, amit a .NET-es tpusoknl hasznlhatunk. Ez is egy Boolean rtkkel tr vissza: ha sikerlt a kulcsot megtallni s kiolvasni a tartalmt, akkor true-val, egybknt false-szal. Abban az esetben, ha meg akarunk gyzdni arrl, valban ltezik-e a kulcs, a Contains metdust hasznlhatjuk fel. Ez a metdus true rtkkel tr vissza, ha ltezik az adott kulcs, false rtkkel, ha nem.
if (IsolatedStorageSettings.ApplicationSettings.Contains("UserName")) { //Ltezik a UserName kulcs. Olvassuk ki pl. a tartalmt s irassuk ki MessageBox.Show(IsolatedStorageSettings.ApplicationSettings["UserNme"].ToString()); } else { //Nem ltezik MessageBox.Show("Nincs ilyen kulcs!"); }

Az elz pldkban csak egy egyszer string adatot troltunk el, de termszetesen komplex objektumokat is eltrolhatunk az ApplicationSettings-ben. A kvetkez pldban egy sajt osztlyt hozunk ltre, s azt troljuk el, majd olvassuk ki. Ebben az esetben nem kell trdnnk az adatsorostssal, ezt az ApplicationSettings sajt maga megoldja.
public class Person { public string Name { get; set; } public int Age { get; set; } } ... Person myPerson = new Person() { Name = "Jhon", Age = 32 }; //Adat mentse IsolatedStorageSettings.ApplicationSettings["PersonData"] = myPerson;

190

Application Settings

// Adat lekrdezse Person newPerson = IsolatedStorageSettings.ApplicationSettings["PersonData"] as Person; MessageBox.Show(newPerson.Name);

Az ApplicationSettings az alkalmazs bezrsakor elmenti az adatokat, viszont ha az alkalmazs futsa kzben nem vrt hiba trtnik, s az alkalmazs lell, ezek az informcik nem kerlnek elmentsre. Ha biztosra szeretnnk menni, akkor ki kell knyszertennk a mentst az ApplicationSettings Save metdusval.
IsolatedStorageSettings.ApplicationSettings.Save();

A mentett adatokat persze el is tvolthatjuk az ApplicationSettings-bl. Eltvolthatunk egy kulcsot, ilyenkor a Remove metdust kell hasznlnunk:
IsolatedStorageSettings.ApplicationSettings.Remove("UserName");

Ha az sszes rtket el akarjuk tvoltani, akkor a Clear metdust kell meghvnunk:


IsolatedStorageSettings.ApplicationSettings.Clear();

Mivel az ApplicationSettings egy sztr, ezrt mind a kulcsokon, mind az rtkeken vgig tudunk haladni a foreach utastssal:
foreach (var key in IsolatedStorageSettings.ApplicationSettings.Keys) { // Feldolgozs } foreach (var value in IsolatedStorageSettings.ApplicationSettings.Values) { // Feldolgozs }

Egy alkalmazsnl sokszor hasznlhatjuk az ApplicationSettings-et, melynek folyamatos kirsa fradsgos lehet, ezrt ezt egyszerbben az albbi mdon is megoldhatjuk gy tbb billenty letst is megsprolhatjuk:
var settings = IsolatedStorageSettings.ApplicationSettings; settings["Kulcs"] = "rtk"; string myValue = settings["Kulcs"].ToString();

Az elz rvid pldkban lthat volt, hogy az IsolatedStorage hasznlata mennyire egyszer. Egy dolgot azonban mg tisztznunk kell, ez pedig az adatkts technikja! Az elzekben csak explicit mdon mentettnk el s olvastunk ki adatokat, viszont sokszor fordul el, hogy j volna ezt centralizlni, s az ApplicationSettings elrst egyszersteni s sszersteni. A kvetkez pldban egy Settings osztlyt hozunk ltre, amiben ltalnos s/vagy ellenrz mdon tudjuk elrni az ltalunk hasznlt kulcs/rtk prokat. Ez az osztly egy ltalnosan hasznlhat RetriveSettings segdmetdust tartalmaz, amely a paramterben tadott kulcs rtkt adja vissza. Ha az adott kulcs nem tallhat meg a sztrban, akkor az adott tpus alaprtelmezett rtkvel (ebben az esetben ez null) tr vissza.
public class Settings { private const string ApplicationTitleKey = "ApplicationTitle"; private const string PersonKey = "Person";

191

8. Adatkezels

private T RetriveSettings<T>(string settingKey) { object settingValue; if (IsolatedStorageSettings.ApplicationSettings.TryGetValue(settingKey, out settingValue)) { return (T)settingValue; } return default(T); } public string ApplicationTitle { get { return RetriveSettings<string>(ApplicationTitleKey); } set { IsolatedStorageSettings.ApplicationSettings[ApplicationTitleKey] = value; } } public Person MyPerson { get { return RetriveSettings<Person>(PersonKey); } set { IsolatedStorageSettings.ApplicationSettings[PersonKey] = value; } } }

Az osztlyban minden kulcsnak klnll tulajdonsgot ksztnk, gy knnyebb az alkalmazsunkban ezeket a belltsokat rni s olvasni, radsul elkerljk a szveges rtk kulcsok elrst is. Mostantl teht minden kulcsnak kln tulajdonsgot fogunk kszteni, gy a Settings osztlyon keresztl az sszes kulcsrtket el tudjuk rni. Felmerlhet bennnk a krds, hogy a Settings osztly mirt nem lett static? gy sokkal egyszerbb lenne elrni a tulajdonsgok rtkt, mint mindig pldnyostani egy Settings-et! A vlasz egyszer: clravezetbb ezt az osztlyt az App.xaml fjlban deklaratv mdon pldnyostani, gy csak az alkalmazs indulsakor egyszer ksztnk egy Settings pldnyt, s erre ezt kveten az alkalmazsunkban brhol hivatkozhatunk kdbl s XAML-bl egyarnt:
... xmlns:local="clr-namespace:PhoneAppTest" > <Application.Resources> <local:Settings x:Key="MySettings" /> </Application.Resources>

Miutn az App.xaml-ben elksztettk a pldnyt, nyissuk meg az egyik oldalt (jelen esetben a MainPage.xaml), s a PhoneApplicationPage DataContext-jnek adjuk t a MySettings-et az albbi mdon!

192

Application Settings

<phone:PhoneApplicationPage x:Class="PhoneAppTest.MainPage" ... SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True" DataContext="{StaticResource MySettings}">

Ezt kveten az oldalra helyezznk el egy TextBox-ot, s a Text tulajdonsgt kssk az ApplicationTitle-hz. Ebben az esetben a Binding mdja TwoWay, azaz a kts ktirny.
<TextBox Text="{Binding ApplicationTitle, Mode=TwoWay}" Height="72" HorizontalAlignment="Left" Margin="6,6,0,0" Name="textBox1" VerticalAlignment="Top" Width="460" />

A PageTitle Textblock Text tulajdonsghoz is kssk az ApplicationTitle-t:


<TextBlock x:Name="PageTitle" Text="{Binding ApplicationTitle}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>

Ha elindtjuk az alkalmazst (6-3 bra), s a szvegdobozba berunk valamit, az a httrben trolsra fog kerlni. rjunk oda egy tetszleges szveget, majd kattintsunk a Start gombra az emultoron, ekkor az alkalmazs httrbe vonul! Az emultoron jra indtsuk el az alkalmazst, s lthatjuk, hogy az oldal cme s a szvegdoboz tartalma az ApplicationSettings-bl kiolvasott rtk lesz, amint azt a 8-3 brn lthatjuk.

8-3 bra: Application Settings dem alkalmazs Gyakorl feladat: A Settings osztlyban van egy MyPerson tulajdonsg is. Ehhez ksztsk el a felhasznli felletet, s mentsk el az rtkt!

193

8. Adatkezels

IsolatedStorageFileStream
Br knny kulcs rtkeket trolni, olykor ez kevs lehet a szmunkra, s hagyomnyos fjlok elrsre volna szksgnk a fjlrendszeren. Ebben a rszben a tradicionlis, stream-alap fjlkezelst fogjuk kzelebbrl megismerni. Ahhoz, hogy egy j fjlt ltrehozzunk, az IsolatedStorageFileStream osztlyra lesz szksgnk. Ennek az osztlynak a pldnyostsakor kell meghatroznunk a fjl nevt, s annak elrsi mdjt (FileMode enumerci), valamint t kell adnunk egy IsolatedStorage pldnyt is. Ebben az egyszer pldban egy fjlt hozunk ltre, mely a Hello World szveget tartalmazza:
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication(); using (IsolatedStorageFileStream myFileStream = new IsolatedStorageFileStream("data.txt", FileMode.Create, isf)) { StreamWriter sw = new StreamWriter(myFileStream); sw.WriteLine("Hello World"); sw.Flush(); sw.Close(); }

A GetUserStoreForApplication metdus egy IsolatedStorageFile pldnyt ad vissza. A fjlba egy StreamWriter pldny segtsgvel rhatunk. Ennek t kell adnunk egy Stream-et, ez ebben az esetben egy IsolatedStorageFileStream, majd a StreamWriter pldny WriteLine metdusval rhatunk egy sort a fjlba. A fjlbl olvass hasonlan egyszer, annyi a klnbsg, hogy a FileMode ebben az esetben az Open rtkt viseli, valamint egy StreamReader pldnyt hasznlunk az olvasshoz.
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication(); using (IsolatedStorageFileStream myFileStream = new IsolatedStorageFileStream("data.txt", FileMode.Open, isf)) { StreamReader sr = new StreamReader(myFileStream); string text = sr.ReadToEnd(); MessageBox.Show(text); }

Az albbi tblzatban az IsolatedStorageFile tulajdonsgait foglaljuk ssze: Tulajdonsg


AvailableFreeSpace IsEnabled Quota UsedSize

Lers Az IsolatedStorage-ben rendelkezsre ll szabad terlet mrete. Lekrdezhetjk, hogy az IsolatedStorage engedlyezve van-e. A maximlisan felhasznlhat szabad terlet mrete. A mr foglalt terlet nagysga.

Az albbi tblzatban az IsolatedStorageFile fontosabb metdusait talljuk: Metdus


CopyFile(String, String) CopyFile(String, String, Boolean) CreateDirectory

Lers Egy ltez fjl msolsa. Egy ltez fjl msolsa. Ha a cl tvonalon ltezik a fjl, akkor opcionlisan fellrhatjuk. Mappa ksztse

194

IsolatedStorageFileStream

Metdus
CreateFile DeleteDirectory DeleteFile DirectoryExist FileExist GetCreationTime GetDirectoryNames() GetDirectoryNames(String) GetFileNames() GetFileNames(String) GetLastAccessTime

Lers j fjl ksztse Mappa trlse Fjl trlse Megvizsglhatjuk, hogy az adott mappa ltezik-e. Megvizsglhatjuk, hogy az adott fjl ltezik-e. Visszaadja a fjl vagy mappa ksztsi idejt. Visszaadja a mappk neveit (Gykrknyvtrbl kiindulva). Visszaadja a mappk neveit egy meghatrozott minta alapjn. Visszaadja a fjlok neveit (Gykrknyvtrbl kiindulva). Visszaadja a fjlok neveit egy meghatrozott minta alapjn. Visszaadja, hogy a fjlhoz vagy mapphoz mikor frtek hozz utoljra. A felhasznlhoz tartoz izollt trhelyet kezel IsolatedStorageFile pldnyt krhetnk a segtsgvel. Mappa (s tartalmnak) thelyezse egy j tvonalra Fjl mozgatsa egy j helyre, opcionlisan a fjl nevt is megvltoztathatjuk. Fjl megnyitsa egy meghatrozott mdon Fjl megnyitsa egy meghatrozott mdon- s hozzfrssel. Az IsolatedStorage s tartalmnak eltvoltsa

GetUserStoreForApplication MoveDirectory MoveFile OpenFile(String, FileMode) OpenFile(String, FileMode, FileAccess) Remove

Nzznk nhny gyakori felhasznlsi esetet! Knyvtr ltrehozshoz a CreateDirectory metdust hasznlhatjuk fel, ahol a metdusnak a knyvtr nevt adjuk t:
IsolatedStorageFile myISF = IsolatedStorageFile.GetUserStoreForApplication(); myISF.CreateDirectory("UjKonvtar");

Megadhatunk sszetett knyvtr tvonalat is:


myISF.CreateDirectory("Folder1/Folder2/Folder3/UjKonvtar");

Egy knyvtr trlse is legalbb ilyen egyszer, ehhez a DeleteDirectory metdust hasznlhatjuk fel:
myISF.DeleteDirectory("UjKonvtar");

Mind a knyvtr ltrehozsakor, mind a knyvtr trlsekor clszer ellenrizni, hogy az adott knyvtr ltezik-e:

195

8. Adatkezels

public void CreateDirectory(string directoryName_in) { try { IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication(); if(!string.IsNullOrEmpty(directoryName_in) && !myIsolatedStorage.DirectoryExists(directoryName_in)) { myIsolatedStorage.CreateDirectory(directoryName_in); } } catch (Exception ex) { // Kivtel } } public void DeleteDirectory(string directoryName_in){ try { IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication(); if (!string.IsNullOrEmpty(directoryName_in) && myIsolatedStorage.DirectoryExists(directoryName_in)) myIsolatedStorage.DeleteDirectory(directoryName_in); } } catch (Exception ex) { // Kivtel } }

Lthatjuk, hogy a Windows Phone 7 alatt a fjlkezels rendkvl egyszer s gyorsan elsajtthat. Radsul, akik korbban Silverlight alatt hasznltk ezt a funkcit, azok szmra ez sok jdonsgot nem is rejteget. Gyakorlottaknak s kezdknek egyarnt knnyen s hatkonyan hasznlhat API ll a rendelkezsre.

Isolated Storage gyakorlat


A kvetkez gyakorlatban egyszer jegyzetel alkalmazst fogunk elkszteni (8-4 bra). Az alkalmazs felhasznli fellete elre el van ksztve. A projekt kiindulsi anyagt a kvetkez oldalrl tlthetjk le: http://devportal.hu/wp7.

8-4 Az elksztett jegyzetel alkalmazs

196

IsolatedStorageFileStream A gyakorlatban csak az adattrolssal kapcsolatos kdokat fogjuk kzsen megrni, az albbi lpsekben: a. Nyissuk meg az IsolatedStorageDemo.sln fjlt (Begin mappa)! Ha valamit a gyakorlat lpsei sorn nem sikerlne pontosan kvetnnk, az End mappban megtallhat s kiprblhat az alkalmazs vgleges formja. b. Fordtsuk le, s indtsuk el az alkalmazst! Egyszer jegyzetel felletet kapunk, de jelenleg mg nem tudjuk sem elmenteni, sem betlteni jegyzeteinket. c. Itt az ideje ezeket a funkcikat megvalstani! Zrjuk be a fut alkalmazst, s trjnk vissza a projekthez! Nyissuk meg az App.xaml.cs fjlt, s navigljunk el az Application_Startup esemnyhez, itt fogjuk a jegyzeteink szmra elkszteni a Notes mappt. Az alkalmazs minden indulsakor megvizsgljuk a DirectoryExist metdussal, hogy a Notes mappa ltezik-e. Ha nem ltezik (pl. els induls), akkor a CreateDirectory metdussal ltrehozzuk:
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication(); if (!isf.DirectoryExists("Notes")) { isf.CreateDirectory("Notes"); }

d. Nyissuk meg a MainPage.xaml.cs fjlt, s oldjuk fel a System.IO s a System.IO.IsolatedStorage nvteret! (A feladatban a tbbi lapjhoz mr hozzadtuk ezeket a nvtereket.)
using System.IO; using System.IO.IsolatedStorage;

e. A MainPage.xaml.cs-ben navigljunk el a btnSave_Click esemnyhez, ugyanis itt fogjuk elmenteni a jegyzetnket a fjlrendszerbe. Elszr a path vltozban ltrehozunk egy tvonalat a jegyzeteink szmra: azok a Notes mappba fognak kerlni, s .dat lesz a kiterjesztsk. Ezt kveten ltrehozunk egy IsolatedStorageFileStream-et. Ezt legegyszerbben a StreamWriter-rel tudjuk rni, gy a mySw pldny WriteLine metdus paramternek tadjuk a txtDocument.Text tulajdonsgnak rtkt. Ha minden sikeresen lezajlott, akkor egy MessageBox-ban ezt megzenjk a felhasznlnak.
string path = "Notes\\" + txtTitle.Text + ".dat"; IsolatedStorageFile myISFile = IsolatedStorageFile.GetUserStoreForApplication(); using (IsolatedStorageFileStream myFs = new IsolatedStorageFileStream(path, FileMode.Create, FileAccess.Write, myISFile)) { using (StreamWriter mySw = new StreamWriter(myFs)) { mySw.WriteLine(txtDocument.Text); mySw.Flush(); } } MessageBox.Show("A jegyzetedet elmentettk!", "Isolated Storage Demo", MessageBoxButton.OK);

f.

Most mr elksztettk az alkalmazsunk jegyzet (Notes) mappjt, s el is tudjuk menteni a jegyzeteinket. Itt az ideje megrni azt is, hogy a korbban elmentett jegyzeteinket vissza tudjuk tlteni. Nyissuk meg a Pages/SavedItems.xaml.cs fjlt, s navigljunk el a SavedItems konstruktorba: itt fogjuk kiolvasni a fjlrendszerrl, hogy jelenleg milyen jegyzeteink vannak mentve. Ehhez az IsolatedStorageFile pldny GetFileNames metdust fogjuk segtsgl hvni az albbi mdon:

IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();; lstMyNotes.ItemsSource = isf.GetFileNames("Notes\\*.dat");

197

8. Adatkezels A GetFileNames visszatrsi rtke egy String tmb, ezt adjuk t a lstMyNotes listnak. g. Az elz pontnl megjelentettk a jegyzeteink fjljait egy listban, most pedig megrjuk azt az egyszer funkcit, amivel a kivlasztott fjlt tadjuk a MainPage-nek, ami majd megnyitja az adott jegyzetet. Navigljunk el a lstMyNotes_SelectionChanged esemnyhez, s a metdus trzsbe rjuk a kvetkezt:
string selectedItem = lstMyNotes.SelectedItem as string; if (selectedItem != null) { NavigationService.Navigate(new Uri("/MainPage.xaml?OpenFile="+selectedItem, UriKind.Relative)); }

Itt egyszeren a kivlasztott fjl nevt tadjuk a MainPage-nek, mghozz a QueryString tadsi mintt kvetve. h. Termszetesen, ha tadtuk ezt a paramtert, akkor azt le is kell krdeznnk, s az tadott rtknek megfelelen megnyitni az adott fjlt. Trjnk vissza a MainPage.xaml.cs hez, s navigljunk el az OnNavigatedTo esemnyhez, s itt ltrehozunk egy fileName nev string vltozt. A NavigationContext.QueryString.TryGetValue metdusval megprbljuk elrni az OpenFile paramter rtkt. A fjl olvassa a fjlrs analgijra trtnik, itt azonban az IsolatedStorageFileStream FileMode felsorolt tpusbl az Open rtket vlasztjuk, s StreamWriter helyett StreamReader-t hasznlunk. A StreamReader ReadToEnd metdusnak segtsgvel a fjl teljes tartalmt kiolvassuk, ezt kveten tadjuk a txtDocument-nek. A txtTitle esetn a fileName szvegbl eltntetjk a .dat kiterjesztst, hogy elegnsabban jelenjen meg a fejlc:
string fileName = string.Empty; if (NavigationContext.QueryString.TryGetValue("OpenFile", out fileName)) { IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication(); using (IsolatedStorageFileStream myFs = new IsolatedStorageFileStream("//Notes//" + fileName, FileMode.Open, isf)) { using (StreamReader sr = new StreamReader(myFs)) { txtTitle.Text = fileName.Replace(".dat", ""); txtDocument.Text = sr.ReadToEnd(); } } }

i.

Ezzel elkszlt az alkalmazsunk. Fordtsuk le a forrskdot (Ctrl+Shift+B), s ha valamilyen hibt tapasztalunk, nzzk t jra a kdot s javtsuk azt! Ha minden rendben lezajlott, akkor indtsuk el az alkalmazsunkat (F5)! Az megjelenik kezdkpernyjn a jegyzeteink listjval, amint azt a 8-5 bra mutatja.

198

IsolatedStorageFileStream

8-5 bra: Jegyzetek megnyitsa Az alkalmazs betltse utn rjunk egy jegyzetet, majd kattintsunk a ments gombra! Ksztsnk egy j jegyzetet (+), ezt kveten kattintsunk a megnyits gombra! A megjelen ablakban a jegyzeteink lesznek lthatk. Vlasszunk ki egy jegyzetet, s a kvetkez pillanatban mr a fkpernyn lthatjuk a jegyzetnk tartalmt! Ha ezeket a lpseket sikerlt elvgeznnk, akkor eddig a feladatot helyesen oldottuk meg. Zrjuk be az alkalmazst, s trjnk vissza a Visual Studio-hoz! A fjlkezelshez hozztartozik a belltsok kezelse is. A kvetkezkben a jegyzetel alkalmazsunkat kiegsztjk egy olyan belltssal is, melynek segtsgvel a felhasznl meghatrozhatja, hogy a jegyzetek betszne milyen legyen. Nyissuk meg a Pages/Settings.xaml.cs fjlt, s navigljunk el az lpForeground_SelectionChanged metdushoz, majd a felttelbe rjuk a kvetkez kdsorokat:
IsolatedStorageSettings.ApplicationSettings["Foreground"] = selectedItem.Key; NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));

j.

k. Itt az IsolatedStorageSettings.ApplicationSettings Foreground kulcshoz hozzadjuk a kivlasztott szn kulcsnak rtkt, majd visszanaviglunk a MainPage oldalra. l. Ha mr kivlasztottunk egy sznt, s el is van trolva, akkor azt a kvetkez Settings page-re naviglskor jelentsk meg a felhasznl szmra! Navigljunk el a Settings konstruktorhoz, s tltsk be a hasznlt szn indext:
IsolatedStorageSettings.ApplicationSettings.TryGetValue<int>("Foreground", out currentIndex);

Itt az IsolatedStorageSettings.ApplicationSettings.TryGetValue metdust hasznljuk. Hasznlhatnnk az indexeres formt is, de a TryGetValue egyik nagy elnye az, hogy ha az adott kulcs (esetnkben Foreground) mg nem ltezik, akkor sem jelez hibt, a vltoz pedig az alaprtelmezett rtkt kapja (ebben az esetben a 0-t, ami kts utn a fekete sznt reprezentlja). m. Termszetesen a MainPage nl is alkalmaznunk kell a kivlasztott sznt: nyissuk meg a MainPage.xaml.cs fjlt, s navigljunk el az OnNavigatedTo esemnyhez! rjuk hozz a kvetkez kdsort:
IsolatedStorageSettings.ApplicationSettings.TryGetValue<int>("Foreground", out foregroundColorIndex);

199

8. Adatkezels Csakgy, mint a Settings page-nl, itt is kiolvassuk a foreground tulajdonsgot, majd alkalmazzuk a szvegdobozon. n. Immr ksz a teljes alkalmazs. Fordtsuk le a forrskdot (Ctrl+Shift+B), s ha valamilyen hibt tapasztalunk, nzzk t jra a kdot, s javtsuk azt! Ha minden rendben lezajlott, akkor indtsuk el az alkalmazsunkat (F5)! o. Ksztsnk egy jegyzetet, majd mentsk el! Vlasszuk ki a belltsok menpontot, s a megjelen ablakban vlasszunk ki egy neknk tetsz sznt (8-6 bra)! Ha kivlasztottunk egy j sznt, akkor az alkalmazs rgtn visszanavigl a MainPage oldalra, ahol lthatjuk, hogy a jegyzetnk betszne megegyezik az ltalunk kivlasztott sznnel.

8-6 bra: Sznvlaszt lap Ezen a gyakorlaton keresztl is lthattuk, hogy a fjlkezels rendkvl egyszer a Windows Phone on. Minden alkalmazs rendelkezhet IsolatedStorage-dzsal, ahol fjlmveleteket vgezhet, de ebbl a kontextusbl nem tud kibjni.

nll feladatok
Fejlesszk tovbb a jegyzetel alkalmazst! Nincs megkts arra, hogy mit s hogyan, legynk kreatvak! Mdostsuk szabadon a UI-t, vagy vigynk fel j menpontokat! Rajtunk mlik a feladat, a minl lelemnyesebb megoldsa a lnyeg. 1. Ksztsk el az alkalmazst gy, hogy tudjunk jegyzetet trlni! 2. A jegyzet megnyitsnl jelentsk meg valamilyen formban a jegyzet ksztsnek dtumt! 3. Tegyk megvltoztathatv jegyzetnk bettpust!

IsolatedStorage Tool
Azoknl az alkalmazsoknl, ahol sok a fjlmvelet, hasznos lenne ltni, hogy az alkalmazs hasznlata sorn milyen fjlok keletkeztek, hogy azok az ltalunk meghatrozott tvonalon jttek-e ltre, s hogy tartalmuk helyes-e. A knnyebb hasznlat rdekben a Mango frissts fejesztkszletnek rsze lett az Isolated Storage Explorer Tool (ISETool.exe). Ez egy parancssori eszkz, amely segtsgvel mveleteket tudunk vgezni a kszlk vagy az emultor Isolated Storage-n. Pldul: kilistzhatjuk a mappk tartalmt, msolhatunk, trlhetnk s minden alapvet fjlmveletet elvgezhetnk a segtsgvel. Az Isolated Storage Explorer Tool-t csak a regisztrlt fejleszti kszlkeken lehet hasznlni. Ezt a Toolt a $Program Files\Microsoft SDKs\Windows Phone\v7.1\Tools\IsolatedStorageExplorerTool tvonal alatt tallgat. Az Isolated Storage Explorer hasznlathoz a kvetkez szintaxist lehet hasznlnunk:
ISETool.exe <ts|rs|dir[:device-folder]> <xd|de> <Product GUID> [<desktop-path>]

200

IsolatedStorage Tool

Parancs TS RS DIR Device-folder XD DE Product GUID Desktop-path

Lers Snapshot ksztse Snapshot helyrelltsa Mappk s fjlok listzsa Mappa meghatrozsa Emultoron trtn hasznlat Kszlken trtn hasznlat A termk ProductID-je (WPAppManifest.xml) Egy knyvtr a szmtgpnkn, ahov msolhatunk vagy rhatunk fjlokat az IsolatedStorage-bl.

Nzzk meg ezt az eszkzt hasznlat kzben! 1. Ksztsnk egy egyszer Windows Phone 7 alkalmazst! 2. Keressk ki a ProductID-t a WPAppManifest.xml fjlbl:
<App xmlns="" ProductID="{d25bf842-f28d-45ff-9a4d-6057e6614321}" Title="PhoneApp2"

3. Nyissunk meg egy parancssort! 4. Navigljunk el a Windows Phone 7 SDK IsolatedStorageExplorer mappjba: $Program Files\Microsoft SDKs\Windows Phone\v7.1\Tools\IsolatedStorageExplorerTool 5. Indtsuk el az alkalmazst az albbi mdon:
ISETool.exe dir xd d25bf842-f28d-45ff-9a4d-6057e6614321

(Amennyiben fizikai kszlkrl szeretnnk lekrdezni ezeket az informcikat, az xd helyett de kapcsolt kell hasznlnunk.) Ne felejtsk el trni a sajt ProductID-nkat! Az eredmnyt a 8-7 brn lthatjuk.

8-7 bra: Mappk s fjlok listzsa emultoron 6. Listzni mr tudunk, nzzk meg, hogyan msolhatunk fjlokat a telefonrl a fjlrendszernkre! Ezzel a funkcival lementhetjk az alkalmazsunk mappjt, s a helyi gpnkn szabadon megvizsglhatjuk azok tartalmt. Ehhez mindsszesen a kvetkez parancsot kell kiadnunk: ISETool.exe ts <xd|de> <Product GUID> <desktop-path>, pldul (8-8 bra):

201

8. Adatkezels

ISETool.exe TS xd d25bf842-f28d-45ff-9a4d-6057e6614321 "D:\IsolatedStorage

8-8 bra: Fjlok lementse emultorrl Ezen a parancssori eszkzn kvl termszetesen vannak grafikus modulok is, st, olyan eszkz is ltezik, amely a Visual Studio-ba pl be. Ilyen eszkz pldul az Isolated Storage Tool (8-9 bra), amely szintn lehetsget biztost arra, hogy adatokat tltsnk le a telefonunkrl (vagy emultorunkrl a szmtgpnkre), illetve lehetsget biztost arra is, hogy a gpnkrl tltsnk fel adatokat a telefonon fut alkalmazsunk knyvtrba. Ezt a kiegsztt a kvetkez oldalrl tlthetjk le: http://visualstudiogallery.msdn.microsoft.com/fcd19b08-f8bc-4397-84bc-c10cd44ca673?SRC=VSIDE

8-9 bra: A Visual Studiba bepl Isolated Storage Tool

Loklis adatbzisok hasznlata Windows Phone 7-en


Loklis relcis adatbzis ksztsre s hasznlatra a Windows Phone 7 els (7.0 s) vltozatban nem volt beptett lehetsg, a Mango frisstssel viszont az Isolated Storage-ben az alkalmazsunk elhelyezhet relcis adatbzist is. Ezt Microsoft SQL Server Compact Edition (CE) teszi lehetv, amely egy fjl alap, az alkalmazsba bepl mdon mkd relcis adatbzis-kezel. Ezt az adatbzist csak a Linq To SQL API segtsgvel rhetjk el, s gy objektumorientlt mdon kezelhetjk adatainkat. Az SQL Servernl megszokott Transact SQL segtsgvel kzvetlenl nem rhetjk el az adatbzist. Az adatbzist csak sajt alkalmazsunk rhatja s olvashatja, azt ugyangy, mint az Isolated Storage esetn nem oszthatjuk meg a tbbi alkalmazssal!

Linq To SQL
A Linq To SQL egy n. ORM (Object Relational Mapping) keretrendszer, amelyet a .NET Framework tartalmaz. A Linq To SQL lehetsget biztost arra, hogy kdunkban begyazva fogalmazzunk meg lekrdezseket, s azokat lefuttassuk az adott adatbzismotoron. Ahhoz, hogy ez mkdjn, az

202

Loklis adatbzisok hasznlata Windows Phone 7-en adatbzisok vilgt kzelebb kell hoznunk az objektumorientlt vilghoz, ugyanis az adatbzisoknl tblk vannak, amelyekben sorok s oszlopok tallhatk, mg egy objektumorientlt programban entitsok s tulajdonsgok vannak. Ezt a kt vilgot meg kell feleltetni egymsnak, hogy dolgozni tudjunk az adatokon. Ezt a megfeleltetst nevezzk mappingnek. A megfeleletsen kvl szksgnk lesz egy proxy objektumra is, ami megvalstja a kapcsolatot az adatbzissal s az egyb specifikus funkcikat is elvgzi, ezt DataContextnek nevezzk (8-10 bra).

8-10 bra: Loklis adatbzisok

DataContext
A DataContext egy proxy objektum, amely az adatbzist reprezentlja. A DataContext Table tpus objektumokat tartalmaz, amely az adatbzis tblit reprezentlja. Minden Table objektum entitsokbl pl fel, amelyek pedig a tblk oszlopait rjk le. Minden entits egy Plain Old CLR Object (azaz POCO), amelyek specilis attribtumokkal van elltva. Ezekkel az attribtumokkal definiljuk, hogy az adott objektum milyen mdon reprezentlja az adatbzist. Ennek megrtshez kpzeljk el az albbi pldt: Van egy Users tblnk, melynek van egy Name s egy Age oszlopa. Ezt a tblt a DataContext-ben egy User osztly reprezentlja, amelynek kt tulajdonsga van: a Name s az Age. Azon kvl, hogy van egy ilyen osztlyunk, azt specilis attribtumokkal kell elltnunk az adatbzis specilis megktseinek, tulajdonsgainak lershoz.

Mapping
A mapping maga a megfeleltets egy adattbla s az azt reprezentl objektum kztt. Egyszer POCO (Plain Old CLR Object) objektumokat s tulajdonsgaikat specilis jelzsekkel attribtumokkal jellhetnk meg. Az osztlyt elltjuk egy Table attribtummal, ezzel jelezve, hogy ez az osztly tulajdonkppen az adatbzis egy tbljnak reprezentcija lesz. Az osztly tulajdonsgait pedig a Column attribtummal ltjuk el, hogy jelezzk, ezek a tulajdonsgok kpzik az adatbzis oszlopait. A Table attribtumnl egy Name tulajdonsgot is megadhatunk. Ha megadjuk, akkor az adatbzisban tallhat tbla neve az lesz, amit megadtunk. Ha nem adunk meg nevet, akkor automatikusan az osztly neve lesz adatbzis tbljnak a neve. Nzznk egy pldt, amelyben a Countries tblt a Country osztlynak feleltetjk meg! Az itt lert Country osztly az alkalmazs futtatsnl egy Countries nev tblt hoz ltre az adatbzisban:
[Table(Name="Countries")] public class Country { }

Ebben a pldban a Country nev adatbzis tblhoz a megegyez nev osztly tulajdonsgait rendeljk:
[Table] public class Country { }

203

8. Adatkezels A tblkat s az zleti objektumainkat mr egymshoz rendeltk, viszont a tblk oszlopait mg nem rendeltk tulajdonsgokhoz! Ehhez a Column attribtumot hvjuk segtsgl! Csak akkor lthatjuk el a tulajdonsgainkat ezzel az attribtummal, ha az osztly el van ltva a Table jellvel. A Column attribtumnl tovbbi lehetsgeink is vannak: meghatrozhatjuk pldul, hogy az adott oszlop elsdleges kulcs-e, adatbzis lltja-e el az adott oszlop rtkt (Pldul: AutoIncrement es ID mez). A Name tulajdonsgval meghatrozhatjuk, hogy az adott nev adattbla oszlop melyik tulajdonsghoz legyen rendelve:
[Table] public class City { [Column(IsPrimaryKey=true, IsDbGenerated=true)] public int ID { get; set; } }

A Column attribtumnl hatrozhatjuk meg azt is, hogy az adott rtk lehet-e null:
[Column(CanBeNull=true)] public string Name { get; set; }

Az albbi tblzat a rendelkezsre ll attribtumokat sorolja fel, s kpessgeit rja le: Attribtum
[Table] [Column] [Index(Columns="Column1,Column2 DESC", IsUnique=true, Name="MultiColumnIndex")] [Association(Storage="ThisEntityRefName", ThisKey="ThisEntityID", OtherKey="TargetEntityID")]

Lers Tblk megfeleltetsre szolgl. Oszlopok megfeleltetsre szolgl. Tovbbi indexek meghatrozsra szolgl, minden index egy vagy tbb oszlopot fedhet le. Tblk kztti kapcsolat meghatrozsra szolgl (pl. idegen kulcs elsdleges kulcs kapcsolat).

Adatbzis ltrehozsa
Ahhoz, hogy ltrehozzunk egy adatbzist, egy DataContext tpust s legalbb egy entits osztlyt ltre kell hoznunk. Ezek az osztlyok lesznek felelsek a mappingrt, ennek megfelelen ezeket az objektumokat el kell ltni a megfelel attribtumokkal. A lekpezshez szksgnk lesz a System.Data.Mapping.Linq nvtrre. Az adatbzist gy tudjuk ltrehozni, hogy ksztnk egy egyszer osztlyt, s elltjuk a megfelel attribtumokkal. Pldul ha szeretnnk ltrehozni egy tblt az gyfeleink nyilvntartsra, ehhez ltrehozunk egy Customer osztlyt, amibe felvesznk nhny tulajdonsgot. Nzznk egy konkrt pldt az adatbzis lekpezsre! Ltrehozzuk a Customer osztlyt, amelyet elltunk egy Table attribtummal. Ebben meghatrozzuk, hogy ez az osztly a Customers tblhoz fog kapcsoldni. Az osztlyban elhelyezhetnk sajt tulajdonsgokat, melyeket a Column attribtummal rendelnk az adatbzis oszlopaihoz.
using System.Data.Linq.Mapping; namespace PhoneDatabase { [Table(Name="Customers")] public class Customer { [Column(IsPrimaryKey=true)]

204

Loklis adatbzisok hasznlata Windows Phone 7-en

public int CustomerID { get; set; } [Column] public string CompanyName { get; set; } [Column] public string ContactName { get; set; } [Column] public string City { get; set; } } }

A CustomerID tulajdonsgot a tbla elsdleges kulcsaknt jelljk meg. Ahhoz, hogy ltrehozzuk, vagy lekrdezseket fogalmazzunk meg ezen a tbln, szksgnk lesz egy DataContext-re is. Ehhez ltre kell hoznunk egy jabb osztlyt ezt nevezzk el mondjuk CustomerDataContext-nek! Ezt az osztlyt a DataContext osztlybl kell szrmaztatnunk (a DataContext a System.Data.Linq nvtrben tallhat). Hozzuk ltre a Customers tulajdonsgot, amely legyen Table<Customer> tpus! Ez reprezentlja a Customers tblban lv adatokat. A tulajdonsgot a konstruktorban inicializljuk. Ennek a konstruktornak paramterknt tadjuk az adatbzis elrshez szksges connectionString paramtert, amelyet tadunk a DataContext konstruktornak:
using System.Data.Linq; namespace PhoneDatabase { public class CustomerDataContext : DataContext { private Table<Customer> customers; public Table<Customer> Customers { get { return customers; } } public CustomerDataContext(string connectionString) : base (connectionString) { customers = GetTable<Customer>(); } } }

Most mr ksz az entits osztlyunk, s ksz a DataContext is. Itt az ideje az adatbzist fizikailag is ltrehozni! Ehhez a DataContext pldny CreateDatabase metdust kell meghvnunk. Clszer az adatbzis ltrehozsa eltt ellenrizni, hogy az adott adatbzis ltezik-e. DataContext pldnyostsakor meg kell adnunk a connection stringet, ami ebben az esetben isostore:/Customer.sdf, azaz az Isolated Storage legfels mappjban egy Customer.sdf fjlra hivatkozunk.
using (CustomerDataContext db = new CustomerDataContext("isostore:/Customer.sdf")) { if (!db.DatabaseExists()) { db.CreateDatabase(); } }

Most mr van egy adatbzisunk, amiben van egy Customer tbla, de macers munka ezt minden esetben manulisan ltrehozni. Nincs lehetsg valami knyelmesebb, megszokottabb mdszerre? De van! A kvetkez rszben ezzel fogunk megismerkedni.

205

8. Adatkezels

Adatbzis ltrehozsa II.


Br elg egyszer ltrehozni adatbzist gy, hogy van egy entits osztlyunk s egy DataContext pldnyunk, mgis egy bonyolultabb adatbzis szerkezetnek ltrehozsa sok munkval jrhat, klnsen, ha nagyon sok tblnk van, s a tblk kztt kapcsolatok is vannak. Nemcsak ltre tudunk hozni adatbzist, arra is van lehetsgnk, hogy mr meglv adatbzist (sdf) hozzadjunk a projekthez s kezeljk azt. Nzzk meg ezt az esetet lpsrl lpsre! A clunk teht az, hogy ltrehozzunk egy SQL Server CE adatbzist, ellltsuk hozz az entits osztlyokat s a DataContextet, majd felhasznljuk egy WP7 alkalmazsban. 1. Indtsuk el az SQL Server Mangement Studio 2008 Express vltozatt (ha ez az alkalmazs nincs meg, akkor legegyszerbben a Web Platform Installer-rel telepthetjk fel)! 2. Indts utn egy Login kperny fogad. Itt a Server type-nl vlasszuk az SQL Server Compact ot (8-11 bra)!

8-11 bra: A Connect To SQL Server dialgus 3. A Database file-nl vlasszuk a <New Database> menpontot, ekkor felugrik a Create New SQL Server Compact Database ablak (8-12 bra). A fjl neve ebben az esetben a D meghajt TestDb mappjra mutat, ebben a mappban fogja a MyMusic.sdf adatbzist ltrehozni a Management Studio.

8-12 bra: Create New SQL Server Compact Database Most nem foglalkozunk a titkostssal, gy az Encryption mode maradhat UNENCRYPTED. Ezt kveten kattintsunk az OK gombra! Ugyan most kapunk egy figyelmeztetst, hogy az adatbzisunk nem lesz levdve, de ezzel most ne trdjnk, s kattintsunk a Yes gombra! A ksbbiek folyamn a titkostssal is fogunk foglalkozni. 4. Ezt kveten visszaugrunk a Connect To Server ablakhoz, itt kattintsunk a Connect gombra, ekkor az SQL Server Management Studio-bl kezelhetjk ezt az adatbzist. 5. Az Object Explorer-ben kattintsunk a Tables elemre jobb egrgombbal, majd a megjelen helyi menben vlasszuk ki a New Table menpontot!

206

Loklis adatbzisok hasznlata Windows Phone 7-en 6. A megjelen New Table ablakban definiljuk a Musics adattblt, ahogyan azt a 8-13 bra mutatja!

8-13 - A Musics adattbla definilsa Az ID oszlop egy int tpus elsdleges kulcs, True rtkre lltott Identity tulajdonsggal s annak alaprtelmezett rtkeivel. Az Artist s a Title mezk nvarchar tpusak, a Rating mez int tpus. Kattintsunk az OK gombra! 7. Most mr elkszlt az adatbzisunk, bezrhatjuk az SQL Server Management Studio-t. Az adatbzist Windows Phone all viszont csak Linq To SQL-lel rhetjk el. Ehhez ltre kell hoznunk az entitsokat reprezentl osztlyokat. Persze itt is megtehetnnk, hogy kzzel generljuk az entits osztlyokat s a DataContextet, de van szerencsre egy SQLMetal nevezet eszkz is, ami br hivatalosan mg mindig nem tmogatott eszkz, a Windows Phone 7 fejleszts sorn mgis nagy hasznt tudjuk venni. 8. Indtsuk el a Visual Studio 2010 Command prompt-ot! 9. A Command Prompt-ban az egyszersg kedvrt navigljunk el abba a mappba, ahol az adatbzist elksztettk (Ez jelen esetben a D:\TestDb mappa), majd indtsuk el az SqlMetal.exe alkalmazst az albbi paramterekkel:
sqlmetal MyMusic.sdf /code:MyMusic

Ebben az esetben a MyMusic.sdf-bl ksztnk MyMusic.cs fjlt (8-14 bra). A forrsfjlban lesznek az entitsosztlyaink, valamint a DataContext is. Ez a forrsfjl jelenleg az adatbzis mellett tallhat.

207

8. Adatkezels

8-14 bra: Az SqlMetal hasznlat kzben 10. Most mr ksz az adatbzisunk s a hozz tartoz osztlyok is elkszltek! Itt az ideje hasznlatba venni ezeket: indtsuk el a Visual Studio-t, s ksztsnk egy j Windows Phone Application projektet (legyen a neve DatabaseSample)! 11. Amint elkszlt az alkalmazs sablonja, adjuk hozz az adatbzist s az SqlMetal ltal generlt forrsfjlt! Ehhez a Solution Explorer-en kattintsunk jobb egr gombbal, majd a megjelen helyi menben vlasszuk ki az Add Existing Item menpontot, s vlasszuk ki a fentebb emltett fjlokat! 12. Adjuk hozz a projekthez a System.Data.Linq assembly-t is! Jobb egrgomb a References-re a Solution Explorerben, s vlasszuk ki az Add Reference menpontot! 13. A megjelen ablakban kattintsunk a .Net flre, s vlasszuk ki a System.Data.Linq nvteret! 14. Ezt kveten, ha megprblnnk lefordtani az alkalmazst, a kvetkez hibazenetet kapnnk:
The type or namespace name 'IDbConnection' does not exist in the namespace 'System.Data' (are you missing an assembly reference?)

15. Ez azrt van, mert a Windows Phone 7 System.Data nvterben valban nem ltezik IDbConnection, az SqlMetal viszont legenerlta azt. Mint korbban is emltettk, az SqlMetal nem generl teljesen kompatibilis kdot a Windows Phone 7-tel, hivatalosan nem is tmogatott eszkz, mgis megknnyti a fejlesztst. Ahhoz, hogy ez a DataContext helyes legyen, alaktsuk t a kt konstruktort az albbi mdon:
public MyMusic(System.Data.IDbConnection connection) : base(connection, mappingSource) { OnCreated(); } public MyMusic(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : base(connection, mappingSource) { OnCreated(); }

Ettl a ponttl kezdve mr hasznlatba vehetjk az adatbzist. Igen m, de ha megprblnnk elrni azt, akkor a 8-15 brn lthathoz hasonl hibt kapnnk:
MyMusic db = new MyMusic("isostore:/MyMusic.sdf");

208

Loklis adatbzisok hasznlata Windows Phone 7-en

8-15 bra: SqlException was unhandled. The Database file cannot be found. 16. Ezt a hibt azrt kapjuk, mert az IsolatedStorage-ban nem szerepel ez az adatbzis. Br Contentre van lltva az adatbzis Build Action tulajdonsga, s az XAP-ban is benne van ez az adatbzis, mgsem tallhat az Isolated Storage-ban! Ahhoz, hogy ezt az adatbzist hasznljuk (Reference Database), egy specilis connection stringet kell megadnunk:
MyMusic db = new MyMusic("Data Source = 'appdata:/MyMusic.sdf'; File Mode = read only");

17. Az adatbzist most mr elrhetjk, de csak lekrdezseket fogalmazhatunk meg rajta, azaz csak olvashat az adatbzis tartalma. Amint mdostani szeretnnk, azonnal egy Permission Denied hibazenetet kapnnk, amint azt a 8-16 bra is mutatja. (Az adatok mdostsrl s hozzadsrl a kvetkez alfejezetben olvashatunk.)

8-16 bra: Permission denied zenet az adatbzis mdostsakor 18. Ahhoz, hogy ezt elkerljk, az adatbzist t kell msolnunk az Isolated Storage-ba. Ehhez hasznlhatjuk pldul az albbi segdmetdust:
public class DatabaseHelper { public static void MoveReferenceDatabase() { IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication(); using (Stream input = Application.GetResourceStream(new Uri("MyMusic.sdf", UriKind.Relative)).Stream) { using (IsolatedStorageFileStream output = iso.CreateFile("MyMusic.sdf")) { byte[] readBuffer = new byte[4096]; int bytesRead = -1;

209

8. Adatkezels

while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0) { output.Write(readBuffer, 0, bytesRead); } } } } }

19. Amint meghvjuk a MoveReferenceDatabase metdust, az tmsolja az adatbzist az Isolated Storage-ba, s ezek utn a megszokott mdon tudjuk lekrdezni, mdostani az adatbzis tartalmt. Ne felejtsk el, hogy ebben az esetben a connection stringet a hagyomnyost isostore rtkre kell visszalltanunk:
MyMusic db = new MyMusic("isostore:/MyMusic.sdf");

Lthattuk, hogy milyen lpseket kell megtennnk ahhoz, hogy mr meglv adatbzist hasznljunk fel a Windows Phone 7 kszlknkn. Br ez a mdszer nem teljesen tmogatott, mgis nagyon sokszor hasznos lehet. Ha csak olvashat adatbzist akarunk hasznlni, akkor egyszeren csak hozzadjuk az adatbzist s az legenerl egy forrsfjlt a projektnkhz, ha azonban mdostani is szeretnnk, akkor egy segdmetdust is definilnunk kell az adatbzist mozgatshoz. Az adatbzisunk mg res, itt az ideje megismerkedni azzal, hogy hogyan tltsk fel az adatbzist adatokkal, s hogy hogyan krdezzk le azokat!

Adatok felvitele INSERT


A Linq To SQL hasznlata sorn nem kell INSERT SQL Scriptet rnunk, mint a T-SQL-nl! Egyszeren csak annyi a dolgunk, hogy pldnyostjuk a megfelel entits osztlyt, s a tulajdonsgait feltltjk a kvnt rtkekkel, majd ezt az osztlypldnyt tadjuk az InsertOnSubmit metdusnak. Az adatbzisban mindaddig nem kerl az j rekord letrolsra, amg a SubmitChanges metdust meg nem hvjuk:
Customer myCust = new Customer() { CustomerID = 1, CompanyName = "Livesoft", ContactName = "Attila Turoczy", City = "Budapest" }; db.Customers.InsertOnSubmit(myCust); db.SubmitChanges();

Adatok lekrdezse SELECT


Az adatok lekrdezshez is a Linq To SQL-t hvjuk segtsgl. A lekrdezsek szintaktikja nagyon egyszer: akr Linq szintakszis hasznlatval, akr bvt metdusokkal le tudjuk krdezni az adatainkat. Nzznk nhny lekrdezst! A kvetkezkben mindkt lekrdezsi formt bemutatjuk. Az sszes adat lekrdezse:
var result = from c in db.Customers select c; ----------------------------------------------------------------------------------------var result = db.Customers.Select(s => s);

210

Loklis adatbzisok hasznlata Windows Phone 7-en Egy oszlop lekrdezse:


var result = from c in db.Customers select c.CompanyName; ----------------------------------------------------------------------------------------var result = db.Customers.Select(s => s.CompanyName);

Ha az eredmnyhalmazt szkteni szeretnnk, akkor egy where felttelt kell meghatroznunk:


var result = from c in db.Customers where c.City == "Budapest" select c; ----------------------------------------------------------------------------------------var result = db.Customers.Where(s => s.City == "Budapest");

Sorbarendezs:
var result = from c in db.Customers orderby c.City select c; ----------------------------------------------------------------------------------------var result = db.Customers.OrderBy(s => s.City);

Lthat, hogy a szintaktika logikusan felptett, hasznlata nagyon egyszer.

Adatok mdostsa UPDATE


Ha frissteni szeretnnk az adatbzis tartalmt, akkor is nagyon egyszer dolgunk van: csakgy, mint korbban, itt sem kell SQL Script-eket rnunk, mindssze annyi a dolgunk, hogy a lekrdezett adatok tulajdonsgt trjuk a megfelel rtkre, majd meghvjuk a SubmitChanges metdust. Az albbi pldban lekrdezzk az sszes gyfelnket, majd minden gyfelnk vrost trjuk Seattle-re, s a vgn meghvjuk a SubmitChanges metdust:
var result = from c in db.Customers select c; foreach (var item in result) { item.City = "Seattle"; } db.SubmitChanges();

Adatok trlse DELETE


Ha az adatbzisunkbl szeretnnk trlni adatokat, az is rendkvl egyszeren kivitelezhet. Vlasszuk ki azt az rekordot (objektumot), amit trlni szeretnnk, adjuk t paramterl a DeletOnSubmit metdusnak, s hvjuk meg a SubmitChanges-t!
var selectedItem = (from c in db.Customers where c.CustomerID == 1 select c).First(); db.Customers.DeleteOnSubmit(selectedItem); db.SubmitChanges();

211

8. Adatkezels

Az adatbzis biztonsga
A loklis adatbzis lehetsget biztost arra, hogy az adatbzis tartalma titkostva legyen, s azt csak jelszval tudjuk elrni. Ha az adatbzis titkostott, csak jelszval rhetjk el. Ezt a jelszt a connection string-ben kell tadnunk! Az adatbzis titkostshoz AES-128, mg a jelszhoz az SHA-256 titkostsi eljrst hasznlja a rendszer. Az albbi pldban lthat, hogyan hozzunk ltre egy biztonsgos adatbzist:
CustomerDataContext db = new CustomerDataContext("Data Source='isostore:/Customer.sdf';Password='Pa$$word1'"); if (!db.DatabaseExists()) { db.CreateDatabase(); }

Adatbzis kezels gyakorlat


A kvetkez gyakorlatban egy mini bevsrllista alkalmazst fogunk elkszteni. Az alkalmazs felhasznl fellete mr elre el van ksztve (8-17 bra), neknk csak az adatbzist kell megterveznnk, illetve a lekrdezseket megrni. A kiindul projektet a http://devportal.hu/wp7 oldalrl tlthetjk le.

8-17 bra: A bevsrl alkalmazs egy kpernyje 1. Indtsuk el a Visual Studio 2010-et s tltsk be a LocalDatabaseDemo.sln fjlt! 2. Nyissuk meg a ShopItem.cs fjlt az Entities mappn bell, majd oldjuk fel a System.Data.Linq.Mapping nvteret!
using System.Data.Linq.Mapping;

3. A ShopItem osztly defincijt lssuk el a [Table] attribtummal!


[Table] public class ShopItem {

4. Meg kell hatroznunk, hogy milyen oszlopokkal szeretnnk dolgozni. A ShopItem trzst a kvetkez mdon alaktsuk ki:
[Column(IsPrimaryKey=true, IsDbGenerated=true)] public int Id { get; set; } [Column] public string Title { get; set; }

212

Loklis adatbzisok hasznlata Windows Phone 7-en

[Column] public int Price { get; set; } [Column] public bool IsBought { get; set; }

A Title tulajdonsgban troljuk el a vsrolni kvnt termk nevt, a Price tulajdonsgban a termk hozzvetleges rt, mg az IsBought azt mutatja, hogy az adott termket megvettk-e mr. Lthat, hogy a tulajdonsgok mindegyikt egy [Column] attribtummal lttuk el. Specilis eset az Id tulajdonsg, ugyanis nemcsak azt jelljk, hogy ez egy oszlop, hanem azt is, hogy ez egyttal egy olyan elsdleges kulcs, amely rtkt az adatbzis fogja ellltani. Ezzel ksz az entitsosztly defincija. 5. Ltre kell hoznunk egy DataContextet is, hogy az adatbzishoz tudjunk kapcsoldni. Nyissuk meg a ShopDataContext.cs fjlt, majd oldjuk fel a System.Data.Linq nvteret!
using System.Data.Linq;

6. A ShopDataContext osztlyt szrmaztassuk le a DataContext osztlybl!


public class ShopDataContext : DataContext {

7. A ShopDataContext kdjt pedig a kvetkezkppen rjuk meg:


private Table<ShopItem> shopItem; public Table<ShopItem> ShopItem { get { return shopItem; } } public ShopDataContext(string connectionString) : base(connectionString) { this.shopItem = GetTable<ShopItem>(); }

8. Nyissuk meg az App.xaml.cs fjlt, s az Application_Startup metdusban hozzuk ltre az adatbzisunkat a CreateDatabase metdus segtsgvel! Abban az esetben, ha mr ltezik az adatbzis, nem trtnik semmi.
ShopDataContext db = new ShopDataContext("isostore:/shop.sdf"); if (!db.DatabaseExists()) { db.CreateDatabase(); }

9. Mr elkszlt az adatbzisunk, de mg res. Tltsk fel adatokkal! Nyissuk meg a Pages mappa NewShopItem.xaml.cs fjljt, s navigljunk el a save_Click esemnyhez, majd adjuk hozz az albbi kdsorokat:
try { ShopDataContext db = new ShopDataContext("isostore:/shop.sdf"); ShopItem shopItem = new ShopItem() { Title = txtTitle.Text, Price = Convert.ToInt32(txtPrice.Text) };

213

8. Adatkezels

db.ShopItem.InsertOnSubmit(shopItem); db.SubmitChanges(); NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); } catch (Exception ex) { MessageBox.Show("Hiba: " + ex.Message, "Hiba!", MessageBoxButton.OK); }

Itt egy ShopDataContext-et pldnyostunk, aminek megadunk egy connection string-et (ezt globlisan is megtehetnnk). Ezt kveten egy ShopItem pldnyt hozunk ltre, amely tulajdonsgainak az rtkeit a felhasznli felleti hozz tartoz elemei hatrozzk meg. Ha ez megvan, meghvjuk az InsertOnSubmit metdust, majd a SubmitChanges metdussal eltroljuk az adatbzisba. Ezt kveten visszanaviglunk az eredeti oldalra. Nem tltttk ki az IsBought tulajdonsg rtkt, gy az alaprtelmezett rtke a false lesz, azaz mg nem vsroltuk meg az adott termket. 10. Itt az ideje megjelenteni az adatainkat. A konstruktor eltt most hozzunk ltre egy ShopDataContext pldnyt! (Task 9)
ShopDataContext db = new ShopDataContext("isostore:/shop.sdf");

11. Navigljunk el a GetData metdusba, s krdezzk le azokat a termkeket az adatbzisbl, amiket mg nem vettnk meg!
lstShopItems.DataContext = from c in db.ShopItem where c.IsBought == false select c;

12. Azrt, hogy lssuk, hogy mennyivel tud tbbet a Linq, fejlesszk tovbb a GetData metdust: egy felttelben vizsgljuk meg, hogy hny darab olyan termknk van, amit nem vettnk mg meg! Ha ennek az rtke nagyobb, mint nulla, akkor megvizsgljuk azt is, hogy a kivlasztott termkeknek mennyi a teljes ra:
if (db.ShopItem.Where(s => s.IsBought == false).Count() > 0) { txtSum.Text = String.Format("{0} Ft", db.ShopItem .Where(s => s.IsBought == false).Sum(s => s.Price)); } else { txtSum.Text = "0 Ft"; }

13. Mr csak egy lps maradt htra, mgpedig az, hogy ha vsrolunk valamit a listrl, akkor kihzzuk azokat a termkeket, amelyeket mr betettnk a kosrba. Ehhez navigljunk el a btnCheck_Click esemnyhez s rjuk be a kvetkezt:
int selectedIndex = Convert.ToInt32((e.OriginalSource as Button).Content.ToString()); var selectedItem = (from c in db.ShopItem where c.Id == selectedIndex select c).FirstOrDefault();

214

sszefoglals

if (selectedItem != null) { selectedItem.IsBought = true; db.SubmitChanges(); } GetData();

Els lpsben lekrdezzk a termket reprezentl gomb tartalmt. Az ugyan nem jelenik meg a felhasznli felleten, de a httrben bele van rva az adott termk azonostja (Id tulajdonsg). Ezutn lekrdezzk az adott azonostj termket az adatbzisbl. A Linq kifejezs vgn egy FirstOrDefault bvt metdus ll, amely az els elemet veszi ki a visszaadott eredmny gyjtemnybl. Abban az esetben, ha nincs ilyen azonostj elem, akkor az objektum alaprtelmezett rtkvel tr vissza. Ha ez az rtk nem null, akkor az IsBought tulajdonsgot true rtkre lltjuk, majd meghvjuk a SubmitChanges metdust. Az egyszersg kedvrt ezt kveten meghvjuk a GetData metdust, amivel jra lekrdezzk az sszes nem megvsrolt termket s az ezekhez tartoz sszeget. 14. Elkszlt az alkalmazsunk. Indtsuk el, s nzzk meg, hogy hogyan mkdik! Kattintsunk az j ( + ) gombra, s adjunk hozz egy j termket! Amikor a ments gombra kattintunk, akkor az adatokat elmentjk az adatbzisba. Ezt kveten a fkpernyn talljuk magunkat, ahol az elzleg felvitt termkek lthatak. Vigynk fel mg nhny elemet, majd kattintsunk a termkek neve melletti pipra! Miutn rnyomtunk, az adott elem kikerl a listbl, s az sszesen rtke is a kipiplt elem rtkvel cskken. Abban az esetben, ha ez a folyamat mgse gy trtnne, nzzk t jra a lpseket, s a hibkat javtsuk!

sszefoglals
Ebben a fejezetben megnztk, hogy hogyan is kell a Windows Phone 7 alkalmazsokban adatot kezelni: hogyan kell adatokat lementeni, belltsokat eltrolni, valamint hogyan lehet az adatokat egy relcis adatbzisban eltrolni. Lthattuk, hogy a Windows Phone 7 kszlkeken is a .NET-ben megszokott, letisztult megoldsokat kapjuk. Ahogyan Silverlight alatt is van Isolated Storage, itt elrhet a Linq To SQL technolgia.

215

9. Kommunikci szerverrel
A telefonok hardvere robbansszeren fejldik. A Microsoft ktelezen elrta, hogy minden Windows Phone opercis rendszert futtat kszlknek legalbb 256 megabjt memrival s 1 GHz krli processzorral kell rendelkeznie. Ez azt jelenti, hogy a telefonok nagysgrendileg olyan ersek, mint egy netbook. A legslyosabb korltozst viszont nem is a szmtsi kapacits adja, hanem az akkumultor: ritka, hogy egy rendszeresen hasznlt okostelefon 1-2 napnl tovbb brja jratlts nlkl. Ezrt nagyon fontos sprolnunk az akkumultor kapacitsval, aminek legjobb mdja, hogy a szmtsignyesebb feladatokat kiszervezzk clszeren szerveroldalra. Egy msik ilyen lnyeges trend a kzssgi mdia rohamos terjedse. Legyen sz szinte brmilyen alkalmazsrl, a felhasznlk elvrjk a tbbi felhasznlval, kzponti adatbzissal val kapcsolat lehetsgt. Ezenfell pp napjainkban lehetnk tani a szmtsi felh trhdtsnak. A felh segtsgvel percek alatt, olcsn, rugalmasan juthatunk szmtsi kapacitshoz, trhelyhez vagy pp adatbzishoz. Fontos teht, hogy Windows Phone alkalmazsunk kommuniklhasson kls szerverekkel. A platform ehhez gazdag tmogatst nyjt. A fejezetben ennek klnfle lehetsgeit ismerjk meg.

A kommunikci mdjai
A legfontosabb kommunikcis mdszerek egy alkalmazs fejlesztse sorn: Webszolgltatsok: A webfejleszts vilgban rgta bevett technolgia. A webszolgltatsok segtsgvel szervernk kiajnlhat egy mveletet, amelynek megadja a nevt, paramtereit s visszatrsi rtkt (pl. string GetName(int userId)). Egy sor szabvnyos technolgia segtsgvel kliensnk (ez esetben a telefon) ezt a metdust ugyangy hvhatja meg, mintha egy helyben, a telefonalkalmazsunkban lv mveletrl lenne sz. gy a webszolgltatsokat knnyen alkalmazhatjuk, s a tvoli szervert alkalmazsunk szerves rszeknt hasznlhatjuk. Webes tartalom kzvetlen elrse: Az internet tartalmnak tlnyom rsze HTML, s fjlok kpben rhet el. Remek plda erre az RSS feed. Ez egy szles krben elterjedt formtum, amivel idben gyorsan vltoz hreket rhatunk le, gy az adott hrforrst szabvnyos mdon olvashatjuk mikzben a hrportl honlapja termszetesen lehet brmilyen egyedi. Windows Phone alkalmazsaink brmilyen internetes tartalmat letlthetnek, feldolgozhatnak, legyen sz RSS feedekrl, HTML oldalakrl vagy brmilyen ms fjlrl. Adatbzis-elrs: a Windows Phone 7.5 (Mango) mr tartalmaz kzvetlenl a telefonon fut SQL adatbzist. Ennek kapacitsa termszetesen szks, s nem alkalmas egy komolyabb alkalmazs (mondjuk egy raktrkezel) kzponti adatbzisnak, hiszen a tbbi telefonon fut alkalmazspldny nem fr hozz. Ilyen esetekben egy kzponti szerveren fut adatbzist clszer ignybe venni. Ennek elrst megoldhatnnk egy sor egynileg fejlesztett webszolgltatssal (rs, olvass, trls minden egyes tblra), de ezzel nem kell fradnunk. Az OData szabvny segtsgvel rengeteg adatforrst tudunk manipullni a fejleszt szmra egyszer mdon. Az SQL Server, a SharePoint, valamint szmos tovbbi Microsoft s kls fejlesztk ltal ksztett program s webes alkalmazs is hasznlhat OData kiszolglknt. Ezek mindegyikhez csatlakozhatunk telefonalkalmazsainkbl. Felhasznl-hitelests: Ha internetre csatlakoz alkalmazst runk, akkor hatatlanul felmerl a felhasznl bejelentkeztetsnek krdse. Webszolgltatsok segtsgvel termszetesen rhatunk sajt hitelestsi mechanizmust, de ez neknk s felhasznlinknak is knyelmetlen. Neknk azrt, mert sokat kell kdolnunk, s utna biztonsgi szempontbl

217

9. Kommunikci szerverrel kritikus infrastruktrt kell zemeltetnnk. A felhasznlinknak pedig azrt, mert mg egy nv/jelsz prost kell megjegyeznik. Ennl van jobb megolds is: a Windows Azure egyik szolgltatst kihasznlva pldul felhasznlink meglv Live ID, Google, Facebook vagy Yahoo fikjukkal jelentkezhetnek be alkalmazsunkba. Adattrols: Az OData segtsgvel knnyedn trolhatunk adatsorokat, de a rekordok mellett gyakran fjlokat is el kell mentennk. Ilyen lehet pldul a felhasznl ltal feltlttt fnykpalbum, vide vagy dokumentum. Sajt szerverrel s webszolgltatssal termszetesen ez is megoldhat, de a platform erre is nyjt ksz megoldst. Egy osztlyknyvtr segtsgvel kzvetlenl a telefonrl rhatjuk s olvashatjuk a Windows Azure trhelyszolgltatst.

A fentiek segtsgvel szinte brmilyen kommunikcis ignynek meg tudunk felelni. A fejezet sorn a fentiek kzl mindegyiket rszletesen megismerjk. A Windows Phone platform ezenkvl nhny egyedi telefon-szerver kommunikcis funkcit is biztost. Ezekrl a specilis funkcikrl a knyv tovbbi fejezeteiben lehet olvasni: Maps: Telefonalkalmazsunkba bepthetnk trkp-vezrlt. Termszetesen nem troldik a teljes vilgtrkp a telefon memrijban, az pp megnzett terlet a Bing Maps szolgltatsbl tltdik le. A Maps vezrlelemrl s kpessgeirl a 4. fejezetben van bvebben sz. Push Notifications: A Windows Phone platform kulcsfontossg elemt alkotjk a telefon kezdkpernyjn lthat lapkk, melyek szerveroldalrl is frissthetk anlkl, hogy alkalmazsunknak futnia kellene. Ezekrl a 10. fejezetben tallhat rszletes lers.

Webszolgltatsok hasznlata
A webszolgltatsok mkdse
Amint a bevezetben mr volt rla sz, egy webszolgltats nem ms, mint egy szerveren lv metdus, amit az interneten keresztl is meghvhatunk. Ennek mkdshez persze egy sor technolgia kell. Ezek fordtjk le az internet fell berkez krst a metdust futtat programnyelv szmra rtelmezhet formra, s ezek kldik aztn vissza a metdus futsi eredmnyt a krnek. A .NET-vilgban erre a Windows Communication Foundation-t (WCF) hasznljuk, de minden ms szerveroldali technolgia is ad lehetsget webszolgltatsok ksztsre. A fejleszts sorn a programoz elszr meghatrozza, hogy milyen metdusokat szeretne kiajnlani, majd elkszti a szolgltatst. Ilyenkor tbbnyire (a hasznlt technolgitl fggen) egy XML formtum ler fjl jn ltre. Az ebben kzztett informci tartalmazza a metdus visszatrsi rtkt, nevt s elvrt paramtereit (a bevezetben ltott plda: string GetName(int userId)). Ezutn a kliensoldalon az ottani fejlesztkrnyezet szmra megadjuk ezt a ler fjlt. A fejlesztkrnyezet ebbl egy gynevezett proxy osztlyt generl. Ez az osztly mr a kliensoldalon hasznlt programnyelvben (pl. C#-ban) kszl, s tartalmazza a lerfjlban tallhat sszes metdust. A kliensoldali programkdunkbl ezeket a metdusokat tudjuk hasznlni. Ha valamelyiket meghvjuk, akkor a proxy osztly generlt kdja elkldi krsnket az interneten keresztl, s befogadja a szervertl kapott vlaszt. Mindez azt jelenti, hogy a webszolgltatsok komplex internetes kdjval egyltaln nem kell bajldnunk az oda-vissza fordtst (az angol plumbing sz magyar fordtsvalvzvezetk-szerelst) elvgzi helyettnk a fejlesztkrnyezet. Amint lttuk, a webszolgltats meghvsakor a httrben valjban kt mvelet trtnik: a proxy osztly egyrszt elkld egy krst, msrszt megvrja s lefordtja a vlaszt. Kdunk szemszgbl mindez tnhet szinkron vagy aszinkron mveletnek. Ha a proxy osztly szinkron mkds, akkor a kt httrmveletet egy egysgknt kezeli, azaz miutn meghvtuk a proxy osztly valamelyik metdust, kdunk addig nem is halad tovbb, amg a httrben trtn mveletek be nem fejezdtek. Ez programozi szempontbl egyszer, m a felhasznli lmnyt

218

Webszolgltatsok hasznlata ronthatja. A webszolgltats meghvsa s vlasza kztt (akr a szerver terheltsge, akr az internetkapcsolat lasssga miatt) nha msodpercek is eltelhetnek, s az alkalmazsunk ezalatt lefagyottnak tnhet. Ezt elkerlend a Windows Phone ltal generlt proxy osztlyok csak aszinkron mkdsek lehetnek, azaz a krs elkldst s a vlasz megrkezst klnvlasztjk. Amikor meghvjuk a proxy valamelyik metdust, fel kell iratkoznunk a vlaszra. A vlasz megrkezsekor az ltalunk megadott esemnykezel fut majd le, s gy tudjuk folytatni programunk mkdst. Mivel kdunkat emiatt szt kell darabolnunk, fejleszti szempontbl ez kicsit knyelmetlenebb, de a felhasznli lmnynek nagyon jt tesz. J hr, hogy a C# nyelv 5-s, ezen sorok rsakor fejleszts alatt ll verzijban szerepelni fog az async kulcssz, ami nagyon megknnyti majd az aszinkron mveletekkel val programozst.

Webszolgltats egy mintaalkalmazsban


rjunk egy Windows Phone alkalmazst, ami egy webszolgltatst hv meg! Kezdjk a webszolgltatssal! Ehhez kell majd egy webfejlesztsre alkalmas Visual Studio verzi. Ha a Visual C# Express van a gpnkn a Windows Phone fejlesztshez, akkor szksgnk lesz az ingyenes Visual Web Developer Express vltozatra is. Ha viszont a Visual Studio valamelyik fizets verzijt hasznljuk, akkor az alkalmas lesz mindkt tpus fejlesztsre. Hozzunk ltre egy ASP.NET Empty Web Application tpus j projektet, s nevezzk ezt el WebServiceServerSample-nek! A projekt ltrejttekor res. Hozzunk ltre benne egy j webszolgltatst! Ehhez vegynk fel a projektbe egy WCF Service tpus elemet SampleService nven! A listban (lsd 9-1 bra) lthatunk egy Web Service-nek keresztelt elemet is. Ez egy ASMX kiterjeszts fjlt hoz ltre, s ma mr egy elz genercis technolgit kpvisel. Mi a WCF-et hasznljuk majd, ami az aktulis webszolgltats-fejleszt eszkz a .NET Frameworkn bell.

9-1 bra: A webszolgltats hozzadsa A szolgltats hozzadsa utn hrom elem is ltrejn projektnkben: az ISampleService.cs kdfjl, a SampleService.svc lerfjl s az ehhez tartoz SampleService.svc.cs kdfjl. Mindhrom elemnek fontos szerepe van a webszolgltats ltrehozsban. Az ISampleService.cs llomnyban kell definilnunk a kiajnlani kvnt metdusokat; ez csak egy interfszt ad majd, a tnyleges kd nem ide kerl. A SampleService.svc jelenleg egy sorbl ll, de futsidben ezt a fjlt kell majd meghvni kvlrl

219

9. Kommunikci szerverrel a szolgltats elrshez, mert ezen a nven generlja majd a futtatkrnyezet a korbban mr trgyalt lerfjlt. Vgl a SampleService.svc.cs-be kerl az ISampleService.cs-ben deklarlt metdusok tnyleges kdja. (Az ISampleService.cs nem ltfontossg, e fjl nlkl is mkdhet a szolgltats, de itt nem trgyalt WCF konfigurcis okok miatt clszer hasznlni.) Egy egyszer fordtsi szolgltatst ksztnk: a telefonalkalmazs felkld egy szt, mi pedig visszakldjk azt angolul. Bemutat alkalmazsrl lvn sz, sztrunk mindssze kt szt tartalmaz majd. Az ehhez szksges metdus egy string vltozt vr, s egy string vltozt is ad vissza. Ahhoz, hogy megrhassuk, elszr deklarlnunk kell az ISampleService.cs interfszben. A fjlt megnyitva lthatjuk, hogy egy void DoWork() nev metdus mr ltezik, ami egy [OperationContract] attribtummal van elltva. Az attribtum nagyon fontos, ez tudatja a futtatkrnyezettel, hogy a metdust meg szabad hvni az internet fell is (azaz ki kell kerlnie a lerfjlba). Nevezzk t ezt a metdust az ltalunk kvntra!
[OperationContract] string Translate(string input);

Most rjuk meg a metdushoz tartoz kdot! Ehhez nyissuk meg a SampleService.svc.cs fjlt! Itt szintn ltjuk majd a DoWork() metdust (ezttal mr attribtum nlkl). Trljk ki, s helyettestsk az albbi kddal!
public string Translate(string input) { if (input == "alma") { return "apple"; } else if (input == "szilva") { return "plum"; } else { return "(ismeretlen)"; } }

Ezzel a szerveroldallal gyakorlatilag el is kszltnk. Teszteljk mkdst! Az F5-tel indtsuk el alkalmazsunkat! Ennek hatsra elindul egy helyi gpnkn fut, egyszer, kifejezetten fejlesztsre val webszerver. Belltstl fggen ez vagy az ASP.NET Development Server (Cassini) lesz, vagy az IIS Express. Nhny msodpercen bell megnylik az alaprtelmezett bngsznk, s a 9-2 brhoz hasonl weboldal trul elnk. Ez igazolja, hogy webszolgltatsunk sikeresen lefordult, meghvhat.

220

Webszolgltatsok hasznlata

9-2 bra: A fejleszti szerverbl kiszolglt webszolgltats Ha egy res oldalt vagy valamilyen hibazenetet ltunk, akkor ellenrizzk az URL-t! A localhost nevet kvet portszm vletlenszeren generlt, s minden gpen ms lesz. A /SampleService.svc elrsi tnak viszont szerepelnie kell; ha nincs ott, kzzel rjuk be! Az URL-t jegyezzk meg, ksbb mg szksg lesz r! A fent lertak gyakorlatilag vltoztats nlkl mkdnek akkor is, ha a szerveroldalon Windows Azure-t hasznlunk. Most trjnk t a kliensoldalra, s rjuk meg a szervert meghv Windows Phone alkalmazst! Ehhez nyissunk egy j Visual Studio projektet, amely legyen Windows Phone Application tpus, neve pedig WebServiceClientSample! A projekt ltrehozst kveten a Visual Studio megkrdezi majd, hogy a telefon melyik verzijhoz ksztjk a projektet. Vlasszuk a Windows Phone OS 7.1 (vagy valamelyik jabb) vltozatot! Ahhoz, hogy hasznlhassuk a webszolgltatst, fel kell r vennnk egy referencit. E mvelet sorn olvassa majd be a Visual Studio a szervernk ltal publiklt ler llomnyt, s kszti el a bevezetben emltett proxy osztlyt. Referencia felvtelhez kattintsunk jobb gombbal a projekt nevre (WebServiceClientSample) a Solution Explorer ablakban, s vlasszuk az Add Service Reference menpontot! A megjelen prbeszdpanel tetejre rjuk be a korbban kimsolt URL-t, majd kattintsunk a Go gombra! (Fontos, hogy webes projektnknek mg futnia kell!) A Visual Studio letlti s feldolgozza a megclzott webszolgltats adatait, majd a prbeszdpanel kzepn tallhat terleten megjelenti az ltala tmogatott metdusokat (lsd 9-3 bra). Jelenleg egy ilyet tartalmaz a webszolgltatsunk: az imnt megrt Translate() metdust. Adjunk egy nevet a referencinak (SampleServiceReference), s kattintsunk az OK gombra!

221

9. Kommunikci szerverrel

9-3 bra: A Service Reference-hozzad ablak A Visual Studio legenerlja a proxy osztlyt, s tulajdonsgait elhelyezi egy j fjlban. Ezt ServiceReferences.ClientConfig nven talljuk meg projektnkben. Ha alkalmazsunkat lesben szeretnnk felhasznlni, akkor ebben az llomnyban kell trni a webszolgltats URL-jt a vgleges cmre. Hozzuk ltre programunk felhasznli fellett! Ehhez helyezznk ki egy szvegdobozt s egy gombot a tervezfelletre! A szvegdoboz neve legyen MessageTextBox, a gomb neve pedig legyen TranslateButton! Az igazn elegns megolds rdekben ezutn helyezznk el egy ProgressBart is (ez az a vezrlelem, ami a Windows Phone mozg pontjait generlja, amikor a telefon dolgozik valamin)! A ProgressBar nem lthat az eszkztron, ezrt kzzel kell hozzadnunk alkalmazsunk XAML kdjhoz. Keressk meg a XAML kdban a gombunkat ler sort (<Button>), s ez al szrjuk be az albbi kdot:
<ProgressBar Name="MainProgressBar" IsIndeterminate="True" Visibility="Collapsed"></ProgressBar>

Ezzel ltrehoztunk egy hatrozatlan futs ProgressBart (azaz nem kell megadnunk, hogy pp hny szzalkon ll, elg csak ki-be kapcsolnunk), amely MainProgressBar nvre hallgat s alaprtelmezsknt nem lthat. Most kattintsunk dupln a gombra, hogy belpjnk a Click esemnykezeljbe! Kdunknak meg kell hvnia a webszolgltatst, de amint korbban mr sz volt rla, a webszolgltats aszinkron. Ezrt meghvshoz elszr feliratkozunk arra az esemnyre, ami a krs befejezst jelzi majd, aztn tnylegesen elkldjk a krst. Ezenfell, hogy a felhasznl fel jelezhessk a httrben zajl munkt, bekapcsoljuk a ProgressBar-t:
private void TranslateButton_Click(object sender, RoutedEventArgs e) { SampleServiceReference.SampleServiceClient client = new SampleServiceReference.SampleServiceClient(); client.TranslateCompleted += new EventHandler<SampleServiceReference.TranslateCompletedEventArgs>( client_TranslateCompleted);

222

Webszolgltatsok hasznlata

client.TranslateAsync(MessageTextBox.Text); MainProgressBar.Visibility = Visibility.Visible; }

A krs befejezsekor lefut az esemnykezel. Ez mindssze annyit tesz, hogy megjelenti a webszolgltatstl kapott vlaszt. Mivel a szolgltats meghvsa az interneten keresztl trtnik, fel kell kszlnnk az esetleges hibkra! Ha hiba trtnik, akkor nem hagyjuk programunkat lefagyni, hanem kezeljk a hibt, s megjelentjk azt a felhasznl szmra.
void client_TranslateCompleted(object sender, SampleServiceReference.TranslateCompletedEventArgs e) { MainProgressBar.Visibility = Visibility.Collapsed; if (e.Error != null) { MessageBox.Show(e.Error.ToString()); } else { MessageBox.Show(e.Result); } }

Ezzel elkszltnk a mintaalkalmazssal. Teszteljk le! Indtsuk be a telefonalkalmazst (s gyzdjnk meg rla, hogy a webalkalmazs mg mindig fut-e)! rjunk be egy magyar szt (legyen alma vagy szilva)! Ltni fogjuk, hogy alkalmazsunk elindtja a krst, megjelenti a ProgressBar-t, majd kisvrtatva megkapja s megjelenti a vlaszt (lsd pl 9-4 bra).

9-4 bra: A vgrehajtott webszolgltats-hvs eredmnye Ezzel megismertk egy j webszolgltats ltrehozst. Ha ez ksbb vltozik, akkor a proxy osztlyt is frisstennk kell. Ehhez kattintsunk jobb gombbal a ltrejtt referencira, s vlasszuk az Update Service Reference menpontot! A webszolgltatsok segtsgvel lnyegben tetszleges kommunikcit lebonyolthatunk telefonunk s egy szerver kztt. Nemcsak a primitv adattpusok, hanem komplex vltozk is hasznlhatk a kommunikci sorn. Ilyen pldul egy generikus lista (List<string>), egy tmb (int[]), egy sajt magunk ltal ltrehozott adattpus (Employee) vagy szinte brmi ms. Lnyeg, hogy az tkldeni kvnt objektumnak sorosthatnak kell lennie. A legtbb .NET adattpus ilyen, a sajt osztlyainkat pedig mindssze el kell ltnunk a [Serializable] attribtummal. Ez a technolgia egy risi tmakr, melynek most csak a felsznt karcolgattuk. Az itt lertak mr elegendek egyszer kliens-szerver kommunikci ltrehozshoz. Aki ennl jobban szeretne elmlyedni a webszolgltatsok hasznlatban, annak gazdag Windows Communication Foundation irodalom ll a rendelkezsre.

223

9. Kommunikci szerverrel

Webes tartalom letltse


A webszolgltatsok kivl eszkzt nyjtanak a sajt szervernkkel val kommunikcira. Gyakran elfordul azonban, hogy nem a sajt szervernktl szeretnnk lekrni valamit, hanem az interneten keresztl akarunk letlteni egy llomnyt. Ilyen lehet pldul egy kp, egy HTML oldal vagy valamilyen fjl. Ezeket az interneten hasznlt HTTP protokoll segtsgvel tudjuk elrni. Ebben az alfejezetben az erre alkalmas mdszereket ismerjk meg. Alapveten kt, HTTP kommunikcira kitallt osztly ltezik a Windows Phone platformban: a HttpWebRequest/HttpWebResponse pros, illetve a WebClient osztly. Ezek az osztlyok nem telefonspecifikusak, gy egyb .NET-es tapasztalatainkbl mr ismersek lehetnek. A WebClient gyakorlatilag nem ms, mint egy absztrakcis rteg a HttpWebRequest/HttpWebResponse felett. Egyszerbb feladatokra rdemes a WebClient-et hasznlni, ha pedig pontosabb irnytsra van szksgnk, alkalmazhatjuk a HttpWebRequest/HttpWebResponse osztlyokat. Kezdjk mkdsk megismerst az alacsonyabb szint HttpWebRequest/HttpWebResponse prossal! Ezek segtsgvel az example.com weboldalt fogjuk majd letlteni s megjelenteni. Az elz alfejezethez hasonlan most is egy pldaalkalmazst ksztnk, mert taln ez a legjobb mdja a hasznlhat technikk megismersnek. Hozzunk ltre egy Windows Phone Application tpus projektet HttpSample nven, Windows Phone OS 7.1 vagy jabb verzival! Vegynk fel a felletre egy HttpButton nev gombot, HttpWebRequest felirattal, majd dupla kattintssal lpjnk be a Click esemnykezelbe! Ahogy a webszolgltatsoknl, itt is kizrlag aszinkron metdusokat hasznlhatunk. Ennek oka is hasonl: egy letlts tbb msodpercet is ignybe vehet, az alkalmazsnak ez id alatt nem szabad lefagyottnak tnnie. A konkrt kd azonban kiss mskppen nz ki, mint a webszolgltatsok esetben. Ott feliratkoztunk a mvelet befejezsnek esemnyre, amit egy esemnykezelvel kaptunk el. A HttpWebRequest-nl ezzel szemben elszr ltrehozunk egy HttpWebRequest tpus osztlyt, majd egy metdushvssal kzljk, hogy szksgnk lenne a HTTP vlaszra. Ezen metdushvsban tadunk egy gynevezett callback fggvnyt ezt hvja majd meg a futtatkrnyezet, ha a vlasz berkezett. Emellett egy msik paramterben egy tetszleges objektumot adhatunk meg, ezt az objektumot a meghvott callback fggvny is megkapja, vagyis azt brmilyen llapot-informci tadsra is hasznlhatjuk. A ltrehozott HttpWebRequest pldnynak mindenkppen szerepelnie kell benne, mert ettl a pldnytl tudjuk majd elkrni a berkezett HTTP vlaszt. rjuk meg a gomb Click esemnykezeljt az albbiaknak megfelelen:
private void HttpButton_Click(object sender, RoutedEventArgs e) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.example.com"); request.BeginGetResponse(RequestCallback, request); }

Most ksztsk el a RequestCallback nev metdust, amire hivatkoztunk! A logika kiss nyakatekert. Elszr is kicsomagoljuk a HttpWebRequest pldnyt, amit tadtunk a callback metdusnak. Utna ezen a pldnyon meghvjuk az EndGetResponse() metdust, amely egy HttpWebResponse pldnyt hoz ltre. Ez tartalmazza a berkezett HTTP vlaszt. Azonban a HttpWebResponse pldnyban nem stringknt szerepel a megkapott weboldal, hanem egy Stream-knt, gy ezt az adatfolyamot mg ki kell olvasnunk egy string vltozba. Miutn ezzel elkszltnk, a megkapott vlasz els 50 karaktert kiratjuk a felhasznl szmra egy zenetdobozban. A Stream vltoz string vltozba olvasshoz szksgnk lesz a System.IO nvtrre, ezrt helyezzk az albbi sort a kdfjl legtetejre:

224

Webes tartalom letltse

using System.IO;

Az albbiakat pedig gpeljk be a Click esemnykezel al:


private void RequestCallback(IAsyncResult ar) { HttpWebRequest request = (HttpWebRequest)ar.AsyncState; HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar); string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); Dispatcher.BeginInvoke(() => { MessageBox.Show(responseString.Substring(0, 50)); }); }

Elkszltnk. Teszteljk alkalmazsunkat! Egyszeren indtsuk el az F5 gomb segtsgvel, majd kattintsunk a HttpWebRequest gombra! Nhny msodperc elteltvel berkezik a HTTP vlasz, programunk ezt beolvassa memriba, majd kiratja az els 50 karaktert (9-5 bra).

9-5 bra: A berkezett HTTP vlasz els 50 karaktere A felhasznl nem rteslt arrl, hogy a program pp dolgozik. les alkalmazsban clszer lenne egy ProgressBar vezrlelem segtsgvel tjkoztatni errl. Ennek hasznlatt az elz fejezetrszben lthattuk, most az egyszersg kedvrt nem alkalmaztuk. Amint lthattuk, a HttpWebRequest/HttpWebResponse osztlyok hasznlata meglehetsen nyakatekert, de segtsgkkel alacsony szinten hozzfrnk a kommunikci rszleteihez. A WebClient osztly alkalmazsa ennl lnyegesen egyszerbb. Lssuk, hogy mkdik! Bvtsk ki alkalmazsunkat egy jabb gombbal! Ennek neve legyen WebClientButton, felirata pedig WebClient. Dupla kattintssal nyissuk meg Click esemnykezeljt! A WebClient osztly hasznlata szintn aszinkron trtnik, de ennek modellje megegyezik a webszolgltatsoknl mr ltottal. Egyszeren feliratkozunk a krs befejezdst jelz esemnyre, elindtjuk a krst, majd az esemnykezel paramterei kztt kszen megkapjuk a letlttt HTML oldalt egy string vltoz formjban. Ehhez az albbi kdra van szksgnk:
private void WebClientButton_Click(object sender, RoutedEventArgs e) { WebClient client = new WebClient(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); client.DownloadStringAsync(new Uri("http://www.example.com")); } void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { Dispatcher.BeginInvoke(() => {

225

9. Kommunikci szerverrel

MessageBox.Show(e.Result.Substring(0, 50)); }); }

Teszteljk ezt is! Ismt indtsuk be az alkalmazst, kattintsunk a WebClient gombra! Nhny msodperc elteltvel megjelenik a vlasz els 50 karaktere. A fenti kt pldban szveges informcit tltttnk le a webrl. Ha egy RSS feed-et vagy egy HTML oldalt szeretnnk lekrni telefonalkalmazsunkbl, ezt a mdszert kell hasznlnunk. Ha egy kpet vagy valamilyen ms fjlformtumot szeretnnk letlteni, azt is megtehetjk, de kicsit mshogy kell kiadnunk a krseket. A HttpWebRequest mr eleve egy Stream-et ad vissza; ezt tetszsnk szerinti objektumra konvertlhatjuk a memriban, vagy akr el is menthetjk a telefon Isolated Storage trhelyre. A WebClient-nl pedig ne a DownloadStringAsync() metdust hasznljuk, hanem az OpenReadAsync() metdust, amellyel szintn egy Stream-et kapunk vissza! Ezzel megismertk az internetrl val letlts mdszereit. Az egyszerbb, magtl rtetd WebClient hasznlata az esetek tbbsgben megfelel. Ha valamirt finoman hangolni szeretnnk a kimen HTTP krseket (pldul szksgnk van a HTTP fejlcekre is), akkor alkalmazzuk a HttpWebRequest/HttpWebResponse prost!

Adatelrs az OData protokollon keresztl


Az interneten vagy vllalatoknl szmos olyan szoftver tallhat, amitl adatrekordokat krhetnk le. Az adatbzis-motoroktl pldul a bennk trolt tblk sorait, a vllalati SharePoint-tl a klnfle dokumentumokat, az eBay.com-rl a megvsrolhat termkek katalgust, a Netflix online filmnz portlrl a filmek listjt tlthetjk le, s gy tovbb. Legyen sz brmilyen adatforrsrl, az adatokon alapveten ngy mveletet tudunk vgrehajtani: ltrehozs (Create), olvass (Read), frissts (Update), trls (Delete). Ezeket hvjk CRUD mveleteknek. Hiba adott azonban az elvgezhet mveletek kre, sokig ms s ms mdon tudtunk csak hozzfrni az egyes adatforrsokhoz alkalmazsainkbl. Ha a helyi SQL Servernket akartuk megcmezni, akkor ahhoz ADO.NET-et hasznltunk, a SharePoint-hoz klnfle osztlyknyvtrakkal frtnk hozz, mg ha az eBay katalgusra voltunk kvncsiak, akkor valamilyen RSS feed-et prbltunk letlteni. Az OData protokoll arra a gondolatra pl, hogy legyen sz brmilyen adatforrsrl, nem vltoznak a rajta elvgezhet mveletek. Az OData definil egy interfszt, amit az adatforrsok gazdi implementlhatnak. Aki ezt megteszi, annak adatait brmilyen platformrl egysges mdon lehet olvasni. gy a fejlesztknek nem kell ms s ms technolgival ksrleteznik, ha adatokat szeretnnek lekrdezni legyen sz akr adatbzisrl, akr internetes boltrl, akr egy vllalati projektrl, az adatelrs ugyanazon a szabvnyos mdon mkdhet. Az OData elrsai szerint az adatforrsnak HTTP krseket kell fogadnia, ahol az URL tartalmazza az elvgezni kvnt mveletet. Ha az OData szolgltats cme pldul http://localhost:8080/owind.svc, akkor az albbi krssel krdezhetjk le tle a Categories nev gyjtemny tartalmt:
http://localhost:8080/owind.svc/Categories

Fontos szrevenni, hogy a gyjtemny teljesen ltalnos fogalom; a Categories gyjtemny fizikailag brmi lehet. llhat mgtte egy SQL tbla, egy XML fjl vagy akr egy szveges fjl. Ez az informcit fogyasztk szmra teljesen lnyegtelen, ugyanis a vlasz szabvnyos XML-ben rkezik majd:
<feed xml:base="http://localhost:8080/owind.svc/" ...> ... <entry> ... <link rel="edit" title="Category" href="Categories(1)" /> ... <content type="application/xml">

226

Adatelrs az OData protokollon keresztl

<m:properties> <d:CategoryID m:type="Edm.Int32">1</d:CategoryID> <d:CategoryName>Beverages</d:CategoryName> <d:Description>Soft drinks, coffees, teas, beers, and ales</d:Description> <d:Picture m:type="Edm.Binary">FRwvAAI...</d:Picture> </m:properties> </content> </entry> ... </feed>

Minden CRUD mvelethez definiltak a fentihez hasonl, az URL rszeknt kiadhat parancsokat. Az OData szolgltatknak ezeket kell megvalstaniuk, az OData fogyasztk pedig ezeket hasznlhatjk. Amint lthattuk, az OData adatforrsokat egyszer HTTP krsekkel tudjuk lekrdezni. Ez azt jelenti, hogy akr egy bngsz segtsgvel, akr az elz fejezetrszben megismert HttpWebRequest osztllyal kiadhatunk nyers HTTP krseket, melyekre az OData adatforrs vlaszolni fog. (s ez adja egyben az OData platformfggetlensgt HTTP krseket gyakorlatilag brmilyen platformrl indthatunk, legyen az Windows, Linux, Mac vagy akrmilyen egyb eszkz.) Ez azonban knyelmetlen. gy szmos platformra, tbbek kztt a Windows Phone-ra is kszlt OData kliensoldali osztlyknyvtr. Az osztlyknyvtr segtsgvel nem kell a nyers HTTP krsekkel bajldnunk; objektumorientlt mdon, kdunkbl tudjuk manipullni az adatforrst, a rekordokat pedig C# osztlyok kpben kapjuk meg. Az OData megismershez egy mintaalkalmazst ksztnk, amely az OData osztlyknyvtr ignybevtelvel beolvassa az eBay.com aktulis akciit. Ahogy a fejezetben mr tbbszr, nyissunk egy j Windows Phone Application tpus projektet! Legyen ennek neve ODataSample, s tmogassa a Windows Phone OS 7.1 vagy jabb verzijt! Az els lpsnk, hogy felvesznk egy referencit az OData vgpontra. Ehhez (a korbban mr ltott webszolgltatsokhoz hasonlan) kattintsunk a projekt nevre a Visual Studiban, s vlasszuk az Add Service Reference parancsot! A cm mezbe rjuk be az eBay OData vgpontjnak cmt: http://ebayodata.cloudapp.net/, a Namespace mezben pedig nevezzk el a referencit Ebay-nek! Amint a 9-6 brn is lthat, a Visual Studio felismeri, hogy ez nem hagyomnyos webszolgltats, hanem adatszolgltats (lsd a panel jobb oldala).

9-6 bra: Referencia felvtele az OData vgpontra

227

9. Kommunikci szerverrel Az OK gomb megnyomsa utn a Visual Studihoz kszlt OData knyvtr legenerlja a vgpont elrshez szksges osztlyokat. Az eBay ltal knlt minden objektumtpushoz (pl. Bidders, Items, Deals) kszl egy-egy osztly, valamint egy EBayData nev kontextusosztly is generldik. Ez a kontextusosztly rendelkezik majd azokkal a mveletekkel, amelyekkel a kdbl megszlthatjuk az OData szolgltatst. Az ismtls kedvrt: ezek a generlt objektumok kizrlag a fejleszt knyelmt szolgljk. Ha akarnnk, nyers HTTP krsekkel s a visszarkez XML vlaszok feldolgozsval is kommuniklhatnnk a vgponttal. A generlt osztlyok ezeket a feladatokat vgzik el helyettnk. Most ksztsk el a szolgltats megszltshoz szksges kdot! Ehhez szksgnk lesz egy nvtrre, melyet a MainPage.xaml.cs kdfjl tetejn helyezznk el!
using System.Data.Services.Client;

A feladat elvgzshez kt fontos vltozt kell deklarlnunk. Az EBayData tpus vltoz biztostja a szolgltats megszltshoz szksges metdusokat. A DataServiceCollection<Ebay.Deal> nev vltoz pedig egy Deal tpus objektumokat tartalmaz gyjtemnyt kpvisel. Ez a gyjtemny kezdetben res, programunk futsa sorn ezt fogjuk feltlteni a szerveroldalrl lekrdezett rekordokkal. A kt vltozt tbb metdusbl is szeretnnk majd hasznlni, gy deklarcijukat kzvetlenl a public partial class MainPage : PhoneApplicationPage sor (s az azt kvet nyit kapcsos zrjel) utn helyezzk el:
Ebay.EBayData context; DataServiceCollection<Ebay.Deal> deals;

A kvetkez feladatunk a deals gyjtemny feltltse az OData vgpontrl lekrdezett objektumokkal. A feltltst kzvetlenl az alkalmazs indulsakor elkezdjk, gy a kdot kzvetlenl a public MainPage() konstruktorban helyezzk el. Az OData vgpont megszltshoz elsknt ltrehozunk egy pldnyt az EBayData nev osztlybl. Ennek a pldnynak ltrejttekor tadjuk a megcmzend szolgltats URL-jt, majd ltrehozunk egy pldnyt a korbban deklarlt Deal tpus objektumokat tartalmaz gyjtemnybl is. Ennek a pldnynak a kontextusra (az EBayData tpus vltoz pldnyra) adunk t egy referencit, gy tudja majd, hogy honnan kell az adatokat lekrnie. Ezutn ltrehozunk egy LINQ lekrdezst, amellyel megadjuk, hogy a deals gyjtemnybe mit szeretnnk betlteni a szerveroldalrl. A LINQ eszkzeivel definilhatunk klnfle szrfeltteleket, rendezseket, melyeket az OData knyvtr fordt le az OData ltal elvrt URL-szintaxisra. Az ltalunk megadott LINQ lekrdezs nem tartalmaz szrfelttelt, az sszes Deal tpus objektumot lekri. A LINQ eszkztra bvebb, mint az OData ltal tmogatott mveletek halmaza, gy elfordulhat, hogy egy rvnyes LINQ lekrdezs futsidej hibt dob. Vgl a korbban mr ltott mdon feliratkozunk a lekrdezs befejezst jelz esemnyre, majd kiadjuk az utastst a deals gyjtemny feltltsre az ltalunk megadott LINQ lekrdezs szerint.
public MainPage() { InitializeComponent(); context = new Ebay.EBayData(new Uri("http://ebayodata.cloudapp.net/")); deals = new DataServiceCollection<Ebay.Deal>(context); var query = from deal in context.Deals select deal;

228

Adatelrs az OData protokollon keresztl

deals.LoadCompleted += new EventHandler<LoadCompletedEventArgs>(deals_LoadCompleted); deals.LoadAsync(query); }

Az OData protokollt felksztettk a nagymret adathalmazokra. gy ha a lekrdezs sok eredmnyt adna vissza, programunknak nem kell megvrnia, amg a teljes adathalmaz megrkezik (ez sok ezer rekordot is jelenthet, ami tbb megabjtnyi XML-be frne csak bele). Ehelyett a protokoll ilyenkor az els nhny rekordot adja t, majd a vlaszban jelzi, hogy mg van tovbbi rsze is az eredmnyhalmaznak. A deals_LoadCompleted esemnykezel meghvsakor lekrdezsnk lefut, s a visszaadott objektumok betltdnek a deals gyjtemnybe. A fent emltett mechanizmus miatt azonban elfordulhat, hogy mg vannak betltetlen rekordok az adatforrsban. Valamennyi rekordot szeretnnk lekrdezni, ezrt ha kdunk azt rzkeli, hogy a lekrdezs mg folytathat, akkor a LoadNextPartialSetAsync() hvssal az eredmnyhalmaz kvetkez szelett is letlti. Ehhez nem kell j esemnykezelt felvennnk, mert ez a metdus is a deals_LoadCompleted esemnykezelt hvja meg, gy lekrdezsnk addig fut, amg minden objektum meg nem rkezik a szerverrl. Ha gy talljuk, hogy minden objektum megrkezett, akkor egy zenetdobozban kiratjuk az aktulis eBay akcik cmeit. Az esetleges hibt pedig termszetesen kezeljk. Hozzuk ltre a deals_LoadCompleted metdust az albbi kddal:
void deals_LoadCompleted(object sender, LoadCompletedEventArgs e) { if (e.Error != null) { if (deals.Continuation != null) { deals.LoadNextPartialSetAsync(); } else { string message = ""; foreach (var deal in deals) message += deal.Title + Environment.NewLine; MessageBox.Show(message); } } else { MessageBox.Show(e.Error.ToString()); } }

Ezzel elkszltnk. Teszteljk alkalmazsunkat! Indtsuk el az F5-tel, s kisvrtatva megjelennek az aktulis eBay akcik. Az eBay honlapjn ellenrizhetjk is, hogy a megfelelket tltttk-e le. A http://deals.ebay.com/ honlapot megnyitva lthatjuk, hogy valban az pp elrhet akcikat krdeztk le (9-7 bra).

229

9. Kommunikci szerverrel

9-7 bra: Az OData-n keresztl letlttt objektumok s az eBay honlapja Ezzel megismertk az OData hasznlatnak alapjait. Az itt megtanultak alapjn mr tudunk egy ODatafogyasztsra kpes alkalmazst kszteni. A webszolgltatsokhoz hasonlan az OData is rendkvl szles tmakr. Aki szeretn jobban megismerni az OData protokollt, az ltogasson el a http://www.odata.org weboldalra, ahol megtallhat az OData-szolgltatk s a klnfle platformokra elrhet OData kliensek folyamatosan bvl listja, valamint a protokollal kapcsolatos rszletes informcik s a frum. rdemes megismerkedni a protokollal, mert rengeteg Microsoft-termk s szmos kls gyrt mr most tmogatja! Ilyen pldul az SQL Azure, a SharePoint, az eBay, a Netflix s mg sokan msok.

Adattrols Windows Azure-ban


Internetre kapcsolt telefonalkalmazsunknak gyakran szksge lehet sajt fjlok s egyb adatok trolsra. Ezeket az ignyeket termszetesen megoldhatjuk egy sajt szerverrel, melyre alkalmazsunk egy webszolgltatson keresztl tlti fel az anyagokat. Ennl azonban sokkal egyszerbb s olcsbb megoldst is alkalmazhatunk: a Windows Azure trhelyszolgltatst kihasznlva nhny szz forintrt trolhatunk gigabjtokat, radsul egyszer objektumorientlt API-n keresztl. Ebben a rszben a Windows Azure trhelyszolgltatsnak elemeit s ezek hasznlatt ismerjk meg egy Windows Phone alkalmazsbl. Az Azure Storage hromfle szolgltatst nyjt: trolhatunk benne fjlokat (Blob Storage), ltrehozhatunk benne aszinkron kommunikcira alkalmas vrakozsi sorokat (Queue Service), illetve feltlthetnk egyszer tblajelleg informcikat, mint pl. egy telefonknyv (Table Service). Ez utbbi nem vltja ki az SQL szervert, amint ksbb azt ltni fogjuk. Mindhrom szolgltatsra igaz, hogy az Azure a feltlttt adatokat hrom pldnyban trolja, radsul kt, egymstl tbb szz kilomterre lv adatkzpontba is sztmsolja, gy a vletlen adatveszts gyakorlatilag kizrt. Az Azure emellett komoly ktelezettsgeket vllal a szolgltats rendelkezsre llsra is. gy elmondhatjuk, hogy mindhrom trhelyszolgltats alkalmas komoly, professzionlis alkalmazsok kiszolglsra is. Ismerjk meg ezeket rszletesebben!

230

Adattrols Windows Azure-ban

Fjlok (blob-ok)
A Blob Storage gyakorlatilag egy fjlszerver a felhben. Azure elfizetsnkhz gynevezett kontnereket hozhatunk ltre. Mindegyik kontnerre gy gondolhatunk, mint egy merevlemez egy partcijra. A kontnerekbe pedig tetszleges mennyisg fjlt feltlthetnk, akr mappkba rendezve is. A fjlok mretnek fels korltja egy terabjt (1 TB). A feltlttt fjlokat ksbb URL-jk alapjn a telefonrl vagy az internetrl is elrhetjk. A fejezetben megszokott mdon egy mintaalkalmazson keresztl ismerjk meg az Azure Storage hasznlatt. Az Azure knl ugyan egy emultort, de ez az emultor csak PC-n futtathat, gy telefonalkalmazsunkbl egy valdi, a felhben lv trhelyet kell megcmeznnk. Ehhez szksg van egy Azure elfizetsre. Ilyen elfizetshez a http://www.microsoft.com/windowsazure/offers/ oldalon juthatunk hozz gyakran van ingyenes kiprblsi lehetsg is. Az elfizetsnkn bell hozzunk ltre egy Azure Storage trhelyet! Ehhez ltogassunk el az Azure portlra (http://windows.azure.com), majd jelentkezznk be az elfizetskor megadott Live ID azonostnkkal! A bal als sarokban kattintsunk a Hosted Services, Storage Accounts & CDN flre, majd vlasszuk a Storage Accounts listaelemet (9-8 bra)! Ekkor megjelennek az elfizetshez tartoz Azure Storage trhelyek. A New Storage Account gomb segtsgvel hozzuk ltre trhelynket! Ennek sorn kell megadnunk a trhely nevt. Miutn ltrejtt, a jobb fels sarokban talljuk a Primary access key sort, s mellette a View gombot. Erre kattintva tekinthetjk meg a trhelyhez tartoz kt automatikusan generlt jelszt.

9-8 bra: Az Azure menedzsment portl, benne trhelyeinkkel A trhely nevt s egyik jelszavt troljuk el; ezekre lesz majd szksgnk a trhely programozshoz. Most ksztsk el mintaalkalmazsunkat!

231

9. Kommunikci szerverrel Az Azure trhely rendelkezik egy REST-es menedzsment fellettel. Ez azt jelenti, hogy egyszer HTTP krsekkel parancsokat tudunk kiadni. Ez azonban knyelmetlen, gy kszlt hozz egy osztlyknyvtr. Ez az osztlyknyvtr a Windows Azure Toolkit for Windows Phone rsze. Tltsk ezt le a CodePlex-rl, a http://watwp.codeplex.com/ URL-en rhet el! Teleptse sorn a fjlokat egy ltalunk meghatrozott mappba helyezi. Ennek a mappnak a helyt szintn jegyezzk meg, mert ksbb szksgnk lesz majd r! A szerveroldali programozshoz kszlt Windows Azure SDK termszetesen szintn tartalmaz ksz osztlyokat az Azure Storage elrshez. Az itt trgyalt Windows Phone alap osztlyok hasonltanak ezekre, m nmileg ms logikt alkalmaznak. A Toolkit teleptse utn ksztsnk egy j Windows Phone Application projektet AzureStorageSample nven, Windows Phone OS 7.1 vagy jabb opercis rendszer verzit hasznlva! A Toolkit osztlyainak hasznlathoz vegynk fel egy referencit a WindowsPhoneCloud.StorageClient.dll knyvtrra! Ezt a Toolkit mappja alatt a Binaries mappban talljuk. A szksges nvterek importlshoz helyezzk el a kvetkez sorokat a MainPage.xaml.cs kdfjl legtetejre:
using using using using Microsoft.Samples.WindowsPhoneCloud.StorageClient; Microsoft.Samples.WindowsPhoneCloud.StorageClient.Credentials; System.IO; System.Text;

Miutn ezzel elkszltnk, alkalmazsunk felletre vegynk fel egy gombot, BlobButton nven, Blob feltltse felirattal! Erre a gombra kattintva alkalmazsunk feltlt majd a felhbe egy pldafjlt. Az Azure osztlyok a fejezet korbbi rszeiben trgyalt okokbl aszinkron mkdsek, gy a gombra kattintva a krs csak elindul, befejezni csak egy msik metdusbl fogjuk. Ezrt a hasznlt vltozinkat nem a metduson bell deklarljuk, hanem a program trzsben. Helyezzk a kvetkez sorokat a public partial class MainPage : PhoneApplicationPage sor (s az azt kvet kapcsos zrjel) al:
StorageCredentialsAccountAndKey credentials; CloudBlobClient blobClient; CloudBlobContainer container;

Az els, credentials nev vltozban troljuk el a trhely megcmzshez hasznlt nevet s jelszt. A kt msik vltoz pedig a Blob storage hasznlathoz kell. Most adjunk rtket a credentials vltoznak! Ezt clszer a program indulsakor, egyszer megtenni, mert ksbb mg tbbszr szksgnk lesz r. Az rtkadshoz rjuk az albbiakat a public MainPage() konstruktor InitializeComponent() sora al:
credentials = new StorageCredentialsAccountAndKey("TRHELYNV", "JELSZ");

A TRHELYNV helyre rjuk a trhely nevt (amit ltrehozskor megadtunk), a JELSZ helyre pedig a trhely jelszavt (amit lementettnk az Azure menedzsment portlrl). Amint korbban volt rla sz, a Blob Storage hasznlatnak elfelttele, hogy ltrehozzunk benne fjljaink szmra egy kontnert. Ilyen kontnerbl tetszleges szmval rendelkezhetnk, gy klnbz alkalmazsaink, vagy alkalmazsunkon bell klnbz felhasznlink is kaphatnak kln-kln kontnert. Alkalmazsunk els lpse, hogy ltrehozzon magnak egy kontnert (ha ezt korbban mg nem tette meg). Kattintsunk dupln a BlobButton gombra, hogy belpjnk Click esemnykezeljbe! A korbban emltett REST-es API-t egy sor osztly fedi le; neknk csak ezek metdusait kell hvni, a httrben zajl HTTP krseket az osztlyok eltakarjk ellnk. gy itt elszr is pldnyostunk egy CloudBlobContainer tpus osztlyt. Ez szolgl majd a kontnerek ltrehozsra.

232

Adattrols Windows Azure-ban A menedzsment API hvshoz osztlyainknak rendelkeznik kell a szksges hitelestsi adatokkal. Ezeket az adatokat mr eltroltuk a credentials nev osztlyba, gy a most ltrehozott CloudBlobContainer pldnynak egyszeren csak ezt kell tadnunk. A CloudBlobContainer pldny ltrehozsa utn egy metdus segtsgvel megindtjuk az alkalmazsunk ltal hasznlni kvnt kontner ltrehozst. A hasznlt metdus intelligens, gy megvizsglja, hogy ltezik-e mr az adott kontner, s csak akkor prblkozik meg ltrehozsval, ha mg nincs ott. Paramterknt t kell adnunk a kvnt kontner URL-jt. Ennek egyrszt tartalmaznia kell trhelynk nevt, msrszt egy ktelez elemet (blob.core.windows.net), harmadrszt a kontner elvrt nevt. Trhelynk nevt helyettestsk be, a kontner neve pedig legyen phonetest1!
container = new CloudBlobContainer(credentials); container.CreateContainerIfNotExist(new Uri("https://TRHELYNV.blob.core.windows.net/phonetest1"), CloudBlobContainerCreated);

Aszinkron metdust hvtunk, gy befejezdse utn valahogy folytatnunk kell kdunk futtatst. Ezttal nem egy esemnyre iratkozunk fel, hanem a metdushvsban tadunk paramterknt egy callback fggvnyt, melyet a metdus majd meghv befejezsekor. Ez a callback fggvny a fent lthat CloudBlobContainerCreated. Kvetkez feladatunk a callback fggvny megrsa. A fggvnyben megvizsgljuk, hogy trtnt-e hiba a vgrehajts sorn. Ha igen, akkor errl rtestjk a felhasznlt. Ha nem, akkor folytatjuk feladatunkat: feltltnk egy blob-ot. Ehhez egy CloudBlobClient nev objektumot hasznlunk. Ennek ltrehozsakor megadjuk, hogy az melyik kontnerrel dolgozzon (a fenti URL-t kell itt is hasznlnunk), valamint tadjuk neki a hitelestsi informcikat. Utna pedig egy metdushvssal elvgezzk a feltltst. A feltltend adatot egy Stream tpus vltozban vrja az osztly, ezrt ltrehozunk egy MemoryStreamet, amelybe belerunk nhny bett. A Stream egy ltalnos cl vltoztpus, gy les alkalmazsban egy kpet, a felhasznl ltal az internetrl letlttt llomnyt vagy brmi mst is fel tudunk tlteni Blob Storage-ba. rjuk az albbi kdot a gomb Click esemnykezelje al:
private void CloudBlobContainerCreated(CloudOperationResponse<bool> returnValue) { this.Dispatcher.BeginInvoke(() => { if (returnValue.Exception == null) { MemoryStream memoryStream = new MemoryStream(); StreamWriter streamWriter = new StreamWriter(memoryStream); streamWriter.WriteLine("Hello!"); streamWriter.Flush(); memoryStream.Seek(0, SeekOrigin.Begin); blobClient = new CloudBlobClient( "https://TRHELYNV.blob.core.windows.net/phonetest1", credentials); blobClient.Upload("test.txt", memoryStream, BlobUploadedCallback); } else { MessageBox.Show(returnValue.Exception.ToString()); } }); }

A blob feltltse is egy aszinkron mvelet, gy egy msodik callback fggvnyt is ksztennk kell. Ennek mr mindssze annyi feladata van, hogy tjkoztassa a felhasznlt a feltlts kimenetrl (sikeres vagy sikertelen).

233

9. Kommunikci szerverrel

private void BlobUploadedCallback(CloudOperationResponse<bool> returnValue) { this.Dispatcher.BeginInvoke(() => { if (returnValue.Exception == null) { MessageBox.Show("Blob feltltve!"); } else { MessageBox.Show(returnValue.Exception.ToString()); } }); }

Teszteljk alkalmazsunkat! Az F5 gombbal futtassuk, majd nyomjuk meg a Blob feltltse gombot! Alkalmazsunk a httrben ltrehozza a kontnert s feltlti a tesztfjlt. Ellenrizzk ennek megtrtntt! Ehhez valamilyen eszkzzel r kell csatlakoznunk a Blob Storage-ra. Taln a legegyszerbb a http://www.myazurestorage.com honlap hasznlata. Itt meg kell adnunk trhelynk nevt s jelszavt, majd egy webes felleten bngszhetjk a Blob Storage tartalmt. A myazurestorage.com weboldalt a Microsoft fejlesztette, gy megbzhatunk benne, nem kell jelszavunk ellopstl tartanunk. A BLOBs flre kattintva megtalljuk a phonetest1 kontnert, amit kibontva ellenrizhetjk, hogy test.txt fjlunk valban ltrejtt-e (9-9 bra).

9-9 bra: A ltrehozott kontner s blob Ezzel megismertk a Blob Storage hasznlatnak alapjait. Termszetesen a szolgltats kpessgeinek s a hasznlhat API-nak csak egy nagyon kis rszt lttuk, de ennek alapjn mr el tudunk kszteni egyszer alkalmazsokat. A Blob Storage nyjtotta lehetsgekrl s a Windows Phone ltal tmogatott API-rl bvebben olvashatunk az Azure s a Windows Azure Toolkit for Windows Phone honlapjain.

Vrakozsi sorok (queue-k)


Kvetkez Storage elemnk a vrakozsi sor, vagyis a Queue Service. Az Azure vrakozsi sor kismret (maximum 64 kilobjtos) zenetek megbzhat kezelsre alkalmas. Elnye, hogy tetszleges szm egyszerre mkd termelvel s fogyasztval megbirkzik, kapacitsa pedig gyakorlatilag korltlan.

234

Adattrols Windows Azure-ban Egy gyes mechanizmussal gondoskodik arrl, hogy a sorba kerl zenetek addig ne trldjenek, amg azok sikeresen feldolgozsra nem kerltek. A sorban lv zeneteket ugyanis elszr csak kivesszk. A kivett zenetek bizonyos idre virtulisan eltnnek a sorbl (alaprtelmezsknt 10 percre, de ez az idtartam feljebb is vehet). Vglegesen trlni csak egy kln utastssal lehet. Ha gyelnk arra, hogy az zeneteket csak sikeres feldolgozsuk utn trljk, akkor egy hibra fut feldolgozegysgnl az zenet nem vsz el. Mivel a hibs egysg sosem jutott el odig, hogy trlje az zenetet, ezrt az kis id elteltvel jra megjelenik, s egy msik egysg jra megprblkozhat a feldolgozsval. Az zenetek mretre vonatkoz korlt szndkos: a vrakozsi sorban csak a feladatok lerst kell trolnunk (pl. videt kell konvertlni). A feladatok vgrehajtshoz szksges, nagymret fjlokat s egyb adatokat mshov clszer helyeznnk (pl. Blob Storage-ba), ezekre az zeneten bellrl egy URLlel hivatkozhatunk. A Queue szolgltats felptse hasonlt a Blob Storage felptshez: Azure trhelynk al tetszleges szm, egyedileg elnevezett sort hozhatunk ltre, s mindegyik sorba kln-kln pakolhatunk zeneteket. A Blob Storage-hoz kszlt pldaalkalmazsunkat kiegsztjk egy jabb gombbal, mellyel egy sort hozunk ltre, majd elhelyeznk benne egy zenetet. Ehhez szksgnk lesz nhny osztlyszint vltozra. Helyezzk az albbi sorokat a MainPage osztly tetejre:
CloudQueueClient queueClient; CloudQueue queue;

Most hozzuk ltre a gombot! Annak neve legyen QueueButton, felirata pedig Queue zenet ltrehozsa. Dupla kattintssal lpjnk be Click esemnykezeljbe! Els dolgunk a sor ltrehozsa lesz. Ehhez egy CloudQueueClient objektumot ksztnk. Ennek tadjuk a Queue szolgltats URL-jt, valamint a korbban eltrolt hitelestsi adatainkat. Utna ettl az objektumpldnytl krnk egy referencit egy phonetest1 nev sorra, amit egy metdushvssal ltrehozunk, ha mg nem ltezik. A meghvott metdus aszinkron, gy kdunk egy callback fggvnyben folytatdik majd.
private void QueueButton_Click(object sender, RoutedEventArgs e) { queueClient = new CloudQueueClient("https://TRHELYNV.queue.core.windows.net", credentials); queue = (CloudQueue)queueClient.GetQueueReference("phonetest1"); queue.CreateIfNotExist(CloudQueueCreatedCallback); }

A callback fggvnyben nincs ms dolgunk, mint ellenrizni, hogy trtnt-e hiba, s ha nem, akkor berni egy zenetet a sorba. Az zenetek tartalma tetszleges formtum lehet, akr szveges, illetve akr egy bjttmb is. A Windows Phone-hoz kszlt API csak bjttmb berst teszi lehetv, ezrt ltrehozunk egy szveget, amint bjttmbb konvertlva helyeznk el egy zenetben:
private void CloudQueueCreatedCallback(CloudOperationResponse<bool> returnValue) { this.Dispatcher.BeginInvoke(() => { if (returnValue.Exception == null) { CloudQueueMessage message = new CloudQueueMessage() { AsBytes = Encoding.UTF8.GetBytes("Hello") }; queue.AddMessage(message, CloudQueueMessageAddedCallback); } else MessageBox.Show(returnValue.Exception.ToString()); }); }

235

9. Kommunikci szerverrel Az zenet ltrehozsa termszetesen szintn aszinkron, ezrt feladatunkat egy jabb callback fggvnyben fejezzk be. Itt mindssze rtestjk a felhasznlt a mvelet eredmnyrl.
private void CloudQueueMessageAddedCallback(CloudOperationResponse<bool> returnValue) { this.Dispatcher.BeginInvoke(() => { if (returnValue.Exception == null) { MessageBox.Show("zenet ltrehozva!"); } else { MessageBox.Show(returnValue.Exception.ToString()); } }); }

Teszteljk alkalmazsunkat: indtsuk el, s nyomjuk meg a QueueButton gombot! A Blob Storage pldhoz hasonlan most is a myazurestorage.com segtsgvel ellenrizhetjk, hogy zenetnk valban ltrejtt-e. Ismt ltogassunk el az oldalra! A Queues fln megtalljuk a phonetest1 vrakozsi sort s benne az imnt ltrehozott zenetnket (9-10 bra). Ne lepdjnk meg, ha az zenet idblyegzje nhny rval korbbi vagy ksbbi, mint a magyar id a weboldal az Azure adatkzpont helyi idejt jelenti meg.

9-10 bra: A ltrehozott vrakozsi sor s zenet

Tblk (table-k)
Az Azure Storage harmadik eleme az Azure Table Service. Itt strukturlt, tblaszer informcit, vagyis tbb mezbl ll adatsorokat trolhatunk. Trhelynk alatt tetszleges szm, egyedileg elnevezett tblt hozhatunk ltre. A tblkhoz nem kell smt rendelnnk azaz nem kell ket megterveznnk. Objektumokat helyezhetnk beljk, s minden tbla felveszi a belerakott objektumok smjt. Vagyis ha egy Dog tpus objektumot helyeznk egy tblba, s a Dog objektumnak Name s Age tulajdonsga van, akkor a tblban automatikusan ltrejn egy Name s egy Age tpus oszlop. Egy tblba tbbfle objektumot is beletehetnk, de a tblban minden objektum minden tulajdonsghoz ltrejn egy-egy oszlop, ami rdekes tkzseket s hibajelensgeket okozhat, gy ezt inkbb kerljk! A tblba helyezett objektumoknak tartalmazniuk kell egy PartitionKey s egy RowKey nev szveges mezt s egy Timestamp nev, dtum tpus mezt. Ezeket nem kell kzzel beraknunk azokba az

236

Adattrols Windows Azure-ban osztlyokba, amiket tblban szeretnnk trolni elg leszrmaztatni osztlyainkat a TableServiceEntity sosztlybl. A tblba helyezett objektumokat entitsoknak nevezzk. A Timestamp mezvel semmi dolgunk, azt az Azure kezeli. A PartitionKey s a RowKey azonban fontos! A tblkban mindssze ezen a kt mezn van index (a tbbire nem is rakhatunk). A kettnek egyttesen egyedinek kell lennie. A PartitionKey rtkt a sklzsban hasznlja az Azure, az azonos PartitionKey rtkkel rendelkez entitsokat fizikailag egymshoz kzel trolja, gy a logikailag sszetartoz adatokat rdemes azonos PartitionKey rtkkel elltni. Ha ezzel nem akarunk bajldni, minden objektumnak lehet klnbz PartitionKey rtke is. A RowKey nem hordoz ilyen jelentst. Egy npszmlls adatsorainl a PartitionKey rtk lehet pldul az illet vrosa, a RowKey rtke pedig az illet szemlyi szma. gy a kett egytt garantltan egyedi (st a RowKey akr nmagban is), s ha vros alapjn keresnk vissza entitsokat, akkor nagyon gyorsan tudunk haladni. A tblba rakott entitsoknak a hrom ktelez mezn kvl maximum 252 ltalunk megadott mezje lehet. Ezek tpusai alapveten a .NET alaptpusok lehetnek (pl. Int32, Double, Boolean, Guid vagy String). Komplex vagy sajt tpusokat (azaz listkat, ltalunk definilt osztlyokat) nem hasznlhatunk, s a .NET alaptpusok kzl sem mindet (pl. a Float adattpust nem). Egy entits teljes mrete 1 megabjt lehet. A fenti korltozsok jelen sorok rsakor aktulisak voltak, m az Azure tbbi szolgltatshoz hasonlan a Table Service is folyamatosan fejldik. A jellemzk legfrissebb listja mindig az MSDN-en olvashat. A Table Service elnye, hogy risi tblamreteket tmogat, tblnknt tbb milli adatsort is eltrolhatunk. Msik elnye, hogy rendkvl olcs. A ksbbiekben lert razsbl lthatjuk majd, hogy nhny szz forintbl hatalmas adatbzisokat tarthatunk fenn! Htrnya viszont, hogy nem relcis, azaz tblinkra nem vehetnk fel plusz indexeket, idegen kulcsokat, trolt eljrsokat, s gy tovbb, azaz kpessgei lnyegesen szernyebbek, mint egy SQL szerver. A Table Service s a SQL Azure teht nem versenytrsak, msfle feladatkrkre rdemes alkalmazni ket. Ha programunknak egy High Score listt kell nyilvntartania, vagy ppensggel sok milli, de egyszer adatsort kell trolnia, akkor ezt a feladatot nhny forintrt elltja a Table Service. Egy bonyolult adatstruktrt alkalmaz programnl, mint pl. egy CMS rendszernl vagy egy banki alkalmazsnl viszont egyrtelmen a SQL Azure a megfelel vlaszts. Egsztsk ki pldaprogramunkat Azure Table Service tmogatssal! Trjnk vissza a Visual Studiba s hozzunk ltre egy j gombot az alkalmazs felletn! A neve legyen TableButton, felirata pedig Table sor hozzadsa! A Table Service hasznlathoz szksgnk van tovbb mg egy DLL fjlra. Vegynk fel egy referencit a System.Data.Services.Client.dll fjlra, de ne az Add Reference dialgus .NET flrl vlasszuk ki, hanem a Browse fl segtsgvel tallzzuk ki a Toolkit mappja alatt tallhat Binaries mappbl! Ez azrt szksges, mert neknk a DLL 4.0-s verzija kell, mg a Browse fln a 2.0 verzit tallnnk. Amint korbban lttuk, az Azure Table Service-be osztlyok pldnyait tudjuk feltlteni. Hozzunk ltre egy erre sznt osztlyt! Jobb gombbal kattintsunk a projekt nevre a Solution Explorer ablakban, s az Add almenbl vlasszuk a Class menpontot! j osztlyunkat nevezzk SampleData-nak! Miutn ltrejtt, le kell szrmaztatnunk azt a TableServiceEntity sosztlybl, majd fel kell vennnk bele nhny tulajdonsgot. Az osztly tetejre rjuk a kvetkez sort:
using Microsoft.Samples.WindowsPhoneCloud.StorageClient;

Az osztly tartalma pedig legyen a kvetkez:

237

9. Kommunikci szerverrel

public class SampleData : TableServiceEntity { public string Name { get; set; } public int Age { get; set; } }

Most trjnk vissza a MainPage.xaml.cs fjlhoz! Szksgnk lesz nhny jabb osztlyszint vltozra, ezeket vegyk fel a kdfjl tetejre, a tbbi vltozdeklarci al!
CloudTableClient tableClient; ITableServiceContext tableContext;

Ezutn dupla kattintssal lpjnk be a TableButton gomb Click esemnykezeljbe! Az elz mintapldkban ltottakhoz hasonlan elszr ltrehozunk egy TableServiceContext osztlyt a megfelel hitelestsi adatokkal, majd ezzel aszinkron mdon ltrehozatunk egy tblt.
private void TableButton_Click(object sender, RoutedEventArgs e) { tableContext = new TableServiceContext("https://TRHELYNV.table.core.windows.net", credentials); tableClient = new CloudTableClient(tableContext); tableClient.CreateTableIfNotExist("phonetest1", TableCreatedCallback); }

A callback metdusban ltrehozunk egy pldnyt a SampleData osztlyunkbl. gyelnk arra, hogy a PartitionKey s a RowKey rtkek egyediek legyenek. Majd (az Entity Frameworkhz s a LINQ to SQLhez hasonl mdon) felvesszk az entitst a tblba, s elmentjk a vltozsokat. Ekkor trtnik meg a tnyleges kommunikci a szerverrel.
private void TableCreatedCallback(CloudOperationResponse<bool> returnValue) { this.Dispatcher.BeginInvoke(() => { if (returnValue.Exception == null) { SampleData sampleData = new SampleData(); sampleData.PartitionKey = Guid.NewGuid().ToString(); sampleData.RowKey = Guid.NewGuid().ToString(); sampleData.Name = "Demo"; sampleData.Age = 10; tableContext.AddObject("phonetest1", sampleData); tableContext.BeginSaveChanges(TableContextSaved, null); } else { MessageBox.Show(returnValue.Exception.ToString()); } }); }

A tblaments termszetesen aszinkron trtnik. A mvelet befejezse utn rtestjk a felhasznlt:


private void TableContextSaved(IAsyncResult result) { try { var response = tableContext.EndSaveChanges(result); this.Dispatcher.BeginInvoke(() => MessageBox.Show("Tblasor hozzadva!"));

238

Adattrols Windows Azure-ban

} catch (Exception ex) { this.Dispatcher.BeginInvoke(() => MessageBox.Show(ex.ToString())); } }

Teszteljk az alkalmazst! Indtsuk el, kattintsunk r a Table sor hozzadsa gombra, majd a mr ltott mdon nyissuk meg a myazurestorage.com oldalt! A Tables fln megtalljuk majd a phonetest1 tblt, benne egy partcit (amit egyetlen feltlttt entitsunk PartitionKey rtkbl szmolt az oldal), s azon bell az elmentett entitsunkat (9-11 bra).

9-11 bra: Entitsunk a Table Service-ben Ezzel megismertk az Azure Storage harmadik szolgltatst is. A Table Service segtsgvel kltsghatkony, rendkvl sklzhat mdon trolhatunk tblajelleg informcikat. A Queue s Blob szolgltatshoz hasonlan a Table Service kpessgeinek is csak egy tredkt fedtk le, a teljes API az Azure s a Toolkit honlapjain ismerhet meg.

razs
A Windows Azure platform fontos jellemzje, hogy szolgltatsait nllan is ignybe vehetjk. gy ha hasznlni szeretnnk valamelyik trhelyszolgltatst, semmifle belpsi kltsggel vagy jrulkos sszeggel nem kell szmolnunk kizrlag azt kell fizetnnk, amit hasznlunk. Az Azure razsa folyamatosan vltozik, s jellemzen egyre olcsbb lesz. Jelen sorok rsakor a trhelyszolgltats rai a kvetkezk: A feltlts ingyenes. Egy gigabjt adat trolsa (legyen az sor, tbla vagy fjl) egy hnapig: 14 dollrcent. Egy gigabjt adat letltse: 15 dollrcent. 10 ezer elemi rsi/olvassi mvelet: 1 dollrcent. A fenti adatok kizrlag tjkozat jellegek! Az Azure aktulis razst a kvetkez honlapon talljuk: http://www.microsoft.com/windowsazure/pricing/.

239

9. Kommunikci szerverrel Amint lthattuk, nhny szz forintrt sok gigabjt adatot trolhatunk a felhben, garantlt rendelkezsre lls s adatbiztonsg mellett. Vegyk szre, hogy az Azure tblk s vrakozsi sorok razsa megegyezik a fjlok razsval ebbl a havi pr szz forintbl egy tbb gigabjtos adatbzist vagy vrakozsi sort is fenntarthatunk a Table Service s Queue Service hasznlatval.

Felhasznl-hitelests szerveroldalrl
Ha alkalmazsunk internetes erforrsokat is hasznl, termszetes ignyknt jelentkezik a felhasznlk kezelse, hitelestse. A klasszikus megolds erre egy sajt hitelest mechanizmus hasznlata. Ha kicsit vatosabbak vagyunk, akkor ezt nem mi magunk rjuk meg, hanem kls gyrttl szrmaz, biztonsgi szempontbl alaposan tgondolt s tesztelt hitelestsi rteget vetnk be (ilyen pldul az ASP.NET Membership). Mg itt is igaz azonban, hogy az adatbzist neknk kell trolni, neknk kell kezelni a felhasznlk problmit (pldul jelsz-vltoztats). s ami a legrosszabb: szolgltatsunk hasznlata eltt felhasznlnknak t kell esnie a regisztrcis procedrn. Lehet, hogy ez csak nhny mez kitltst s egy gyors e-mailes hitelestst ignyel, de gy is elvesz pr percet a felhasznl idejbl. Ez pedig gyakran tl sok: taln az Olvasval is elfordult mr, hogy egy regisztrcis rlapot megltva rgtn visszafordult s msik szolgltatst keresett. Szerencsre van arra mdunk, hogy ezt elkerljk, de mgis hitelestsk a felhasznlt! Egyszeren hasznljuk valamelyik mr meglv regisztrcijt! Az internet polgrainak tlnyom tbbsge mr tagja a Facebooknak, vagy rendelkezik Live ID azonostval (pldul van Hotmail fikja, hasznl Messengert vagy van XBOX Live elfizetse), esetleg Gmail-es e-mail cme van. Windows Phone alkalmazsunk kzvetlenl e szolgltatsok valamelyikbe kldheti el a felhasznlt bejelentkezni. Embernknek csak egy mr ltez nevet s jelszt kell bernia. Alkalmazsunk rtesl a bejelentkezs tnyrl, s kap egy egyedi azonostt a felhasznlhoz, gy a hitelestsi munkt teljes egszben megsproltuk, mindkt fl szmra elnys mdon. Ezt a bejelentkezsi mdszert hvjuk federlt hitelestsnek. Megtehetnnk, hogy telefonalkalmazsunkrl kzvetlenl szltjuk meg a hitelests-szolgltatkat, de erre gyakran nem adnak kzvetlen tmogatst, gy fejleszti szempontbl nehz a feladat. A Microsoft Windows Azure felhplatformja azonban knl egy szolgltatst, amely kztes flknt mkdik. A szolgltats neve Access Control. Elnye, hogy telefonalkalmazsunkbl nagyon knnyen hasznlhat, s tovbbtja krsnket a megfelel hitelestsszolgltat fel. gy elfedi ellnk az egyes szolgltatk meghvsnak bonyolultsgt. Ebben a fejezetrszben a Windows Azure Toolkit for Windows Phone kihasznlsval ksztnk egy Access Control alap hitelestsre alkalmas alkalmazst. Amint ltni fogjuk, az itt ismertetett lpsektl kis eltrssel az ASP.NET Membershipet is hasznlhatnnk. A lenti lpsek vgrehajtshoz szksgnk lesz a Toolkitre s egy l Azure elfizetsre. Az elz, Azure Storage hasznlatrl szl fejezetrsz utn mr mindkettvel rendelkeznk. Indtsunk egy j Visual Studio projektet! A megszokottl eltren ne a Windows Phone Application tpust, hanem a Windows Phone 7 Cloud Application tpust vlasszuk, amelynek a Cloud kategriban kell lennie (9-12 bra). Ha nem talljuk, akkor ellenrizzk, hogy a Windows Azure Toolkit for Windows Phone-t jl raktuk-e fel!

240

Felhasznl-hitelests szerveroldalrl

9-12 bra: A Windows Phone 7 Cloud Application projekttpus Ez a projekttpus nem egy res alkalmazst, hanem egy ksz sablont generl. Ehhez bizonyos alapinformcikra van szksge, amiket be is krdez tlnk. Az els kpernyn azt kell megadnunk, hogy hol akarjuk trolni fjljainkat (azaz egy Azure Storage account-ot), valamint hogy milyen Push Notification tpusokat szeretnnk hasznlni. Ezttal dolgozhatunk az Azure Storage emultorral is, gy pipljuk be az Use Storage Emulator jellngyzetet, majd kattintsunk a Next gombra! A kvetkez prbeszdablakban kell megadnunk a hasznlni kvnt hitelestsi mechanizmust. Itt bejellhetnnk az ASP.NET Membership-et, de a plda kedvrt hasznljuk az Access Control Service-t. Vlasszuk teht az Use the Windows Azure Access Control Service lehetsget! Megjelenik kt szvegmez, ahov az ACS hitelestsi adatainkat kell bernunk. Ezeket az Azure menedzsment portlrl tudjuk leszedni, gyhogy nyissuk meg a portlt a http://windows.azure.com cmen! A portl bal als sarkban kattintsunk a Service Bus, Access Control & Caching kategrianvre! Megnylik a kategria. A bal fels sarokban vlasszuk az Access Control elemet! Megjelennek a mr ltrehozott Access Control nvtereink. Ha mg nincs egy sem, akkor a New gomb segtsgvel hozzunk egyet ltre, s vrjuk meg, amg sttusza Activating-rl Active-ra vlt! Ez nhny percig is eltarthat! Miutn a fentiekkel elkszltnk, jelljk ki nvternket, s a szalagon kattintsunk r az Access Control Service gombra (9-13 bra)! Megnylik egy jabb webes interfsz, ahol szolgltatsunkat konfigurlhatjuk. Ezt nagyrszt elvgzi majd helyettnk a varzsl. Most mindssze annyi dolgunk van, hogy leszedjk a portlrl az ACS konfigurlshoz szksges hitelestsi adatokat.

241

9. Kommunikci szerverrel

9-13 bra: Az Access Control a Windows Azure portlon Az Access Control webes interfsznek bal oldaln kattintsunk a Management service elemre, majd vlasszuk a Management Client elemet a Management Service Accounts listbl! Megjelennek az Access Control szolgltatsunk menedzselshez hasznlhat hitelestsi adatok. Kattintsunk a Password elemre, s msoljuk ki az ott megjelentett rtket (9-14 bra)!

9-14 bra: Access Control szolgltatsunk menedzsment-jelszava

242

sszefoglals Access Control szolgltatsunk nevt s az imnt kimsolt jelszt illesszk be a Visual Studio prbeszdpanelbe, majd kattintsunk az OK gombra! A varzsl ltrehozza az alkalmazssablont. Ez egy komplex mveletsor, mert a kdgenerlson fell Access Control szolgltatsunk konfigurcija is megtrtnik a httrben, gy egy ideig eltarthat. A kd ltrehozsa utn kaphatunk egy Visual Studio figyelmeztetst, hogy projektnket jra be kell tlteni. Ha ez megtrtnik, a Reload gombra kattintva hagyjuk jv a mveletet! Alkalmazsunk rgtn ksz is a tesztelsre. Indtsuk el az F5 gombbal! Ennek hatsra beindul a szerveroldali komponens az Azure emultorban. Mellette kln indtsuk el a Windows Phone alkalmazst is: jobb gombbal kattintsunk az AcsSample.Phone projekt nevre, s a Debug almenbl vlasszuk a Start new instance menpontot! A telefonalkalmazs megnylik, s bejelentkezhetnk az ltalunk vlasztott hitelests-szolgltat segtsgvel. Az alkalmazs teljes forrskdjt pedig megtekinthetjk a Visual Studiban. Az eddig megismert tmakrkhz hasonlan az Access Control szolgltatsbl is csak a legszksgesebbeket lttuk. rdemes utnaolvasni a Toolkit honlapjn s az Azure dokumentumaiban. Vegyk figyelembe, hogy az ACS (az Azure tbbi szolgltatshoz hasonlan) nllan is ignybe vehet, radsul hasznlata meglehetsen olcs, gy rdemes elgondolkodnunk alkalmazsn!

sszefoglals
A fejezetben megismertk, hogy alkalmazsfejleszts kzben milyen lehetsgeink vannak az interneten keresztl trtn kommunikcira. Egy hlzati kpessgekkel felruhzott alkalmazs tllp a telefon korltain, s kzssgi szolgltatsokat nyjthat, vagy a kszlk kpessgeinl sokkal nagyobb erforrsigny feladatokat is elvgezhet. rdemes lni a platform ltal nyjtott lehetsgekkel!

243

10. Lapkk s rtestsek


A Windows Phone egyedi lehetsget biztost a felhasznlval val kapcsolattartsra ez pedig a live tile (magyarul l lapknak fordthatjuk). A telefon kezdlapja nem lettelen ikonokbl ll, amelyeket esetleg egy szm megjelentsvel dinamikuss lehet tenni, hanem nagymret lapkkbl, melyek tartalmt a fejleszt szabadon vltoztathatja ahogyan azt a 10-1 bra mutatja.

10-1 bra: Windows Phone lapkk A lapkkon kpeket, szveget vagy szmot jelenthetnk meg. Frissthetjk ket az alkalmazs futtatsa kzben, de akr szerveroldalrl, az alkalmazs futsa nlkl is. Alkalmazsunkhoz akr tbb lapka is tartozhat, pldul minden folyamatban lv jtszmhoz egy-egy. A lapkkhoz mint rtestsi fellethez szorosan kapcsoldnak a Windows Phone ltal knlt tovbbi rtestsi szolgltatsok. A lapkk a telefon kezdkpernyjn kapnak helyet, gy ha ms mdon nem tudnnk zenni a felhasznlnak, fontos esemnyekrl maradna le. Ezrt lehetsgnk van felugr zenetet (toast notification) is kldeni ilyen pldul az SMS rkezsekor lthat sv. Ezek az zenetek a felhasznl aktulis tevkenysgtl fggetlenl mindig megjelennek, ahogyan azt a 10-2 bra illusztrlja.

10-2 bra: Felugr zenet Vgl az is lehet, hogy egy kls esemnyrl nem a felhasznlt szeretnnk tjkoztatni, hanem a telefonon fut alkalmazsunknak akarunk zenni. A platform eszkzeivel erre is lehetsgnk van. A fejezetben rszletesen megismerkednk a lapkk s a tovbbi rtestsi szolgltatsok kpessgeivel, programozsval. Ha ezeket jl tudjuk hasznlni, akkor sokkal gazdagabb lmnyt knlhatunk, mintha

245

10. Lapkk s rtestsek alkalmazsunk csak bezrsig mkdne. A felhasznlt mr a kezdkpernyrl folyamatos informcikkal lthatjuk el, s vals idben rtesthetjk a szmra fontos esemnyekrl, gy sokkal valsznbb, hogy jra s jra visszatr majd alkalmazsunkhoz.

Nhny plda a lapkk s rtestsek hasznlatra


Kzssgi oldalunkhoz tartoz alkalmazsunk szmmal jelentheti meg a felhasznl olvasatlan zeneteinek szmt, szveggel pedig kirhatja a legjabb zenetet. gy a felhasznl egyrszt nyomon kvetheti a trtnseket, msrszt pedig ksztetst rez majd az alkalmazs megnyitsra. Idjrs-elrejelz alkalmazsunkban a lapkt rendszeresen frissthetjk a vrhat idjrssal. zlses kpek hasznlatval szinte biztosra vehetjk, hogy a felhasznl kitzi majd kezdlapjra alkalmazsunkat. Hasonlkpp rdemes lapkkat hasznlni minden olyan alkalmazsban, ami gyakran vltoz, viszonylag kevs informcit kzl a felhasznlval legyen az nvnap-elrejelz, rszvnyrfolyam-letlt vagy focipontszm-nyilvntart. Sakk-alkalmazsunkban minden egyes folyamatban lv jtszmhoz tartozhat egy lapka. Ha az ellenfl megtette lpst, ezt a lapkn keresztl kzlhetjk a felhasznlval; pedig arra nyomva egybl a megfelel jtszmban tallhatja magt. Egy lgitrsasg alkalmazsa felugr zenettel rtestheti a felhasznlt, ha jratval brmi trtnik gy a felhasznl a weboldal folyamatos nzegetse nlkl is llandan napraksz lehet. Ahelyett, hogy rendszeres idkznknt krdezgetnnk (s gy feleslegesen terhelnnk) a szervert, sportfogad-alkalmazsunkban a szerver zenhet az alkalmazsnak, ha brmi vltozs trtnt gy az alkalmazs mindig a legfrissebb informci birtokban van, felesleges adatforgalom nlkl.

A lapkk tulajdonsgai
A lapkk egyszer, egyszn ngyzeteknek tnnek, m valjban rengeteg jellemzvel s kpessggel ruhztk fel ket a Windows Phone fejleszti. A kvetkezkben megismerkednk ezekkel a jellemzkkel, hogy ksbb hatkonyan tudjuk ket felhasznlni.

Mret
A Windows Phone ktfle mret lapkt tmogat: ngyzet alakt, melyekbl kett fr egyms mell, s szleset, mely nagyjbl kt ngyzet szlessgnek megfelel. A 10-3 bra fels rszben a ngyzet alak, als rszben pedig a szlesebb lapkt lthatjuk.

10-3 bra: A ktfle mret Windows Phone lapka

246

A lapkk tulajdonsgai Szles lapkja mindssze nhny beptett Windows Phone alkalmazsnak van ilyenek pl. a Calendar s a Pictures. Mi, fejlesztk kizrlag ngyzet alak lapkval rendelkez alkalmazsokat tudunk fejleszteni, a szles lapkk szmunkra nem hasznlhatk. A pontossg kedvrt: a Windows Phone teljes kijelzje 480 pixel szles s 800 pixel magas; a ngyzet alak lapkk 173 pixel szlesek s magasak.

Kiszgezs s elrendezs
A lapkk fontos jellemzje, hogy egy telefon felhasznljaknt tetszsnknek megfelelen rendezhetjk el ket megvltoztathatjuk sorrendjket, s trlhetjk is ket a kezdkpernyrl. A frissen felteleptett alkalmazsok alaprtelmezsknt nem kerlnek ki a kezdkpernyre, s a lapka trlsvel a hozz tartoz alkalmazs nem kerl eltvoltsra. Mivel a kezdkpernyt a felhasznl a telefon minden bekapcsolsakor ltja, ezrt nagyon j, ha alkalmazsunk lapkja is megjelenik ott. Azonban lapka kitzst kdbl mg kezdemnyezni sem tudjuk, arra kizrlag a felhasznlnak van joga. Ez csak az alkalmazs elsdleges lapkjra rvnyes; a rszleteket lsd ksbb, a msodlagos lapkk trgyalsnl.

Statikus s dinamikus lapkk


Ha egy alkalmazst fejlesztnk, az kln programozi erfeszts nlkl is kitzhet lesz a kezdkpernyre, azaz rendelkezik majd lapkval. m alaprtelmezsknt ezek a lapkk mindssze az alkalmazs ikonjbl s nevbl llnak, megnyomskor az alkalmazs kezdlapjra visznek vagyis ezek a statikus lapkk, ahogyan azt a 10-4 bra illusztrlja.

10-4 bra: Statikus lapka az alkalmazs nevvel s ikonjval A ksbb megismert technikkkal a lapka tartalmt frissthetjk, animlhatjuk. Az ilyen kpessgekkel felruhzott lapkkat nevezzk dinamikusnak. Egy ilyen dinamikus lapkra mutat pldt a 10-5 bra.

10-5 bra: Dinamikus lapka, a tartalmt a program frissti

A lapkk felptse
A lapkk megjelentst egy sor elre definilt tulajdonsggal szablyozhatjuk (ezek kdbl trtn felhasznlst ksbb trgyaljuk). Minden tulajdonsg pontosan meghatrozott mdon vltoztatja meg a

247

10. Lapkk s rtestsek lapka megjelenst. Pldul a cm mindig a bal als sarokban, ugyanazzal a bettpussal jelenik meg. Nem ktelez minden tulajdonsgot belltanunk. Minden lapka kt fellettel rendelkezik: egy ellsvel s egy htsval. Alaprtelmezsknt csak az ells fellet lthat; ha a htsnak is adunk valamilyen tartalmat, akkor a lapka idnknt megfordul a tengelye krl, hogy azt is mutassa. Az ells fellet lehetsges tulajdonsgai: Httrkp a teljes lapkt kitlt kp (emlkeztetl: a lapkk 173 pixel szlesek s magasak). Cm kis betkkel, a bal als sorban megjelen felirat. Szmll a jobb fels sarokban, kr kzepre rt szm. rtke minimum 1, maximum 99 lehet (0 esetn nem jelenik meg), ahogyan azt a 10-6 bra mutatja.

10-6 bra: Lapka cmmel s szmllval A hts fellet lehetsges tulajdonsgai: Httrkp a teljes lapkt kitlt kp, s ez ms lehet, mint az ells fellet kpe. Cm kis betkkel, a bal als sorban megjelen felirat, amely szintn klnbzhet az ells fellet cmtl. Tartalom nagyobb betkkel, a lapka fels rszben megjelen felirat, amint azt a 10-7 bra mutatja.

10-7 bra: Egy lapka hts fellete cmmel s tartalommal Ezeket a tulajdonsgokat hasznlva a tbbi Windows Phone alkalmazssal konzisztens lapkkat hozhatunk ltre. Ha valamirt teljesen egyedi formatervet szeretnnk, akkor csak a httrkpet hasznljuk, amire aztn tetszsnk szerint brmit rajzolhatunk.

Msodlagos lapkk
Amint korbban lttuk, minden Windows Phone alkalmazs rendelkezik legalbb egy lapkval. Ennek angol neve: application tile. Fejlesztknt lehetsgnk van tovbbi, msodlagos lapkk (angolul: secondary tile) ltrehozsra is. Pldul ha egy jtkszoftvert runk, akkor minden egyes folyamatban lv jtkhoz tartozhat egy msodlagos lapka. A msodlagos lapkk ltrehozsra kicsit eltr szablyok vonatkoznak, mint az elsdlegesekre. Msodlagos lapkt mr ltrehozhatunk kdbl, m ehhez az albbi feltteleknek kell teljeslnik:

248

Lapkk ltrehozsa s frisstse alkalmazsunkbl A msodlagos lapka kitzst vgz kd csak egy egyrtelmen erre a clra szolgl vezrlelem hatsra futhat le. Azaz rendelkeznnk kell egy Lapka hozzadsa gombbal vagy jellngyzettel. Ezt a korltozst az alkalmazs piactrbe (Marketplace) val feltltsekor ellenrzik le ha nem tettnk neki eleget, alkalmazsunkat visszautastjk. Figyelembe kell vennnk, hogy a msodlagos lapka kitzst kveten programunkat lelltja a telefon, s a kezdkpernyre visszaugorva megmutatja a felhasznlnak a frissen kitztt lapkt.

Ezek a szablyok a felhasznl biztonsgt szolgljk. Senki sem szeretn, hogy egy vletlenl felteleptett rosszindulat (vagy csak hanyagul megrt) alkalmazs teleszemetelje gondosan kialaktott kezdkpernyjt. A szablyokat betartva tetszleges szm msodlagos lapkt hozhatunk ltre ez nem jelent biztonsgi problmt, hiszen minden egyes msodlagos lapka ltrehozst a felhasznlnak kell kezdemnyeznie. Ha a felhasznl trli az alkalmazs elsdleges lapkjt, a msodlagos lapki mg megmaradnak.

Deep Linking
A msodlagos lapkk nagy elnye, hogy megadhatjuk, azok pontosan hogyan is indtsk el alkalmazsunkat. A msodlagos lapkk ltrehozsakor ugyanis be kell lltanunk egy alkalmazsunkra mutat URL-t is. Ez egyrszt tartalmazza, hogy alkalmazsunk mely kpernyjt (XAML fjljt) nyissa meg a lapka, msrszt ennek a kpernynek (XAML fjlnak) paramtereket is t tudunk adni. Egy ilyen URL lehet pldul az albbi:
/MainPage.xaml?id=3

Webprogramozknak ez a felpts ismers lehet az interneten is ugyangy tudunk paramtereket tadni egy webalkalmazsnak. Fontos, hogy minden msodlagos lapknak klnbz linkkel kell rendelkeznie. Ha egy mr ltez linket megprblunk jra felhasznlni, futsidej hibt (InvalidOperationException) kapunk.

Lapkk ltrehozsa s frisstse alkalmazsunkbl


A ShellTile API
A Windows Phone els, 7.0-s kiadsban a lapkkat kizrlag egy kls szerver ignybevtelvel lehetett frissteni. Ez esetenknt jelents pluszmunkt s pluszkltsget jelenthetett. A 7.5-s, Mango kiadsban megjelent a ShellTile API, amivel mr alkalmazsunk kdjbl is tudjuk manipullni lapkinkat. A ShellTile API egyarnt alkalmas msodlagos lapkk ltrehozsra, s a mr ltez lapkk tulajdonsgainak frisstsre. Segtsgvel az alkalmazs futsa alatt tudunk mveleteket vgezni. Ha az alkalmazs futsn kvl, pldul valamilyen idzts szerint vagy kls esemny hatsra szeretnnk lapkinkat frissteni, akkor erre a ksbb ismertetett lehetsgeket hasznlhatjuk.

Lapka frisstse
Elsknt nzzk, hogyan lehet egy mr ltez lapka adatait frissteni! A mdszer ugyanaz elsdleges lapkk s msodlagos lapkk esetn is. A kd nagyon egyszer, azt egy pldaalkalmazson keresztl ismerhetjk meg: Hozzunk ltre egy j Visual Studio projektet! A projekt tpusa legyen az alaprtelmezett Windows Phone Application, neve LocalTileApiSample! Fontos, hogy a projekt ltrehozsa utn megjelen prbeszdpanelen Windows Phone OS 7.1 (vagy jabb) verzij projektet hozzunk ltre, amint azt a 10-8 bra mutatja.

249

10. Lapkk s rtestsek

10-8 bra: Windows Phone OS 7.1 vltozat hasznlata Ha ez a krds nem jelenik meg, akkor rgi SDK-t hasznlunk frisstsnk a legjabb verzira! A projekt ltrejtte utn helyezznk el az alkalmazs felletn egy j gombot, elsdleges lapka frisstse felirattal! Nevezzk el ezt UpdateAppTileButton-nak! A nyomgomb a szerkesztfelleten gy jelenik meg, ahogyan azt a 10-9 bra mutatja.

10-9 bra: Az j nyomgomb a szerkesztfelleten A szerkesztfelleten kattintsunk dupln a gombra, ezzel belpnk a gombhoz tartoz esemnykezel kdba. Szerezznk egy referencit az alkalmazsunkhoz tartoz elsdleges lapkra! Ehhez rjuk be az albbi sort:
var appTile = ShellTile.ActiveTiles.First();

A ShellTile objektumot alaprtelmezsknt nem ismeri fel a Visual Studio. gy begpelse utn rjuk a kvetkez sort a kdfjl legtetejre:
using Microsoft.Phone.Shell;

Az els kdsorbl lthat, hogy az ActiveTiles gyjtemny legfels elemt krjk el a platformtl. Ez az elem minden esetben az alkalmazs elsdleges lapkjt tartalmazza, s akkor is ltezik (azaz nem null), ha a lapka mg nincs kitzve a telefon kezdkpernyjre. A lapka frisstshez ltre kell hoznunk egy adatszerkezetet, amely a megadni kvnt j adatokat tartalmazza.
StandardTileData tileData = new StandardTileData();

Most lltsuk be a lapka tulajdonsgainak j rtkeit! Amint korbban lttuk, egyiket sem ktelez hasznlni sajt alkalmazsunkban majd csak azokat lltsuk be, amelyekre szksgnk van! Kezdjk a lapka ells oldaln tallhat cmmel s szmllval!
tileData.Title = "Ells cm"; //Cm az ells oldalon tileData.Count = 15; //Szmll az ells oldalon

250

Lapkk ltrehozsa s frisstse alkalmazsunkbl Adjunk meg egy httrkpet is! Egy lapkra elre elksztett, statikus kpet is helyezhetnk, vagy akr egy kpfjlra mutat internetes URL-t is megadhatunk. Kezdjk most egy elre gyrtott kppel! Kedvenc kpszerkeszt alkalmazsunkban hozzunk ltre egy kpet! rdemes 173173 pixelesre gyrtani, de ha eltr mrett hozunk ltre, akkor a telefon azt tmretezi majd neknk. Mentsk el a kpet PNG vagy JPG formtumban, AppTileBackground nven! Trjnk vissza a Visual Studiba, s a Solution Explorer ablakban kattintsunk jobb gombbal a projekt nevre (LocalTileApiSample), majd az Add menbl vlasszuk az Existing Item... menpontot (10-10 bra)! Tallzzuk ki az imnt ltrehozott kpet, s szrjuk be alkalmazsunkba!

10-10 bra: Az Add Existing Item funkci kivlasztsa Most kzlnnk kell a Visual Studival, hogy a frissen megadott fjlt tartalomknt akarjuk hasznlni ezutn tudunk majd kdbl hozzfrni. A Solution Explorer-ben jelljk ki a frissen beszrt fjlt, majd a Properties ablakban lltsuk Build Action tulajdonsgt Content rtkre!

10-11 bra: Kpfjl felvtele az alkalmazsba tartalomknt Miutn ezzel elkszltnk, mr nincs ms dolgunk, mint berni a tileData adatstruktrba az gy ltrehozott kp URL-jt.
tileData.BackgroundImage = new Uri("/AppTileBackground.png", UriKind.Relative);

A sor vgn tallhat UriKind.Relative paramter nagyon fontos. Ez adja meg, hogy az URL relatvknt rtelmezend. Ha ezt nem rjuk be, a program hibra fut.

251

10. Lapkk s rtestsek Ezzel elkszltnk a lapka els oldalnak belltsval. Alkalmazzuk az idig elkszlt belltsokat, s nzzk meg, mit alkottunk! Az elkszlt belltsok letbelptetshez az albbi sort kell bernunk.
appTile.Update(tileData);

Futtassuk programunkat az F5 megnyomsval! Az emultorban tzzk ki a programot a telefon kezdkpernyjre, majd lpjnk be abba, s nyomjuk meg az Elsdleges lapka frisstse gombot! Ha ezutn visszatrnk a kezdkpernyre, ltni fogjuk, hogy a lapka tulajdonsgai tnyleg megvltoztak, amint azt a 10-12 bra is mutatja.

10-12 bra: A lapka megjelense a kezdkpernyn Trjnk vissza a Visual Studihoz, s lltsuk be a lapka hts felletnek tulajdonsgait is! A kvetkez kdrszleteket az appTile.Update(tileData); sor fl rjuk be! A htoldalon szintn van Title tulajdonsg; szmll viszont nincs, helyette Content van, amely egy szveges rtket vr.
tileData.BackTitle = "Htuls cm"; tileData.BackContent = "Tartalom";

Httrkpnek most ne egy helyi, hanem egy internetes kpet vlasszunk! Kedvenc kpkeres szolgltatsunkkal keressnk egy szimpatikus, kismret ikont, majd vgjuk ki ennek URL-jt a bngszbl! (A kp ne legyen tl nagy, mert a nagyon elhzd letltseket a telefon megszaktja!)
tileData.BackBackgroundImage = new Uri("http://IKON_AZ_INTERNETROL");

jra futtassuk le az alkalmazsunkat! Nyomjuk meg az Elsdleges lapka frisstse gombot, majd a telefon Windows gombjval lpjnk ki a kezdkpernyre! Nhny msodperc elteltvel (amit kizrlag a telefon hatroz meg, neknk nincs beleszlsunk) a lapka megfordul majd, s lthatjuk a belltsaink eredmnyt, amint azt a 10-13 bra mutatja:

10-13 bra: A lapka htoldala Ezzel a lapkk valamennyi tulajdonsgnak belltst s hasznlatt lttuk. A megrt teljes metdus trzse az albbi:

252

Lapkk ltrehozsa s frisstse alkalmazsunkbl

private void UpdateAppTileButton_Click(object sender, RoutedEventArgs e) { var appTile = ShellTile.ActiveTiles.First(); StandardTileData tileData = new StandardTileData(); tileData.Title = "Ells cm"; //Cm az ells oldalon tileData.Count = 15; //Szmll az ells oldalon tileData.BackgroundImage = new Uri("/AppTileBackground.png", UriKind.Relative); tileData.BackTitle = "Htuls cm"; tileData.BackContent = "Tartalom"; tileData.BackBackgroundImage = new Uri("http://IKON_AZ_INTERNETROL"); appTile.Update(tileData); }

Msodlagos lapka ltrehozsa


Amint korbban mr lttuk, alkalmazsunkhoz tartozhatnak msodlagos lapkk is. Ezeket (a felhasznl krsre) kdbl mi magunk hozhatjuk ltre. Ksztskkor pedig paramtereket pthetnk beljk, amiket megnyomsukkor megkap az alkalmazs, gy ezeket feldolgozva egybl programunk belsejbe (pl. a megfelel jtszmba, megfelel rszvnyhez stb.) vihetjk a felhasznlt. Hozzunk ltre programunk felletn kt gombot, egyiket Kk, a msikat Piros felirattal! A gombok megnyomsra alkalmazsunk egy-egy msodlagos lapkt hoz majd ltre. A Kk gomb hatsra ltrehozott msodlagos lapka kk httrsznnel, a msik pedig piros httrsznnel indtja majd programunkat. A gombok nevei legyenek BlueButton s RedButton! Ltrehozsuk utn kattintsunk dupln a Kk felirat gombra, hogy eljussunk a kdnzetbe! Msodlagos lapka ltrehozshoz ugyanarra a StandardTileData adatszerkezetre lesz szksgnk, mint amit az elz fejezetrszben is hasznltunk. Kihasznlva, hogy nem kell minden tulajdonsgot megadnunk, a leend msodlagos lapka csak cmet kap:
StandardTileData tileData = new StandardTileData(); tileData.Title = "Kk";

Az gy elkszlt msodlagos lapkt pedig egyszeren felvesszk az alkalmazs lapki kz:


ShellTile.Create(new Uri("/MainPage.xaml?color=blue", UriKind.Relative), tileData);

Nzzk meg figyelmesen a lapka begyazott URI-jt! Lthatjuk, hogy kt rszbl ll: egyrszt megadjuk a megnyitand Silverlight nzetet (MainPage.xaml), msrszt egy paramtert is tadunk (neve: color, rtke: blue). Alkalmazsunk e paramter alapjn tudja ellenrizni majd, hogy a felhasznl melyik lapka segtsgvel indtotta el. Miutn ezzel megvagyunk, az itt bert hrom sort msoljuk t a Piros gomb Click esemnynek kezeljbe is (gyelve arra, hogy a gomb feliratt s paramtert trjuk Piros-ra s red-re)! Most lltsuk be, hogy a lapkkra kattintva alkalmazsunk a megfelel httrsznben pompzva induljon azaz hasznljuk a Deep Linking lehetsget! A httrsznt bellt kdot akkor kell futtatnunk, amikor alkalmazsunk betltdik. Hasznljuk erre az OnNavigatedTo esemnyt! lljunk a kurzorral egy res kdsorhoz (mondjuk kzvetlenl a private void UpdateAppTileButton_Click sor fl), s gpeljk be:
override onnavigatedto

253

10. Lapkk s rtestsek A Visual Studio erre egy listbl felknlja szmunkra azt az esemnyt, amelynek kdjt fell szeretnnk rni. Nincs ms dolgunk, mint a Tab gomb megnyomsval ltrehozni ezt az esemnykezelt. Az esemnykezeln bell a NavigationContext objektum QueryString tulajdonsgn keresztl krhetjk el alkalmazsunk indtsi paramtereit. Elsknt megnzzk, hogy egyltaln kaptunk-e color nev paramtert, majd leellenrizzk, hogy ennek rtke blue-e. Ha egyezst tallunk, akkor alkalmazsunk httert kkre lltjuk.
if (NavigationContext.QueryString.ContainsKey("color") && NavigationContext.QueryString["color"] == "blue") { LayoutRoot.Background = new SolidColorBrush(Colors.Blue); }

Ezt a kdrszletet mg egyszer rtelemszeren felhasznlva tudjuk kezelni a piros szn esett is. Futtassuk az F5 gombbal alkalmazsunkat! Nyomjuk meg elbb a Kk, majd a Piros gombot! Ltni fogjuk, hogy a telefon mindkt gomb megnyomsra bezrja az alkalmazsunkat, s ltrehoz neknk egy-egy j msodlagos lapkt. A ltrehozott lapkkat megnyomva pedig alkalmazsunk jra elindul a kivlasztott httrsznnel. Ezt a mechanizmust kihasznlva a httrszn-vltsnl sokkal komplexebb bels navigcit is kivitelezhetnk. Fontos tudni, hogy egy adott URL- msodlagos lapkbl egyszerre csak egy lehet. Vagyis ha a Kk gombot mg egyszer megnyomjuk, akkor alkalmazsunk hibra fut. Egyszeren vdekezhetnk ez ellen a hibalehetsg ellen, ha a lapka kiraksa eltt ellenrizzk, hogy a ShellTile.ActiveTiles gyjtemny tartalmaz-e mr a ltrehozni kvnt URL-lel egy lapkt.

Msodlagos lapka trlse


Elfordulhat, hogy a kirakott msodlagos lapkkat trlni szeretnnk. Erre a felhasznlnak az alkalmazsunktl fggetlenl is van lehetsge, de az aktulis jtszma, replt, stb. lezrulta utn clszer automatikusan trlni a hozz tartoz, korbban ltrehozott lapkt. Hozzunk ltre egy jabb gombot felletnkn, Kk trlse felirattal, DeleteBlueButton nvvel, majd dupla kattintssal lpjnk be az esemnykezeljbe! A lapka trlshez egyszeren ki kell azt keresnnk a lapkk gyjtemnybl, majd meghvni a Delete() metdust. A kikeresshez hasznlhatjuk a lapka URL tulajdonsgt, amely garantltan egyedi ahogyan azt korbban mr bemutattam. Az albbi kdrszlet (a C#-ba ptett LINQ lekrdeznyelv segtsgvel) ellenrzi, hogy ltezik-e a trlni kvnt lapka a gyjtemnyben, s ha ltezik, letrli:
if (ShellTile.ActiveTiles.Count(i => i.NavigationUri.ToString() == "/MainPage.xaml?color=blue") > 0) { ShellTile.ActiveTiles.Single(i => i.NavigationUri.ToString() == "/MainPage.xaml?color=blue").Delete(); }

Vegyk szre, hogy a lekrdezshez hasznlt mdszert hasznlhatjuk a lapka ltrehozsa eltt is, annak ellenrzsre, hogy az nem ltezik-e mr!

Lapkk frisstse Background Agent-ek segtsgvel


A korbban bemutatott ShellTile API segtsgvel alkalmazsunk futsa alatt teljes kren tudjuk frissteni, bvteni s trlni lapkinkat. A lapkk igazi haszna azonban ppen abban rejlik, hogy azok kpesek alkalmazsunk futsa nlkl is frisslni! A kvetkez fejezetrszben a lapkk Background Agentbl val frisstst ismerjk meg. Ez a mdszer nem ignyel kls szervert, s idztett frisstst hasznl, azaz alkalmazsunk lellsa utn is mkdik.

254

Lapkk frisstse Background Agent-ek segtsgvel A Background Agent a Windows Phone 7.5-ben debtlt, s nem kizrlag a lapkk frisstsre val pp ellenkezleg, szmos egyb rendszeresen vgrehajtand vagy erforrs-ignyes feladat elvgzsre hasznlhat. Rszletes ismertetsvel a knyv 5. fejezete foglalkozik. A kvetkez oldalakon egy pldaprogramot ksztnk, amely egy Background Agentet regisztrl be. Ez a httrben futva rendszeres idkznknt frissti majd az alkalmazs lapkjt. A pldaprogram elksztse sorn csak a Background Agent funkcionalitsnak szksges rszt hasznljuk ki. A szolgltats teljes lersa megtallhat az 5. fejezetben. Ksztsnk egy j Visual Studio projektet; legyen ez egy Windows Phone Application! Projektnk neve legyen BackgroundAgentTileUpdateSample! Az elz fejezetrszhez hasonlan itt is Windows Phone OS 7.1 verzit (vagy jabbat) vlasszunk! A Background Agent kdjt kln projektbe kell helyeznnk. A Windows Phone Application projekt ltrejtte utn kattintsunk jobb gombbal a Solution Explorer ablak legtetejn tallhat Solution BackgroundAgentTileUpdateSample sorra, s az Add menbl vlasszuk a New Project lehetsget, amint azt a 10-14 bra mutatja!

10-14 bra: A Background Agent projekt hozzadsa Itt ismt tallkozunk a projektek listjval. Hozzunk ltre egy Windows Phone Scheduled Task Agent tpus projektet! Ennek neve maradhat az alaprtelmezett ScheduledTaskAgent1. Miutn mindkt projektnket ltrehoztuk, tudatnunk kell a telefonalkalmazssal, hogy hol tallja a neki rendelt Background Agent-et. Ehhez a BackgroundAgentTileUpdateSample projektbl fel kell vennnk egy referencit a ScheduledTaskAgent1 projektre. Kattintsunk jobb gombbal a BackgroundAgentTileUpdateSample projekt References mappjra, vlasszuk az Add Reference lehetsget, s a megjelen ablak Projects fln vlasszuk ki a ScheduledTaskAgent1 elemet! A projektfjlok ltrejtte utn a Visual Studio automatikusan megnyitja szmunkra a ScheduledAgent.cs llomnyt. A Background Agent futsakor az itt tallhat OnInvoke() metdust hvja meg a futtatkrnyezet, gy ide kell elhelyeznnk a lapkt frisst kdunkat. A metdus vgn mr megtallhat a NotifyComplete() hvs. Ez jelzi az opercis rendszer szmra, hogy a Background Agent elvgezte a rbzott feladatokat, s futsa lellthat. Ezrt ezt a sort ne trljk ki, s hagyjuk mindig a sajt kdunk utn! A lapka frisstsre a ShellTile API-t vehetjk ignybe, gy az elz fejezetrszben megismerteket hasznosthatjuk jra. Pldaalkalmazsunk az aktulis idt rja majd ki a lapkra. Egy les alkalmazs ennl termszetesen sokkal bonyolultabb logikt is meghvhat a Background Agent-bl. A kd megrshoz elszr is szksgnk van egy sor nvtrre. rjuk be az albbiakat a kdfjl (ScheduledAgent.cs) legtetejre!

255

10. Lapkk s rtestsek

using System; using System.Linq; using Microsoft.Phone.Shell;

Miutn ezzel megvagyunk, gpeljk be az albbi kdot az OnInvoke() metdusba (a NotifyComplete() fl)! Ez semmi jdonsgot nem tartalmaz, a lapka cmt frissti a ShellTile API segtsgvel:
StandardTileData tileData = new StandardTileData(); tileData.Title = DateTime.Now.ToShortTimeString(); ShellTile.ActiveTiles.First().Update(tileData);

A Background Agent-et ezzel felprogramoztuk. Magtl termszetesen nem fog lefutni, ehhez telefonalkalmazsunknak elbb idztenie kell azt. Minden Windows Phone alkalmazshoz legfeljebb egy Background Agent tartozhat. Ezt ktfle mdon idzthetjk:
PeriodicTask idztsi md: A Background Agent rvid ideig (25 msodpercig) kap futsi

jogot kb. 30 percenknt.


ResourceIntensiveTask idztsi md: bizonyos kls felttelek (pl. kls ramellts)

meglte esetn kap futsi jogot, 10 percig. A lapka frisstse jellemzen nem erforrs-ignyes, de rendszeresen szeretnnk elvgezni, gy a PeriodicTask idztsi mdot hasznljuk. Trjnk vissza a BackgroundAgentTileUpdateSample projektbe! A Background Agent idztst egy gomb vgzi majd. Fontos tudni, hogy idztse utn kt httel a Background Agent automatikusan trldik a rendszerbl, gy felhasznlnknak legalbb ilyen gyakorisggal jra kell idzttetnie clszer, ha egy les alkalmazsban erre valamilyen mdon emlkeztetjk. Hzzunk ki a kezelfelletre egy gombot; felirata legyen Background Agent idztse, neve pedig ScheduleBackgroundAgentButton! Miutn kihztuk, dupla kattintssal lpjnk be a gomb Click esemnykezeljbe! A kdfjl tetejre helyezzk el az albbi nvteret, ami a Background Agent-ek idztshez szksges eszkzket tartalmazza!
using Microsoft.Phone.Scheduler;

Az idzt az egyes Background Agent-eket nevk alapjn azonostja. Els feladatunk, hogy ellenrizzk, ltezik-e mr az ltalunk kvnt nven Background Agent. Ha igen, letrljk. (Ez knnyen elfordulhat, ha a felhasznl a kthetes automatikus trlsi idszak alatt jra kri a Background Agent idztst.) Ennek elvgzshez helyezzk az albbi sorokat a gomb esemnykezeljbe:
string periodicTaskName = "TileUpdaterSample"; PeriodicTask periodicTask = ScheduledActionService.Find(periodicTaskName) as PeriodicTask; if (periodicTask != null) ScheduledActionService.Remove(periodicTaskName);

Ezutn utastjuk a futtatkrnyezetet a Background Agent idztsre. Ehhez elszr egy objektum formjban ltrehozzuk s belltjuk a lerst (ezt ltja majd a felhasznl az opercis rendszer belltsai kztt, az pp fut Background Agent-ek listjban). Ezutn kvetkezik a tnyleges idzts. Ezt mindenkpp tegyk egy try...catch blokk belsejbe, ugyanis a felhasznl a telefon belltsai kztt letilthatja a Background Agent-eket, melyrl egy kivtel formjban rteslnk.

256

Lapkk frisstse Background Agent-ek segtsgvel

periodicTask = new PeriodicTask(periodicTaskName); periodicTask.Description = "This is the Tile Updater sample."; try { ScheduledActionService.Add(periodicTask); } catch (Exception ex) { MessageBox.Show(ex.Message); }

szrevehet, hogy a fenti kdban semmilyen mdon nem adtuk meg, melyik osztlyt kvnjuk az idztett feladat futtatsa sorn hasznlni. Ezt az opercis rendszer onnan tudja, hogy korbban felvettnk egy referencit a ScheduledTaskAgent1 projektre, s ezt Background Agent-nek ismerte fel. Ezzel tulajdonkppen elkszltnk, m a Background Agent-ek kb. 30 percenknt futnak, ami nagyon megnehezti a tesztelsket. A futtatkrnyezet biztost egy hvst, amellyel a Background Agent lefuttatsa nhny msodperc vrakozs utn kiknyszerthet. A prbafuttatshoz rdemes berni a kvetkez programsort is, de az alkalmazs publiklsa eltt felttlenl trljk ki, mert a Marketplace ellenrzsen valsznleg meg fog bukni!
ScheduledActionService.LaunchForTest(periodicTaskName, TimeSpan.FromSeconds(30));

Az F5 megnyomsval futtassuk alkalmazsunkat! Nyomjuk meg a Background Agent idztse gombot, majd az emultor Windows gombjval lpjnk ki programunkbl, hogy az Agent lefuthasson! Tzzk ki alkalmazsunkat a kezdkpernyre! Kisvrtatva tani lesznk a lapka frisslsnek, amint azt a 10-15 bra is mutatja.

10-15 bra: A Background Agent ltal frisstett lapka Ha szeretnnk, a Background Agent mkdst megszemllhetjk a telefon belltsai kztt is. Ehhez lpjnk be a telefon belltsai kz (Settings), lapozzunk az Applications flre, s nyomjuk meg a Background Tasks lehetsget (10-16 bra)!

257

10. Lapkk s rtestsek

10-16 bra: Background Agent-nk a telefon listjban A Background Agent segtsgvel alkalmazsunk a lellsa utn is naprakszen tarthatja lapkjt. Egy folyamatosan frissl lapka pedig j ok arra, hogy a felhasznl a kezdkpernyre tzve tartsa alkalmazsunkat. A Background Agent nagy elnye, hogy ehhez mg kls szerverre sincs szksge.

Lapkk frisstse ShellTileSchedule segtsgvel


Az elz kt fejezetrszben megismerkedtnk a ShellTile API-val s a Background Agent-ekkel. Mindkt mdszer segtsgvel a telefonon fut kdbl, imperatv mdon tudtuk frissteni lapkinkat, szerver ignybevtele nlkl. Bizonyos esetekben azonban knyelmesebb lehet, ha a szksges tartalmat nem a kszlken, hanem egy kiszolgln lltjuk el. A ShellTileSchedule arra ad lehetsget, hogy a megjelentend informcit szerveroldalon ksztsk el, a telefon pedig egyszeren csak letltse azt.

Idzts belltsa az elsdleges lapkra


Korbban megismerkedtnk a lapkk tulajdonsgaival. A ShellTileSchedule ezek kzl kizrlag a lapka ells felletn tallhat httrkpet tudja frissteni, a tbbi tulajdonsg ezen az API-n keresztl nem mdosthat. Hasznlathoz (a Background Agent-hez hasonlan) alkalmazsunk futsa kzben idztennk kell a frisstseket, amelyek utna a httrben futnak majd, alkalmazsunk lellst kveten is. Az idzts belltshoz az albbi paramtereket adhatjuk meg: A frissteni kvnt lapka (lehet elsdleges vagy valamelyik msodlagos lapka is) Hnyszor trtnjen meg a frissts (egyszer, fix alkalommal vagy hatrozatlan ideig)? Milyen gyakran trtnjen meg a frissts (rnknt, naponta, hetente vagy havonta)?

Milyen URL-rl tltdjn le a kp? A letltsre kivlasztott kp kizrlag internetes URL-rl szrmazhat, azaz nem hasznlhatunk a telefonon lv helyi erforrsokat. A kpfjl maximum 80 kilobjtos lehet, s letltse nem tarthat 30 msodpercnl tovbb. Ha az idztett mvelet vgrehajtsa 3 egymst kvet alkalommal sikertelen, akkor az idztst trli a futtatkrnyezet. rjunk egy rvid pldaprogramot, ami bemutatja a ShellTileSchedule hasznlatt! Az eddigiekhez hasonlan hozzunk ltre egy j Windows Phone Application tpus projektet ShellTileScheduleSample nven, Windows Phone OS 7.1 vagy jabb verzit clozva! A ShellTileSchedule belltst mr rgtn az alkalmazs indulsakor elvgezzk. Ehhez kdunkat helyezzk a MainPage() konstruktorba, kzvetlenl az InitializeComponent() metdushvs utn! Lapknkat hatrozatlan ideig, rnknt szeretnnk frissteni. 258

Lapkk frisstse ShellTileSchedule segtsgvel Az idzts belltshoz egy ShellTileSchedule tpus objektumot hasznlunk. Belltjuk a kvnt paramtereket, majd a Start() metdus hvsval rvnybe lptetjk az idztst.
ShellTileSchedule schedule = new ShellTileSchedule(); schedule.Recurrence = UpdateRecurrence.Interval; schedule.Interval = UpdateInterval.EveryHour; schedule.MaxUpdateCount = 0; schedule.RemoteImageUri = new Uri("http://www.weather.gov/forecasts/graphical/images/conus/MaxT1_conus.png"); schedule.StartTime = DateTime.Now; schedule.Start();

Nzzk meg az egyes paramterek jelentst! A Recurrence tulajdonsg rtktl fgg, hogy idztsnk hnyszor fut le. Az UpdateRecurrence.Interval rtk esetn tbbszr is, az UpdateRecurrence.Onetime rtk esetn pedig csak egyszer. Az Interval tulajdonsg adja meg, hogy lapknk milyen gyakorisggal frissljn. Lehetsges rtkei: EveryHour, EveryDay, EveryWeek s EveryMonth. A tulajdonsg rtkt csak akkor veszi szmtsba a telefon, ha a lapka nem csak egyszer frisstend (lsd Recurrence tulajdonsg). A MaxUpdateCount segtsgvel klnbztethetjk meg a hatrozatlan ideig fut s a bizonyos idre szl idztseket. Ha a tulajdonsg rtke nagyobb, mint 0, akkor a lapka a megadott szm alkalommal lesz frisstve. Ha 0 vagy annl kisebb, akkor nincs korlt a frisstsek szmra. (Ha a Recurrence tulajdonsgnl UpdateRecurrence.Onetime rtket adtunk meg, akkor ennek a belltsnak nincs rtelme.) A RemoteImageUri tulajdonsggal llthatjuk be a letlteni kvnt kp cmt. Fontos, hogy ez csak az internetrl szrmazhat (azaz helybl nem). Egy les alkalmazsnl ennek kiszolglsra egy sajt szervert hasznlhatunk, amely egy adott URL-en egy dinamikusan frissl kpet tesz elrhetv. Ez ASP.NET Web Forms esetn pldul kpeket visszaad Handler-ek (ASHX fjlok) segtsgvel oldhat meg, de a tovbbi webes technolgik is biztostanak erre lehetsget. A StartTime tulajdonsggal hatrozhatjuk meg az idzts kezd idpontjt.

Vgl a Start() metdushvs kiadja a parancsot az idzts tnyleges elvgzsre. Ezt kveten a telefon megvrja a StartTime idpontot, s onnantl kezdve a megadott belltsok szerint vgzi a lapka frisstst. A fenti tulajdonsgok hasznlatval kszthetnk egyszeri alkalommal, hatrozott alkalommal vagy akr hatrozatlan ideig fut idztseket is. Ne feledjk azonban a korbban ltott korltozsokat! Hrom egymst kvet sikertelen frisstsi ksrlet utn (azaz ha a kpfjl nagyobb, mint 80 KB, vagy letltse 30 msodpercnl tovbb tart) a telefon trli az idztst. Ezrt clszer, ha alkalmazsunk minden egyes indtsakor jra s jra elvgzi a belltst. A kd megrsa utn indtsuk el alkalmazsunkat, majd lpjnk ki belle s tzzk ki a kezdkpernyre. Nmi id elteltvel megtrtnik a frissts; eredmnye a 10-17 brhoz hasonlt majd. Lehet, hogy erre sokat kell vrnunk (akr egy rt is), mert az energiatakarkossg rdekben az esedkes frisstseket sszegyjti s egyszerre hajtja vgre a telefon.

259

10. Lapkk s rtestsek

10-17 bra: A ShellTileSchedule ltal frisstett lapka

Idzts belltsa egy msodlagos lapkra


Hogy llthatunk be ShellTileSchedule idztst egy msodlagos lapkra? Az objektum paramterezse nem vltozik, csak ltrehozsakor t kell neki adnunk a frissteni kvnt msodlagos lapkt. (Emlkezznk vissza, hogy a msodlagos lapkkra mutat referencikat a ShellTile.ActiveTiles gyjtemnyben talljuk, ahol az els elem az elsdleges lapka, az sszes tbbi elem pedig az pp aktulis msodlagos lapka.) gy ha egy msodlagos lapkra szeretnnk idztst ltrehozni, fenti pldakdunkat gy kellene mdostanunk:
ShellTileSchedule schedule = new ShellTileSchedule(tile);

A tile vltozba egy ShellTile tpus objektumot vr a telefon.

Idzts trlse
Elfordulhat, hogy a ltrehozott ShellTileSchedule rtelmt veszti, gy szeretnnk azt letrlni. Egy idzts trlshez elszr referencit kell r szereznnk, majd meg kell hvnunk a Stop() metdust. Elfordulhat, hogy az idztst a programunk egy korbbi futsakor lltottuk be, gy az eredeti ShellTileSchedule objektum termszetesen mr nem elrhet. Ilyenkor egyszeren jra ltrehozzuk s elindtjuk az idztst, majd rgtn le is lltjuk. Mivel egyszerre csak egy ShellTileSchedule lehet aktv lapknknt, ezzel fellrjuk a korbbi idztst, a frissen ltrehozott pldnyt pedig lelltjuk, azaz nem lesz aktv idzts.
ShellTileSchedule schedule = new ShellTileSchedule(); schedule.Recurrence = UpdateRecurrence.Interval; schedule.Interval = UpdateInterval.EveryHour; schedule.MaxUpdateCount = 0; schedule.RemoteImageUri = new Uri("http://www.weather.gov/forecasts/graphical/images/conus/MaxT1_conus.png"); schedule.StartTime = DateTime.Now; schedule.Start(); schedule.Stop();

A felugr rtestsek
A fejezetben idig alaposan megismerkedtnk a lapkkkal s klnbz frisstsi lehetsgeikkel. Amint a bevezetben arrl mr sz volt, a lapkkon kvl a felugr rtestsek is fontos mdjai a felhasznlval val kapcsolattartsnak. A lapkk passzvak, hasznlatukhoz a felhasznlnak ki kell tznie alkalmazsunkat a kezdkpernyre, s a lapkkon tallhat informci csak akkor jut el hozz, ha ksbb rjuk is nz. A felugr rtestsek (angolul: toast notification) ezzel szemben aktvak! Brmilyen alkalmazst is futtat a felhasznl, az elkldtt rtests mindenkppen megjelenik a telefon kijelzjnek 260

A Push Notification szolgltats fels rszn, rnyomva pedig egybl a hozz tartoz alkalmazs indul be. Termszetesen vatosan kell bnnunk az rtestsekkel ha tl agresszvan, felesleges zenetekkel bombzzuk a felhasznlt, lehetsge van letiltani alkalmazsunk rtestseit. Mrtkkel hasznlva viszont hatkonyan hvhatjuk fel alkalmazsunkra a figyelmet. A megjelen rtestsek bal oldaln alkalmazsunk ikonjnak kicsinytett vltozata tallhat. Az alkalmazs ikonja termszetesen vltoztathat (errl lsd a korbbi fejezeteket), de az rtestsekhez nem llthat be kln ikon. Az ikon melletti flkvr szveg az rtests cme, majd ezt kveti az rtests tartalma. Ez a kt szveg mr llthat, m sszesen kb. 40-50 karakter jelenik meg, a tbbi kilg a kpernyrl s nem lthat. Vgl a lapkkhoz hasonlan az rtestseknl is hasznlhatjuk a Deep Linking technikt, gy egy URI-t is bellthatunk az rtests mgtti tartalom elrshez (10-18 bra).

10-18 bra: Egy felugr rtests Az rtestsek fontos megktse, hogy csak alkalmazsunkon kvl jelennek meg. Azaz ha fut az alkalmazsunk, nem tudunk rtestst kldeni. Ennek megfelelen csak Background Agent-bl (illetve a fejezet ksbbi rszben ismertetett Push Notification szolgltats segtsgvel) van lehetsgnk megjelenteni egyet! Az rtestsek kezelshez szksges kd igen egyszer. A lapkknl mr rszletesen megismertk a Background Agent-ek ksztst. Vgezzk el az ott lert lpseket (azaz hozzunk ltre egy Windows Phone Application projektet, vegynk fel mell egy Windows Phone Scheduled Task Agent projektet, adjunk hozz erre egy referencit az els projektbl stb.), majd a Scheduled Task Agent projektben tallhat ScheduledAgent.cs fjl OnInvoke() metdusban helyezzk el a kvetkez kdot:
ShellToast toast = new ShellToast(); toast.Title = "rtests"; toast.Content = "Az zenet tartalma"; toast.Show();

A toast objektumnak van mg egy NavigationUri tulajdonsga is. Ha ennek rtkt nem adjuk meg, akkor az rtestsre nyomva a felhasznl alkalmazsunk kezdkpernyjt ltja majd megjelenni. Ha viszont szeretnnk hasznlni a Deep Linking lehetsget, akkor a lapkknl lertakkal azonos mdon itt is megtehetjk. Ne feledjk el befejezni a lapkknl megismert mveleteket, azaz rjuk meg a Background Agent-et beregisztrl kdot is! Miutn ezzel elkszltnk, indtsuk el az alkalmazsunkat, regisztrljuk be a Background Agent-et, majd a telefon Windows gombjnak segtsgvel lpjnk ki az alkalmazsbl (ez fontos, klnben az rtests nem lesz lthat)! Nhny msodperc elteltvel megjelenik az rtests.

A Push Notification szolgltats


A fejezet eddigi rszben megismertk a Background Agent szolgltatst s a ShellTileSchedule osztlyt. A Background Agent szolgltatssal tetszleges kdot futtathatunk a httrben. gy kommuniklhatunk szerverrel, frissthetnk lapkkat, s megjelenthetnk rtestseket. A ShellTileSchedule osztllyal pedig telefonunk idztetten krhet adatokat egy szervertl egy lapka frisstshez. Azaz kt mdszert is lttunk mr a szerveroldali kommunikcira. Viszont mindkt mdszer csak krni tud adatokat (azaz pull irnyban mkdik). gy alkalmazsaink s a felhasznlk is a klnfle esemnyekrl hatatlanul ksssel rteslnek, hiszen csak bizonyos

261

10. Lapkk s rtestsek idkznknt kapnak frisstst. Radsul, ha sokig nem trtnik semmi, akkor felesleges krsekkel fogyasztjk a telefon akkumultort. A Push Notification mechanizmus segtsgvel az alkalmazsunkat futtat telefont sszekapcsolhatjuk egy ltalunk fenntartott szerveroldali alkalmazssal. Az sszekapcsols utn kiszolglnk brmikor kldhet a telefonnak zeneteket. Ez push irny forgalom lesz, azaz nem alkalmazsunknak kell krsekkel bombznia a szervert, hanem a szerver zenhet valamilyen esemny megtrtntekor. Ebben a fejezetrszben a Push Notification szolgltats tulajdonsgaival, hasznlatval ismerkednk meg.

A Push Notification szolgltats mkdse


A Push Notification szolgltats architektrja 3 elembl ll: az ltalunk rt telefonalkalmazsbl, a szintn ltalunk rt szerveroldali alkalmazsbl s a kzponti Microsoft Push Notification Service-bl (MPNS). Hasznlata a kvetkezkppen nz ki: 1. Alkalmazsunk jelzi a telefon fel, hogy szeretne push zeneteket fogadni. 2. A telefon opercis rendszernek rszt alkot Push kliens az interneten t kzli ezt a szndkot az MPNS-szel. Az MPNS egy publikus URL-t llt el, s vllalja, hogy az ide rkez zeneteket tovbbtja a telefonnak. Ezt az URL-t pedig visszakldi a Push kliensnek, aki visszaadja az alkalmazsuknak. 3. Alkalmazsunknak ezt az URL-t kzlnie kell a szervernkkel. Erre tetszleges kommunikcis forma hasznlhat. rdemes webszolgltatsokkal megoldani, amikrl a 9. fejezetben bvebben esik sz. 4. Ha szervernk ezutn brmikor zenni szeretne a telefonnak, akkor erre az URL-re kldi el zenett. Ezt az MPNS kapja meg, s tovbbtja a kszlk fel. A szerveroldali komponens platformfggetlen elemeket hasznl (XML formtum zeneteket kell kldenie), gy tetszleges szerveroldali technolgival megrhat. Ebben a fejezetrszben ASP.NET nyelven programozzuk majd. A Microsoft Push Notification Service ingyenes mind a fejlesztk, mind az alkalmazs-felhasznlk szmra. Hasznlata azonban az albbi felttelekhez kttt: A Push Notification-ket a felhasznlnak kimondottan krnie kell az alkalmazs felletn tallhat valamilyen vezrlelemmel (opt-in rendszer). Ezenkvl lehetsget kell neki biztostani az rtestsek kikapcsolsra is. (Ha ezeknek a feltteleknek nem tesznk eleget, az alkalmazst visszautasthatjk a Marketplace-bl.) A fentebb lert regisztrcis lpsek egy csatornt hoznak ltre az MPNS s a telefon kztt. Telefononknt maximum 30 ilyen csatorna lehet, azaz fel kell r kszlnnk, hogy a korbban teleptett alkalmazsok mr mindet lefoglaltk, s a mi alkalmazsunknak nem jut hely. Alkalmazsonknt maximum 1 csatorna ltezhet. Ez a korltozs szerencsre nem slyos, mert az alkalmazsunk elz futsaikor ltrehozott csatornt lehetsgnk van jrahasznostani. Szervernk s az MPNS kztt alaprtelmezsknt HTTP (titkostatlan) csatornn folyik a kommunikci. Ezt egyszer hasznlni, de telefononknt (csatornnknt) s naponta maximum 500 zenetet kldhetnk ki. Ha ennl tbbre van szksgnk, akkor egy HTTPS tanstvnyt kell vsrolnunk, s hitelestett csatornt kell ltrehoznunk. Ez a korltozs megint csak nem slyos: napi 500 zenet azt jelenti, hogy akr 3 percenknt kldhetnk egy zenetet a nap minden rjban.

A hitelestett csatornk ltrehozsra s a hozzjuk kapcsold callback zenetkldsre ebben a fejezetben nem trnk ki. A szolgltats lersa megtallhat az internetes MSDN knyvtrban. A Push Notification szolgltatson keresztl hromfle zenetet kldhetnk a telefonnak:

262

A Push Notification szolgltats Lapkafrissts: a fejezetben mr megismertk a lapkk klnfle tulajdonsgait ells s hts fellet, httrkp, cm, stb. Egy Push zenetbl a lapka valamennyi tulajdonsgt frissthetjk. A frisstshez nem kell futnia az alkalmazsunknak; az zenetet a telefon opercis rendszerben lv Push kliens fogadja, s vgzi el a mdostst. Felugr rtests: a Push Notification-k segtsgvel felugr rtestseket is megjelenthetnk a felhasznl szmra. A korbban megismert tulajdonsgok itt is hasznlhatk: bellthatjuk az rtests cmt, tartalmt, s mg egy Deep Linking-re alkalmas URL-t is tadhatunk. Ha alkalmazsunk nem fut, akkor megjelenik az rtests, ha pedig fut, akkor kdbl elkaphatjuk az zenetet, s tetszsnk szerint feldolgozhatjuk. Raw (nyers) zenet: Minden ms esetre a Raw Notification hasznlhat. Nevhez hen ebben tetszleges adatokat (szveget vagy akr egy bjttmbt) is elkldhetnk a telefonnak. Ha alkalmazsunk fut, akkor megkapja. Ha nem fut, akkor viszont az zenet elvsz.

A fenti zenettpusok mindegyiknek rgztett formtuma van. A fejezet htralv rszben egy pldn keresztl megismerjk, hogy miknt tudjuk regisztrlni alkalmazsunkat az MPNS-ben, majd hogyan kldhetjk ki a klnfle zenettpusokat.

Lapkk frisstse Push Notification-k segtsgvel


Ismt egy pldaalkalmazst ksztnk, amit ksbb tovbbfejlesztnk majd az rtestsek s a raw zenetek kldsre s fogadsra. Az alkalmazsnak kt szksges komponense van: egy kliens, ami a telefonon fut majd, s egy szerver, amit les krnyezetben egy webszerveren vagy a felhben tartunk, ebben a pldban azonban a helyi fejleszti gpnkrl szolgljuk ki. A webszerver elksztshez erre alkalmas Visual Studio vltozatra van szksgnk. Ha a teleptett Visual Studio nem teszi lehetv a webfejlesztst, akkor tltsk le s teleptsk az ingyenes Visual Web Developer Express verzit! Hozzunk ltre egy j Windows Phone Application projektet PushNotificationClientSample nven! Tovbbra is a Windows Phone OS 7.1 vagy jabb verzit vlasszuk! Els lpsknt megrjuk azt a kdot, ami beregisztrlja alkalmazsunkat az MPNS fel. Az egyszersg kedvrt ezt mr kzvetlenl az alkalmazs indulsakor lefuttatjuk; les alkalmazsban ne feledjk ezt valamilyen vezrlelemhez (pldul egy gombhoz) ktni! Elsknt rjuk a kvetkez sort a fjl legtetejre:
using Microsoft.Phone.Notification;

Mivel alkalmazsonknt maximum 1 csatornnk lehet az MPNS fel, ezrt felttlenl meg kell vizsglnunk, hogy alkalmazsunk korbbi futtatsakor regisztrlt-e mr be csatornt. Ehhez a HttpNotificationChannel objektumot s annak metdusait hasznljuk majd. Ha azt talljuk, hogy a csatorna mg nincs beregisztrlva, akkor ezt megtesszk. A beregisztrlt csatorna egyrszt klnfle esemnyeket indthat (pldul: hiba trtnt, vagy megvltozott az MPNS ltal biztostott URL), amelyekre fel kell iratkoznunk; msrszt kzlnnk kell a telefonnal, hogy a csatorna jogosult a lapkk frisstsre! A mintakdban lthatak lesznek az esemny-feliratkozsok, s a csatorna lapkafrisstsre val regisztrcija is (BindToShellTile() hvs). Ha viszont korbban mr megnyitottuk a csatornt, akkor nincs ms dolgunk, mint jra feliratkozni annak esemnyeire. Az eredeti esemnyfeliratkozsok az alkalmazson bell trtntek, gy termszetesen az alkalmazs lellsakor azok elvesznek. A fentiek elvgzshez helyezzk az albbi kdot a MainPage.xaml.cs kdfjl MainPage() konstruktorba:

263

10. Lapkk s rtestsek

HttpNotificationChannel pushChannel; string channelName = "SampleChannel"; //Megnzzk, hogy ltezik-e mr a csatorna. pushChannel = HttpNotificationChannel.Find(channelName); //Mg nem ltezik - ltrehozzuk, s feliratkozunk az esemnyeire. if (pushChannel == null) { pushChannel = new HttpNotificationChannel(channelName); pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(pushChannel_ChannelUriUpdated); pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(pushChannel_ErrorOccurred); pushChannel.Open(); pushChannel.BindToShellTile(); } //Mr ltezik - ismt feliratkozunk az esemnyeire. else { pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(pushChannel_ChannelUriUpdated); pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(pushChannel_ErrorOccurred); System.Diagnostics.Debug.WriteLine(pushChannel.ChannelUri.ToString()); }

A fenti kd kt esemnykezelre is hivatkozik. Az els (pushChannel_ChannelUriUpdated) akkor kerl meghvsra, ha az MPNS megvltoztatja a csatorna URL-jt. les alkalmazsban ezt clszer kzlnnk a webszervernkkel; itt mindssze egy erre vonatkoz zenetet ratunk ki a Visual Studival. A msodik (pushChannel_ErrorOccurred) pedig hibakezelsre val; ebben a kdban a hibkrl zenetet kldnk a felhasznlnak.
void pushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e) { Dispatcher.BeginInvoke(() => { System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString()); }); } void pushChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e) { Dispatcher.BeginInvoke(() => { MessageBox.Show("Hiba trtnt: " + e.Message); }); }

Ezzel a kliensoldali kdot meg is rtuk az alkalmazs vagy j csatornt hoz ltre, vagy jrahasznostja a rgit, s lekezeli annak klnfle esemnyeit. Ltszlag hinyzik viszont egy fontos elem: nem kldjk el az URL-t a szerveroldalra! Egy les alkalmazsban valban gy trtnne, pldul egy webszolgltatson keresztl, amirl a 9. fejezetben rszletesen olvashatunk. Most az egyszersg kedvrt mindssze kiratjuk az URL-t, s a vglapon keresztl msoljuk t a szerverre. rjuk most meg az alkalmazs szerveroldali komponenst! Ehhez nyissunk egy j Visual Studio projektet!

264

A Push Notification szolgltats

Ezt ltrehozhatjuk a mr megnyitott Visual Studio pldnyban is, de ha a Visual Studio Express verziit hasznljuk, akkor j pldnyt kell indtanunk, mert a telefonos fejlesztsre hasznlt Visual C# Express nem tmogatja a webfejlesztst, ehhez a Visual Web Developer Express-re van szksgnk. A projekt tpusa legyen ASP.NET Empty Web Application, neve PushNotificationServerSample ! A projekt ltrejtte utn adjunk ahhoz egy j Web Form tpus elemet, Default.aspx nven! A Visual Studio automatikusan megnyitja az rlap HTML nzett. Hozzunk ltre az rlapon kt szvegmezt UrlTextBox s MessageTextBox nven, egy gombot SendTileButton nven s Lapkafrissts kldse felirattal, valamint egy cmkt ResponseLabel nven! Az els szvegdobozba kerl majd az MPNS ltal visszaadott URL, ahov zenetnket kldjk majd. A msodik szvegdobozba rjuk zenetnket, amit megjelentnk majd a lapkn! A gombbal kezdemnyezzk a kldst, a cmkbe pedig a visszatrsi rtket helyezzk majd el. A fentiek elvgzse utn az rlapnak a 10-19 brhoz kell majd hasonltania.

10-19 bra: A Default.aspx oldal a vezrlelemekkel Kvetkezik a szerveroldali kd megrsa. A telefonnl megszokott mdon kattintsunk dupln a Lapkafrissts kldse gombra! A megnyl kdfjl tetejre helyezzk el a kvetkez nhny sort:
using System.IO; using System.Net; using System.Text;

Ezutn rjuk meg a gomb SendTileButton_Click esemnykezeljnek kdjt! Mindhrom rtestsi tpusnak egy kttt struktrj XML zenetet kell kldenie egy HTTP krsen keresztl, kdunk ezrt elszr felpti ezt az XML struktrt. Amint a pldakdban lev XML-bl ltjuk, a lapkk korbban megismert valamennyi tulajdonsgt frissthetjk. Ha valamelyik XML tulajdonsgot resen hagyjuk, akkor az nem vltozik a lapkn. A ShellTileSchedule osztllyal ellenttben itt httrkpeket helyi erforrsbl is bellthatunk ehhez hasznljunk relatv URL-t (amire mr lttunk pldt a fejezet korbbi rszeiben)! A pldakd az egyszersg kedvrt kizrlag a lapka cmt frissti a megadott zenetre, a tbbi tulajdonsgot vltozatlanul hagyja.
//Ellltjuk az zenetet. string tileMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<wp:Notification xmlns:wp=\"WPNotification\">" + "<wp:Tile>" + "<wp:BackgroundImage></wp:BackgroundImage>" + "<wp:Count></wp:Count>" + "<wp:Title>" + MessageTextBox.Text + "</wp:Title>" + "<wp:BackBackgroundImage></wp:BackBackgroundImage>" +

265

10. Lapkk s rtestsek

"<wp:BackTitle></wp:BackTitle>" + "<wp:BackContent></wp:BackContent>" + "</wp:Tile> " + "</wp:Notification>";

A fenti kd Windows Phone 7.5 (Mango) vagy jabb opercis rendszer esetn mkdkpes. Bizonyos tulajdonsgok mg nem lteztek a Windows Phone 7.0 opercis rendszerben. Ha ehhez runk programot, akkor ezeket hagyjuk ki! Ezekrl lsd: http://msdn.microsoft.com/enus/library/ff402558(VS.92).aspx Az ellltott XML fjlt egy HTTP krsen keresztl tudjuk elkldeni az MPNS-nek. Erre a HttpWebRequest osztlyt hasznljuk. Az zenetet bjttmb formjban kell majd tkldennk a hlzaton, gy a korbban ltrehozott XML formtum szveget bjttmbb alaktjuk. A HttpWebRequest paramterezsre is gyelnnk kell! Egyrszt, a krst POST zenet formjban kell elkldennk. Msrszt, a HTTP fejrszben be kell lltanunk, hogy az zenet milyen clt szolgl, s mennyire srgs. Az X-WindowsPhone-Target tulajdonsg rtke adja meg, hogy lapkafrisstsrl, rtestsrl vagy raw zenetrl van sz. A X-NotificationClass pedig az zenet srgssgt hatrozza meg ha 1, akkor azonnal, ha 11, akkor legksbb 450 msodpercen bell, ha 21, akkor pedig legksbb 900 msodpercen bell tovbbkldi a telefon fel az MPNS.
//Ltrehozzuk a HTTP krst. HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(UrlTextBox.Text); byte[] notificationMessage = Encoding.Default.GetBytes(tileMessage); sendNotificationRequest.Method = "POST"; sendNotificationRequest.ContentLength = notificationMessage.Length; sendNotificationRequest.ContentType = "text/xml"; sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "token"); sendNotificationRequest.Headers.Add("X-NotificationClass", "1");

Ezek utn mr nincs ms htra, mint az zenet tnyleges elkldse. Az MPNS visszajelez, miutn elkldte az zenetet; a klnfle sttusz-zenetek a vlasz HTTP fejlcben rkeznek. Ezt rgtn ki is ratjuk az erre a clra ltrehozott ResponseLabel cmkbe.
//Elkldjk az zenetet s kiolvassuk a vlaszt. using (Stream requestStream = sendNotificationRequest.GetRequestStream()) { requestStream.Write(notificationMessage, 0, notificationMessage.Length); } HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.GetResponse(); string notificationStatus = response.Headers["X-NotificationStatus"]; string notificationChannelStatus = response.Headers["X-SubscriptionStatus"]; string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"]; ResponseLabel.Text = notificationStatus + " | " + deviceConnectionStatus + " | " + notificationChannelStatus;

Mivel hlzati kdrl van sz, ezrt rdemes a fentieket krbevenni egy try..catch blokkal. Ezzel elkszltnk. Teszteljk a programot! Indtsuk el mindkt projektet! A Windows Phone alkalmazs ltszlag semmit nem csinl, de valjban elvgzi az MPNS regisztrcit, s az eredmnyl kapott URL-t kirja a Visual Studio Debug zenetei kz. Ezeket a fejleszt fellet Output ablakban nzhetjk meg. Ha ez nem ltszik, akkor a View men Output menpontjval tegyk lthatv (lsd 10-20 bra)!

266

A Push Notification szolgltats

10-20 bra: Az Output ablak s az MPNS-tl visszakapott URL A megjelen URL-t msoljuk ki, s illesszk be a weboldalunk fels szvegdobozba! Az alsba rjunk valamilyen rvid zenetet! A telefonon lpjnk ki az alkalmazsbl, s tzzk ki a kezdkpernyre. Vgl trjnk vissza a webalkalmazshoz, s kattintsunk a Lapkafrissts kldse gombra! A webalkalmazs sszelltja az XML-t, elkldi az MPNS-nek, ami rgtn tovbbtja azt a telefon fel. Ennek hatsra a frissts gyakorlatilag azonnal megjelenik, amint az a 10-21 brn lthat.

10-21 bra: A Push Notification-nel frisstett lapka J tudni, hogy mg a ShellTile API-n keresztl elvgzett vltoztatsokat akkor is elmentette a telefon, ha az alkalmazs lapkja nem volt kitzve, a Push Notification-knl ez nincs gy ha az alkalmazs pp nincs kitzve, az zenet elvsz. Szintn fontos, hogy a Push Notification-k sajnos nem minden karaktert tmogatnak. Hibt kaphatunk, ha kezetes bet van az zenetben.

rtestsek megjelentse Push Notification-k segtsgvel


Nzzk, hogyan tudunk felugr rtestseket megjelenteni Push Notification-k segtsgvel! A mvelet logikailag szinte teljesen megegyezik a lapkafrisstsekkel a telefonon beregisztrljuk a csatornt, elkldjk az URL-t a szervernek, a szerverrl pedig XML formtum krseket irnytunk a csatornba. Ennek megfelelen a kliensoldali kdban minimlis vltoztatst kell csak vgrehajtanunk. Mindssze azt kell kzlnnk a telefonnal, hogy a ltrehozott csatornn keresztl rtestsek is rkezhetnek, s ezeket is kezelje le. rjuk be a pushChannel.BindToShellTile(); sor al a kvetkez egyetlen sort:
pushChannel.BindToShellToast();

A szerveroldalon szintn nagyon kevs vltoztatsra van szksgnk. A felugr zenetet s a lapkafrisstst kld kd csak az elkldtt XML fjl formtumban s nhny paramter-rtkben tr el. Hozzunk ltre egy j gombot a webes projektben SendToastButton nven s rtests kldse felirattal! Dupla kattintssal lpjnk be Click esemnykezeljbe, s egy az egyben msoljuk t a SendTileButton_Click esemnykezel tartalmt ide! Mdostsuk az XML zenetet a felugr zenetek smjnak megfelelen! Lthatjuk, hogy ez az XML is tartalmazza a felugr rtestsek valamennyi lehetsges tulajdonsgt. A lapkkhoz hasonlan itt is

267

10. Lapkk s rtestsek gyeljnk, mert a 7.0-s opercis rendszert futtat telefonok mg nem ismerik mindet az itt szerepl tulajdonsgok kzl!
//Ellltjuk az zenetet. string tileMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<wp:Notification xmlns:wp=\"WPNotification\">" + "<wp:Toast>" + "<wp:Text1>" + MessageTextBox.Text + "</wp:Text1>" + "<wp:Text2></wp:Text2>" + "<wp:Param>/MainPage.xaml</wp:Param>" + "</wp:Toast> " + "</wp:Notification>";

Ezutn mdostsuk a krs HTTP fejrszt! Meg kell adnunk, hogy ez egy rtests, azaz toast tpus, s t kell rnunk a kzbests gyorsasgt szablyoz konstanst is (itt 2 jelenti az azonnali kzbestst, 12 a 450 msodpercen bellit, s 22 a 900 msodpercen bellit).
sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast"); sendNotificationRequest.Headers.Add("X-NotificationClass", "2");

Miutn ezzel elkszltnk, mr tesztelhetjk is az alkalmazst. A tesztelshez elbb el kell tvoltani a kliens alkalmazst a telefonrl. Erre azrt van szksg, mert korbbi tesztjeink sorn az mr megnyitotta a Push Notification csatornt. gy ha most elindtjuk, akkor csak jrahasznostja a csatornt, s nem fut le a mdostott kdunk, ami lapkafrisstshez is beregisztrln (a BindToShellToast() hvs). Tvoltsuk el teht a programot a telefonrl, majd indtsuk el a kt projektet! A telefonalkalmazsbl lpjnk ki (klnben az rtests nem jelenik meg), majd msoljuk t az URL-jt a webalkalmazsba, s kattintsunk az rtests kldse gombra! Az eredmny a 10-22 brhoz hasonlt majd.

10-22 bra: A megjelen felugr zenet Ha az alkalmazs futsa kzben is szeretnnk kezelni a megrkez rtestseket, akkor ehhez a ShellToastNotificationReceived esemnyre kell feliratkoznunk.

Raw zenetek fogadsa a Push Notification szolgltatson keresztl


Vgl ismerkedjnk meg a Raw zenetek kldsvel! A felugr rtestsekhez hasonlan nagyon kevs vltoztatst kell vgeznnk mr meglv kdunkon. A raw zenetek csak akkor fogadhatk, amikor alkalmazsunk fut, gy ezttal egy esemnyre kell majd feliratkoznunk. Helyezzk a kvetkez kdot mindkt pushChannel.ErrorOccurred += kezdet sor utn:
pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(pushChannel_HttpNotificationReceived);

A HttpNotificationReceived esemnykezel trzsben mindssze kiolvassuk s megjelentjk a kapott zenetet egy les alkalmazs termszetesen ennl sokkal bonyolultabb logikt is vgrehajthat:

268

A Push Notification szolgltats

void pushChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e) { using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Notification.Body)) { string message = reader.ReadToEnd(); Dispatcher.BeginInvoke(() => { MessageBox.Show(message); }); } }

Most mdostsuk a szerveroldalt is! Hozzunk ltre egy j gombot SendRawButton nven Raw zenet kldse felirattal, lpjnk be Click esemnykezeljbe, majd msoljuk t ide a SendToastButton_Click esemnykezel trzst! Ezt ismt csak kt helyen kell mdostanunk. Elsknt rjuk be az elkldend zenetet! Ez raw zenet esetn brmi lehet XML, szveg vagy akr egy tetszleges bjttmb is. gyeljnk azonban arra, hogy az MPNS maximum 1 kilobjtnyi fejlccel s 4 kilobjtnyi trzzsel rendelkez zeneteket tovbbt!
//Ellltjuk az zenetet. string tileMessage = MessageTextBox.Text;

Msodszor, mdostsuk a HTTP fejlceket! Az X-WindowsPhone-Target fejlcre ezttal nincs szksgnk ezt a lenti kdrszletben kommentlssal jeleztk. Az X-NotificationClass rtke raw zenet esetn 3, 13 vagy 23 lehet a megszokott mdon ez azonnali, 450 msodpercen belli vagy 900 msodpercen belli kzbestst jelent.
//sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast"); sendNotificationRequest.Headers.Add("X-NotificationClass", "3");

Kszen llunk az alkalmazs tesztelsre. A felugr zeneteknl ltott mdon tvoltsuk el az alkalmazst a telefonrl, majd indtsuk be a kt projektet, msoljuk t az URL-t a webalkalmazsba, s kldjnk egy raw zenetet! A vrhat eredmny a 10-23 brn lthat.

10-23 bra: A kzbestett raw zenet

Push Notification-nk s a Windows Azure


Ha szerverre van szksgnk, kzenfekv, hogy a felht hasznljuk erre a clra. J hr, hogy a Windows Azure kifejezetten tmogatja a Windows Phone-nal val egyttmkdst. A Microsoft kln toolkit-et ksztett Azure Toolkit for Windows Phone 7 nven, ami ksz alkalmazs-sablonokat tartalmaz. Ezek kpesek az Azure trhelyek hasznlatra, vagy az Azure-on keresztli felhasznl-hitelestsre, s ami a leglnyegesebb: a Push Notification-k hasznlatra is. Architekturlis szempontbl ugyanazt valstjk

269

10. Lapkk s rtestsek meg, mint a fentebb lertak, de ksz, rett kd formjban. Ha lehetsgnk van az Azure hasznlatra, rdemes kiprblni a toolkit-et, amelynek belltst, egyes funkciinak hasznlatt a 9. fejezet trgyalja.

sszefoglals
A fejezetben megismertk a lapkk tulajdonsgait, s lttuk a frisstskre hasznlhat ngy mdszert. Ezek clja ugyan azonos, de ms-ms esetben rdemes ket hasznlni. Az albbi tblzatban sszehasonltjuk a lapkk frisstsre hasznlhat lehetsgeket. Szolgltats ShellTile API Background Agent ShellTileSchedule Jellemzk Csak a telefon kell hozz. Alkalmazsunk futsa alatt hasznlhat. Csak a telefon kell hozz. Alkalmazsunknak nem kell futnia, a frissts idztetten trtnik. Szervert is ignyel. Alkalmazsunknak nem kell futnia, idztett mdon, a telefon kezdemnyezsvel mkdik. Szervert is ignyel. Alkalmazsunknak nem kell futnia, esemnyvezrelt, vagyis a szerver kezdemnyezi a frisstst.

Push Notification

Lttuk tovbb a felugr rtestseket is, melyekkel a felhasznl figyelmt aktvan irnythatjuk alkalmazsunkra. Megismertk, hogy az rtestsek a lapkkhoz hasonlan Background Agent s Push Notification segtsgvel is kldhetk. Ezen eszkzkkel alkalmazsunk nemcsak addig l, amg a felhasznl aktvan futtatja, hanem lelltsa utn is kpes friss informcikat biztostani. rdemes ket hasznlni, mert segtsgkkel sokkal professzionlisabb megjelenst, interaktvabb lmnyt biztosthatunk.

270

11. Jtkok a Mango vilgban


A most soron kvetkez fejezet tmjt tekintve merben eltr a korbbi fejezetektl, azonban gy gondoltuk, hogy mindenkppen rdemes adni egy rvid zeltt a telefonos jtkok fejlesztsbl, illetve bemutatni, hogy ezen a tren a Mango frissts milyen jdonsgokat hozott magval. A fejezet els rszben megismerkednk az XNA Framework s a grafikus programozs legfbb mozzanataival, ezzel elmleti s gyakorlati alapot adva azon Olvasinknak is, akik eddig mg soha nem tallkoztak fejleszti szempontbl szmtgpes jtkokkal vagy grafikus programozssal. Ezek utn megnzzk, pontosan mit is jelent a Silverlight s az XNA hibrid megjelentsi rendszere, s mikor tudjuk kihasznlni az j lehetsgeket.

Windows Phone a motorhztet alatt


A Windows Mobile fejlesztse sorn a Microsoft rendkvl sok tapasztalatot halmozott fel, a fejleszti modell elnyei s htrnyai jl krvonalazdtak. Amikor a platform utdjnak fejlesztsbe kezdtek, egy olyan sokkal tgondoltabb s korszerbb rendszert szerettek volna alkotni, amely a legjabb technolgikra pt, s az arra val ttrs egy .NET fejleszt szmra sokkal kevsb megterhel, mint azeltt volt. Miutn a teljes .NET Framework szmos okbl nem vihet t egy mobil eszkzre, gy a platform felptsekor kt f szempontot kellett betartani: a megszokott alkalmazsfejlesztsi modell alkalmazhat legyen ltalnos alkalmazsfejlesztshez, de az okos telefonok piacn egyre nagyobb teret hdt jtkok s grafikus alkalmazsok se maradjanak tmogats nlkl. A Silverlight mint korszer alkalmazsptsi platform j vlasztsnak tnt, tbb ve kedvelt s elterjedt technolgia, arnylag rvid kiadsi ciklusokkal. Azonban hiba a gazdag mdiatmogats, a teljestmnye nem megfelel sebessgorientlt magas szmtsi kapacitst ignyl megoldsokhoz ide bizony egy grafikus technolgira volt szksg. PC-re rt jtkok esetben kt elterjedt grafikai API ltezik: OpenGL s DirectX (pontosabban a Direct3D, amely a teljes platformnak csak egy darabja). Miutn a Microsoft a nylt OpenGL-t nem hasznlja sajt fejlesztseihez, s a Windows a grafikus alrendszer tmogatsn kvl mst nem nyjt, gy a vlaszts a Direct3D lehetett volna. Azonban a Windows Phone az ipar szmra egy jonnan belp tagot jelentett, gy nemcsak a tapasztalt jtkfejlesztket kellett megclozni a technolgiai tmogatsokkal, hanem a jtkok fejlesztse irnt rdekld hobbi- s kezd fejlesztket is. k nagy valsznsggel nem fognak egy komplex grafikus rendszert kitanulni, gy sokkal knyelmesebb megoldsra volt szksg, amely magasabb absztrakcij megoldsokat knl, knnyebben tanulhat s knnyebben kezelhet. A vlaszts az XNA Frameworkre esett. Az XNA a Microsoft jtkfejlesztsi eszkzkszlete s futtatkrnyezete klnbz eszkzkre, mint Windows, Xbox s most mr a Windows Phone is. Ez azt jelenti, hogy a cleszkzk kztt az alkalmazsok tvihetk, sklzsi eltrsekre s nhny, az eszkzk kztti klnbsgekbl szrmaz eltrsre szksges csak odafigyelni a jtk fejlesztse sorn. Termszetesen, ahogy azt megszoktuk, .NET alap programozsi fellettel rendelkezik, s tartalmaz mindent, amire egy jtkprogram esetben szksg lehet (11-1. bra): tgondolt irny-architektra a jtk szmra Grafikai rendszer Bemenetek tmogatsa magas szinten Audiorendszer Tartalmakat kezel alrendszer Klnbz eszkzk

271

11. Jtkok a Mango vilgban

11-1. bra: A Windows Phone Mango fejleszti platform Nem keverend ssze az XNA Framework egy jtkmotorral (game engine)! Sok szempontbl gy tnhet, hogy az XNA mindent tartalmaz, amit egy jtkmotor, de ez messze nem igaz. Egy jtkmotor sokkal specifikusabb, az esetek jelents rszben kttten egy jtkkategrin bell hasznlhat jl, illetve az szmos olyan komponenst knl (fizikai szmtsokrt felels komponens, mestersges intelligencia, szkript rendszer, stb.), amelyeket az XNA nem. Az XNA egy jl tgondolt alapot ad, aminek tmogatsval rvidebb id alatt, egyszerbben juthatunk el a kvnt clunkig. Ha nem szeretnnk minden apr rszletet sajt magunk kifejleszteni a legelejtl fogva, akkor az interneten szmos nylt forrskd jtkmotor fellelhet, amelyek kimondottan XNA-hoz kszltek. Fontos megjegyzs az XNA-val kapcsolatban: sokat egyszerst a jtkfejlesztsi folyamaton, azonban ezt azon az ron teszi, hogy soha nem a legfrissebb natv grafikus platformhoz van igaztva, ami a mi esetnkben a DirectX. Ha a legjabb funkcikat szeretnnk Windows krnyezetben kihasznlni, akkor ahhoz DirectX-re s natv kdra lesz szksgnk, amely az esetek egy jelents rszben a jl optimalizlhatsg miatt C++-ban rdik. Windows Phone telefonokon azonban nincs lehetsgnk natv kdot futtatni. A keretrendszer pillanatnyilag a 4.0-s vltozatnl tart, amely kln is letlthet a Microsoft letlt kzpontjbl, azonban szerves rszt kpezi a Windows Phone fejleszti kszletnek is.

Grafikus programozsi s XNA alapok


A kp kialaktsa
A mai jtkok hnaprl hnapra egyre szebb grafikai megvalstsokat sorakoztatnak fel, amely elssorban a fejld hardveres erforrsoknak ksznhet, msodsorban pedig a folyamatosan fejld technolgiknak. De milyen komponensekbl pl fel egy jtk grafikja? Nos, 3 dimenzis trben gondolkozunk, minden, amit meg szeretnnk jelenteni, trben helyezkedik el. Kpek reprezentcija sorn jl ismerjk a kt ltez analgit, miszerint egy kp lehet pixeleivel szmtva amely az esetleges sklzsok sorn pontatlansgot s darabossgot okoz, azonban gyorsan feldolgozhat s lehet vektoros alapon szmtva amely sklzs esetn is mindig pontos lesz, azonban a matematikai szmtsokat jra s jra vgre kell hajtani. Ha ezt trbe szeretnnk levetteni, akkor mr elre megjsolhat, hogy valamilyen gyorst megoldsra itt is szksg lesz, nem fogjuk minden egyes pontjt az adott trbeli testnek kiszmtani. Helyette poligonokra (sokszgekre) bontjuk fel az alakzatot, a poligonoknak pedig a cscspontjait troljuk le. Megjelentskor a cscspontokat sszektjk, s a terletket kitltjk, gy a poligonok szmnak fggvnyben fog vltozni az adott modell rszletessge is. Termszetesen minl tbb poligonnal szeretnnk dolgozni, az annl tbb szmtst fog ignyelni. Amikor a grafikus processzor feldolgozza s megjelenti ezeket a poligonvzakat, akkor elszr a trbeli informcik kerlnek be a megjelentshez szksges elemeket tartalmaz csvezetkbe. A GPU tbb

272

Grafikus programozsi s XNA alapok lpsen keresztl tovbb bontja azokat hromszgekre, a keletkezett hromszgeket pedig raszterizlja, azaz levetti a kperny megfelel pixeleire (11-2. bra).

11-2. bra: Egyszer poligonvz A 11-2. brn jl lthat, hogy a trben megalkotott delfin alakzat nem igazn valsgh, alakja kezd hasonltani arra, amit ltre szeretnnk hozni, de rszletessge mg nagyon messze ll ettl. A szmtgpes grafika minden terletn a val letbl mert tleteket, ezrt nem a poligonok szmnak nvelsvel s sznezsvel finomtjuk a modellt tovbb, hanem anyagmintkat (textrkat fogunk) felhasznlni. Az anyagmintk egyszer kpfjlok, melyeket trben a megfelel poligonra vettnk le, gy azt a hatst keltve, mintha az adott test felletn helyezkedne el (11-3. bra).

11-3. bra: Poligonvz textra nlkl s textrval Most mr olyan rzetet kelt bennnk, mintha tnyleg valamilyen vals objektumot jelentettnk volna meg egyszeren a szmtgp segtsgvel, de mg mindig nem az igazi. A textrk nemcsak egyetlen rtegben helyezkedhetnek el a modellen, hanem tbb klnbz rteg tbb feladatot tud elltni. Azon tl, hogy az alapmintzatot megadja, egy msik rtegben trolhatunk olyan informcikat is, amik arra vonatkoznak, mennyi fnyt tud elnyelni az adott test helyenknt, mennyire rnyalt, s gy tovbb. Elhangzott egy fontos fogalom: a fny. Rendkvl sokat tud a valsgrzet kialaktsban segteni egy jl elksztett fny-rnyk rendszer, azonban (mint minden ms is egy jtkban) ez matematikai alapon van megfogalmazva, s szmtsignyes lehet. Mi kell a fnyek megjelentshez? Valamilyen fnyforrs s az adott trbeli alakzat informcija arra vonatkozan, hogy ha egy fnysugr becsapdik, akkor azt hogyan verjk vissza s milyen intenzitssal. A visszaverdshez egy felleti tulajdonsgra van szksgnk, ami

273

11. Jtkok a Mango vilgban nem ms, mint az adott poligon normlvektora. A normlvektor s a fnyvektor skalris szorzata meghatrozza a visszaverdsi paramtert.

11-4. bra: Poligononknti megvilgts A 11-4. brn jl megfigyelhet, hogy a poligononknt meghatrozott visszaverds csak akkor ad szp eredmnyt, ha magas poligonszm vzzal van dolgunk. Ennek lehetsges orvosolsa, ha minden egyes pixelre kln hatrozzuk meg a fnyek hatst, ehhez azonban pixel alap manipulcira van szksgnk, amelyet a grafikus technolgik nem segtenek alaprtelmezetten. A beptett s egyben korltos megoldsok (Fixed Function Pipeline) megkerlsre arnylag hossz ideje van lehetsg grafikus processzorra rt rnyal (shader) kdok segtsgvel. Itt mr csak a szmtsi komplexits szabhat hatrt, amit megfogalmazunk, azt kzvetlenl a GPU (grafikus processzor) fogja vgrehajtani. Egy pixel alap megvilgtst mutat be a 11-5. bra.

11-5. bra: Pixel alap fny egy kis felbonts modellen

274

Grafikus programozsi s XNA alapok

rdekessg: a fny-rnyk rendszerek nemcsak a szmtgpes jtkokban jelentsek, hanem a filmekben hasznlt specilis effektusok nagy rsze is ezekre pt. Amit a fejezetben eddig trgyaltunk, az a sebessgorientlt (inkrementlis) kpszintzis, azonban a tkletes tkrzdsek, trsek s megvilgtsok reprezenticijhoz ltezik egy sugrkvets (ray tracing) nev megkzelts is. Ennek a lnyege az, hogy a kperny minden egyes pixelbl sugarakat indtunk akrcsak a val letben a fotonok - a virtulis trbe, melyeknek az tjt kvetjk, s megfigyeljk, hogy milyen anyagi tnyezket gyjtttek ssze, ezzel a matematikailag tkletes vilgtst megvalstva. Termszetesen vannak kezdemnyezsek megfelel sebessg algoritmusok ellltsra, amelyek jtkokban vals idben tudnak megvalstani sugrkvetst, azonban a komplex szmtsi rendszer miatt a komolyabb megoldsok mg j ideig csak a filmekben maradnak. Ahogy haladunk elre a szntr elemeinek megismersvel, egyre finomabb kezd vlni a virtulis trben ltrehozott krnyezetnk, azonban a poligonvz szmtsi teljestmny miatt visszafogott felbontsa mg mindig problmt okoz. Erre egy elterjedt megoldst jelent az gynevezett buckalekpezs (Bump Mapping), amely egy jabb rteg textrt ad a modellnkhz, azonban szorosan kapcsoldva az eredeti minthoz. Ez a textra minden pixelben egy normlvektort r le, melyet szintn pixelenknt kirtkelve a fnysugr fggvnyben egy rszletes, trbeli fellet hatst kelti. Ha megfelel szgben nzzk az adott objektumot (se nem tl kis szgben, se nem kzvetlen szembl), akkor a fellet gy nz ki, mintha jval tbb poligon segtsgvel modelleztk volna azt. A buckalekpezs elemei megfigyelhetk a 11-6. brn, ahol a textrt egy nagyon alacsony poligontartalm gmbre fesztettk ki.

11-6. bra: Buckalekpezs s a normlvektorokat tartalmaz textra Sajnos a knyv terjedelme (s legfkppen tmakrei) miatt a virtulis objektumok szmtgpes grafikai mdszereit nincs lehetsgem tovbb rszletezni, br minden egyes emltett tmakr mg hosszasan taglalhat lenne. Helyette trjnk t a szntr egy msik aspektusra, ami nem ms, mint a kpernytr (a kperny pixelei, amin keresztl a teret ltjuk). Nagyon sok valsgrzetet kelt effektus ezen keresztl valsthat meg, amely megsprolja szmunkra azt, hogy a trelem minden egyes pixelt szmtsba vegyk, helyette csak a kperny felbontsa szerinti pixelekkel kell szmolnunk. Ilyenek pldul a dinamikus fnykontrasztokat ler HDR (High Dynamic Range) effektek, melyekkel valsgh vakt s tomptott fnyviszonyokat tudunk ltrehozni. Ide tartoznak a klnbz elmossok, amelyekkel a sebessg illetve a trbeli tvolsg hatst tudjuk hangslyozni. De ilyen pldul a sci-fi filmekre jellemz, drmai hatsok elrse is, mint a kss, zavaros (zajjal torztott) megjelents, vagy a filmszakadst imitl svosts is. Ezeket az effektusokat mondatokkal megfogalmazva nehzkes szemlltetni, helyettem inkbb beszljenek a kpek (11-7. s 118. bra)!

275

11. Jtkok a Mango vilgban

11-7. bra: Fnykontrasztos (HDR) effekt

11-8. bra: Tbbszrs effektek kpernytrben A fenti megoldsok segtsgvel sok minden megvalsthat, azonban hol vannak az olyan termszetben elfordul jelensgek, mint az es, h, tz, fst s az sszel hull falevelek? Ezeknek a modellezse pixel alapon rendkvl krlmnyes lenne, ezrt makroszkopikusabb elemekkel kell megkzeltennk a problmt. Kpzeljnk el egy egyszer kis textrt, amely egy escsepp mintzatt tartalmazza ttetsz httrrel! Fesztsk azt ki egy ngyszgre, amely mindig a kamera fel nz. Ksztsnk belle sokat, fzzk fel egy listra, s adjuk t egy olyan metdusnak, amely megmondja, hogy az egyes ngyzeteknek milyen irnyba, milyen sebessggel s hogyan kell mozogni! A kd gondoskodjon arrl is, hogy ha egy elem mr nem lthat, akkor a helyre ptoljon egy j elemet, amellyel az egsz folyamat jra lejtszdik! Ezt a megkzeltst rszecskerendszernek hvjk, s a legtbb, sok elembl ll s egysges szably szerint mkd jelensg megvalsthat vele. A mai modern jtkok a rszecskerendszert is a GPU segtsgvel valstjk meg s fizikai szimulcival egsztik ki, amely mg sokkal valsghbb eredmnyt ad. Elg sokat barangoltunk az elmleti skon, mg egy kitrt tesznk a jtkciklus megismersvel, majd utna a gyakorlatban is megnzzk, hogy egy egyszer ktdimenzis jtk megvalstshoz milyen elemekre van szksgnk, s hogyan hasznljuk ket.

276

Grafikus programozsi s XNA alapok

A jtkciklus
Amikor alkalmazsokat fejlesztnk, egy olyan krnyezethez vagyunk hozzszokva, ahol a kzponti szerepet az esemnyek kapjk. Ha valamilyen tennivalja van a programnak, a felhasznl valamilyen interakcit vgez a felhasznli felleten vagy a httrben valamilyen adatszinkronizci trtnik, akkor gy tekintnk a programra, hogy fut, majd amikor nincs tbb feladata, akkor megll, s egszen addig nem vgez jabb feladatot, amg az elbb felsorolt tevkenysgek kzl valamelyik be nem kvetkezik. Termszetesen ez csak elgondols szintjn trtnik gy, ez az esemnyvezrelt szemllet sajtossga. Az alkalmazs a httrben egy pillanatra sem ll meg. Egy jtknak a PC esetben msodpercenknt krlbell 60, mobiltelefon esetben kb. 30-szor kell pillanatfelvtelt ksztenie, s az adott kpkockt megjelentenie a felhasznl szmra, gy a folytonossg, a mozgs rzett keltve. Nos, a felhasznl msodpercenknt 30 alkalommal biztosan nem fogja lenyomni az egrgombot, ezzel nem jn ltre kls interakci, gy magunknak kellene esemnyt ltrehozni, amely hatsra megtrtnik a kpszintzis (adott kpkocka ltrehozsa tovbbiakban csak renderelsknt fogjuk emlteni). Jtkok rsa sorn nem ezt a megkzeltst szoktk hasznlni, hanem az gynevezett jtkciklusos megoldst. Ez azt jelenti, hogy gy tekintnk a programra, ahogy az valjban mkdik is, folyamatosan fut, amg ki nem lpnk. A program indulsa sorn inicializljuk a szksges paramtereket, betltjk a tartalmakat (kpek, hangok, modellek, stb.), majd belpnk egy vgtelen ciklusba, amelyen bell folyamatosan ismtldni fog a renderelsi lps, gy garantltan msodpercenknt legalbb 30-szor ltrejn a kvnt kp. Ez eddig tkletesen mkdkpes elgondols, de hogyan kezeljk a bemenetet, a fizikai szimulcit, a mestersges intelligencit s mg szmos ms komponenst a jtknak, amelyek nlkl mkdskptelen? Ezekhez nincs szksgnk esemnyekre! Mindssze a ciklus trzsn belli sorrendre kell odafigyelnnk. Elszr megnzzk, hogy volt-e valamilyen bemenet a felhasznl oldalrl Xbox kontrolleren egy gomb lenyomsa, Windows Phone telefon kpernyjnek megrintse, billenty illetve egrkattints. Ha volt, akkor kezeljk azt, majd tovbblpnk pldul a mestersges intelligencia lpseinek a szmtsra. Ha pedig ez is megtrtnt, akkor jhet a kpszintzis, azaz a szmtsok s a bemenetek fggvnyben a szntr (az a tr, ahol a jtk szerepli, dinamikus s statikus tartalmai elhelyezkednek, s amit, mint szemll kvlrl tekintnk) renderelse. Mindezt msodpercenknt 30 alkalommal vgezzk el. Ha a felhasznl a menben a kilpsre kattint (Windows Phone esetben ezt a szerepet a Vissza gomb kapta), akkor a ciklusbl kilpnk, elmentjk az llapotot s felszabadtjuk a memribl a jelentsen erforrsignyes tartalmakat. (11-9. bra)

11-9. bra: A jtkok vgrehajtsi modellje

Egy XNA program felptse


A hosszas elmleti bevezet utn nzzk meg, hogyan pl fel egy XNA alkalmazs! Indtsuk el a Visual Studio-t, s hozzunk ltre egy j projektet! Itt a C# nyelv sablonokat tartalmaz szekcin bell vlasszuk ki az XNA Game Studio 4.0 kategrit! Ezen bell egy Windows Phone Game (4.0) tpus projektre lesz szksgnk (11-10. bra).

277

11. Jtkok a Mango vilgban

11-10. bra: j XNA projekt ltrehozsa Visual Studio-ban Minden sablont nem tudunk rszletesen megvizsglni ebben a fejezetben, lljon itt egy rvid sszefoglals arrl, hogy melyik mire hasznlhat: Windows Phone Game: Ez az alapja a leend XNA jtkunknak. Az inicializlshoz szksges rszeket, alapbelltsokat, a tartalomkezelt s a jtkciklust tartalmazza. Windows Phone Game Library: A fordts sorn DLL fjl keletkezik belle, amelyet az alkalmazs elemeinek dekompozcijhoz tudunk felhasznlni. Windows Phone Silverlight and XNA Application: A Manghoz szorosan kapcsold Windows Phone 7.5 jdonsg, amely lehetv teszi, hogy az XNA s Silverlight krnyezeteket egytt hasznljuk. Content Pipeline Extension Library: Ezzel a projekttpussal sajt fjlformtumunkhoz kszthetnk feldolgozt a tartalomkezel szmra. A tartalomkezelrl mg nem beszltnk, de a fejezet sorn megnzzk a mkdst.

Mieltt rszletesen megnznnk, hogy a projekt milyen rszekbl pl fel, emultor segtsgvel prbljuk ki az alkalmazst!

11-11. bra: Egyszer XNA sablon emultoron val futtatsa 278

Grafikus programozsi s XNA alapok A Visual Studio kt projektet ksztett el szmunkra. Az egyik maga a jtk, ahol kdunkat fogjuk rni, a msik viszont egy tartalomkezel (Content Pipeline) projekt, melynek feladata egy helyre sszegyjteni a jtkhoz tartoz tartalmakat, mint pldul a textrk, a modellek, a hangok, a zenk, s gy tovbb. Mirt van erre szksg? Az XNA alatt a klnbz fjlokat nem fjlokknt fogjuk hasznlni, hanem a tartalomkezel rendszer segtsgvel tudjuk betlteni. Amikor a jtk forrskdjt Visual Studio-ban lefordtjuk, s abbl egy XAP fjl keletkezik (melyet aztn a telefonra tudunk telepteni), olyankor a tartalomfjlok is tdolgozsra kerlnek, amely azt jelenti, hogy az XNA szmra kezelhet formtumba kerlnek talaktsra. Tekintsnk pldul egy textrt, amelynek a neve xnalogo.png! Amikor a tartalomkezeltl ezt az llomnyt lekrjk majd, a kiterjesztst az elrsi tban mr nem fogjuk szerepeltetni, mivel a PNG formtum kpfjlunkbl a Visual Studio egy binris kpfjlt kszt, melyet az XNA majd rtelmezni tud. s itt felhvom a figyelmet arra, hogy a XAP fjl mrett jelentsen nvelni tudjk a kpek s zenk. Hiba dolgozunk valamilyen tmrtsi algoritmust hasznl mdiaformtummal, az tkdolt llomny mrete jelentsen nagyobb lehet, mivel az mr egy bels formtumra kerl talaktsra. Ha a tartalomkezel nem tmogat egy fjlformtumot, vagy valamilyen sajt, ltalunk ksztett formtumhoz szeretnnk rtelmezt kszteni, akkor arra lehetsgnk van a Pipeline Extension projekttpus segtsgvel. A tartalomkezel kdbl val hasznlatt mg a ksbbiekben ltni fogjuk. Ha ttrnk a jtk kdjt tartalmaz projektre, akkor lthatjuk, hogy a program teljes feladatt pillanatnyilag a Game1 osztly ltja el, amely a Game1.cs fjlban tallhat. Nzzk meg a tartalmt:
public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = Content; TargetElapsedTime = TimeSpan.FromTicks(333333); InactiveSleepTime = TimeSpan.FromSeconds(1); } protected override void Initialize() { base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); } protected override void UnloadContent() { } protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit();

base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue);

279

11. Jtkok a Mango vilgban

base.Draw(gameTime); } }

A GraphicsDeviceManager objektum segt elrni a program szmra hasznlhat belltsokat. Itt tudjuk pldul belltani a jtk felbontst, a sttuszsort eltntetni, s ezzel teljes kpernyss tenni a programot, s lekrdezni a fejezet korbbi rszben trgyalt profilbelltsokat. Amikor emultorban lefuttattuk a programot, lthattuk, hogy a felbontsa nem megfelel, s nem is hasznlja a teljes kpernyt. Ahhoz, hogy mi magunk lltsuk be a felbontst a Windows Phone telefonok ltal pillanatnyilag egysgesen tmogatott 480800 pixeles mretre, helyezzk el a kvetkez kdsorokat az osztly konstruktorn bell:
graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferWidth = 480; graphics.PreferredBackBufferHeight = 800; graphics.IsFullScreen = true;

A konstruktor tartalmaz mg kt fontos belltst. A msodpercenknti kpkockk szmt (frames per second) harmincra korltozza, amely a telefonokon fut jtkprogramok szmra irnyelv, s rdemes is minden esetben betartani. Tovbb definilja, hol fogjuk a tartalomkezel segtsgvel elrni a jtkhoz tartoz fjlokat. Kt kln metdusunk van, amely a tartalmak kezelsvel foglalkozik. Az els a betltsrt, mg a msodik a memribl val felszabadtsrt felel. A LoadContent() metdus elejn tallhat egy nagyon fontos sor, amely az osztlyhoz tartoz SpriteBatch pldnyt hozza ltre. Ennek az objektumnak a feladata kzvetlen kapcsolatba lpve a grafikus hardverrel, hogy az a ksbbiekben a 2D-s kpeinket (ezek az n. sprite-ok) kirajzolja. A Draw() s az Update() metdusok a jtkciklus rszei. Ahogy a nevk is mutatja, az Update felel a mgttes szmtsokrt. Itt rdemes kezelnnk a bemeneteket, a jtk logikjt s minden egyb szmtst, amelyre a jtknak szksge van. Ha az Update lefutott, akkor kerl sorra a Draw meghvsa, amely elszr trli a rasztertr elz tartalmt, s felrajzolja a sznternket pillanatnyi llapotnak megfelelen. OpenGL s Direct3D hasznlata esetben a jtkmotor feladata az, hogy kidertse az adott hardver kpessgeit sajnos nem rendelkezik minden egyes grafikuskrtya ugyanazokkal a kpessgekkel. Ha valamit nem tmogat a hardver, akkor a CPU-nak is tadhat a feladat, azonban ennek a sebessge katasztroflis, nem rdemes vele prblkozni. gy csak az marad, hogy az adott funkcit nem hasznlhatjuk ki, s a jtk grafikja mr nem lesz olyan szp, mint amilyennek eredetileg terveztk. Az XNA keretrendszer egyszersti ennek a folyamatnak a lpseit. Ktfle profilt hasznlhatunk. A Reach profil mind a hrom platformon azonosan mkdik, azonban nem hasznlja ki a grafikuskrtyk adta legklnflbb specilis funkcikat. Az elnye, hogy biztosak lehetnk, hogy az alkalmazs futni fog az adott clhardveren. A msik profil a HiDef. Itt nincsenek limitciink, minden, ami az XNA s a hardver ltal tmogatott, azt szabadon hasznlhatjuk. A profilbelltsok az XNA projektre kattintva a Properties szekciban tallhatk (11-12. bra).

280

Grafikus programozsi s XNA alapok

11-12. bra: XNA alkalmazsprofilok

Sprite-ok
Ahogy azt mr a fejezet korbbi rszben leszgeztk, nem foglalkozunk 3D-s tartalmakkal, csak a 2D-s jtkok fejlesztshez szksges elmleti s gyakorlati anyagokat vesszk sorra. Egy trbeli jtk esetben szksges lenne, hogy alakzatokkal foglalkozzunk, s azoknak a cscspontjai alapjn hajtsuk vgre a renderelst, azonban most sokkal knnyebb dolgunk lesz. Gondoljunk csak bele egy egyszer 2D-s jtk esetben kpeket rajzolunk fel, ezek a kpek egy ngyszg terlett tltik ki. Ha valamilyen interakci trtnik, akkor ezeket a ngyszgeket kell mozgatnunk a kperny dimenzii kztt. Hogyan tudunk egy kpet megjelenteni XNA-ban? Textraknt. Ebben a feladatban a Texture2D objektum fog segteni, amely a tartalomvezrltl le tudja krni a szksges kpinformcikat. Mivel nincs mg kpnk, gy keressnk egy tetszleges PNG vagy JPG fjlt, s helyezzk el a Content projekten bell! Tipp: a tartalomkezel (Content) projekten bell mindig rdemes rendet tartani. Itt is tudunk ltrehozni mappkat s almappkat, amelybe tpusuktl fggen rendezhetjk a fjlokat, gy a betlts kdbl sokkal strukturltabb lesz, esetleg automatizlhat. A tartalom (jelen esetben ez a textra) lekrst a Content.Load<T>() generikus metdus segtsgvel tudjuk elvgezni. Itt mindig a tartalom Content projekten belli elrsi tjra hivatkozzunk s az adott fjl kiterjesztst hagyjuk le, mivel a tartalomkezel szmra ez talaktsra kerl a projekt fordtsa sorn. Ezek utn megkezdhetjk a sprite kirajzolst! Ez mindig kperny (pontosabban a rasztertr) trlsvel kezddik, amelyet a GraphicsDevice.Clear() metdusa vgez el, s ennek egyetlen paramtere a trlsi szn megadsa, a kperny sszes pixele ezt a sznt veszi fel. Ha a kpernyt trltk, akkor jhet a tnyleges rajzols. Ez mindig a SpriteBatch.Begin() s SpriteBatch.End() metdushvsok kztt trtnik a Draw metdus hvsval. A Draw tbb paramterezssel is elrhet, ezek kzl kett fontos szmunkra: Az els paramterezsben szerepl paramterek sorrendben: 1. A kirajzoland textra objektum. 2. Egy ngyszg, amely els kt paramtere a sprite pozcija, a msodik kett pedig a sprite mrete pixelekben kifejezve. 3. A textrt lehetsgnk van sszemosni egy msik sznnel. Ha fehrtl eltrt adunk meg, akkor a textra pixelei sszeszorzsra kerlnek az adott sznnel. A msodik paramterezs: 1. A kirajzoland textra objektum. 2. Ugyanaz a ngyszg, amely az elz paramterezs esetben is.

281

11. Jtkok a Mango vilgban 3. Egy jabb ngyszg, amely segtsgvel a textrbl egy darabot ki tudunk vgni. Jelentsgt az n. sprite sheetek ltrehozsakor fogjuk ltni a fejezet egy ksbbi rszben. 4. Az sszemossi szn. 5. Z-tengely krli (a kperny skjban) val forgats vals szggel kifejezve. 6. A sprite origjnak megadsa. Alapesetben ez a kperny bal fels sarka (0, 0 ). 7. A sprite horizontlis illetve vertiklis tkrzsre van lehetsgnk a SpriteEffects osztly hasznlatval. 8. Z-Index: ez egy nagyon fontos paramter! Ezzel adhatjuk meg [0; 1] kztti vals szmok segtsgvel, hogy az adott sprite a tbbi eltt vagy mgtt helyezkedik-e el, ezzel mlysgi sorrendet tudunk kialaktani. Pl. egy egyszer ktdimenzis jtkban nem szeretnnk, ha egy fcsom vagy bokor lenne a jtkosunk eltt, gy a mlysgi sorrendjket megvltoztatni szksges. A kvetkez kd egy textrt rajzol ki kt klnbz mdon:
private Texture2D xnaLogo; protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); xnaLogo = Content.Load<Texture2D>( @"xna-logo" ); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(); spriteBatch.Draw( xnaLogo, new Rectangle( 200, 400, 230, 114 ), Color.White ); spriteBatch.Draw( xnaLogo, new Rectangle( 200, 400, 230, 114 ), null, Color.CornflowerBlue, 45.0f, Vector2.Zero, SpriteEffects.FlipVertically, 0.0f ); spriteBatch.End(); base.Draw(gameTime); }

Ha a kdot implementltuk s a megfelel kpfjl a Content projekt rsze, akkor nyugodtan prbljuk ki emultorban az alkalmazst (ha van r lehetsgnk, telefonon is kiprblhatjuk, ugyanazt az eredmnyt fogjuk kapni). A program futst a 11-13. bra szemllteti.

11-13. bra: Kt sprite kirajzolsa kt klnbz mdon

282

Grafikus programozsi s XNA alapok

Bemenetek kezelse
Minden egyes XNA ltal tmogatott eszkzre kln meg lehetne nzni a bemenetek kezelst, mivel az teljesen ms egy Xbox s egy PC esetben is. Ebben a fejezetben mi a Windows Phone Mangra szeretnnk jtkokat rni. A telefonok azonos idben egyszerre tbb rintst kpesek lekezelni a kpernyjkn keresztl, gy az alkalmazsainkat egy Multi Touch (tbb rintst kezel) krnyezetre kell kialaktanunk. Az rintsek kezelsre tbbfle lehetsgnk is van. Ha nem krjk az opercis rendszer segtsgt, hanem mi magunk szeretnnk feldolgozni minden bemeneti informcit, akkor lehetsgnk van a nyers rintsadatok lekrsre, ami azt jelenti, hogy egy tmbben visszakapjuk azokat az (X, Y) koordintkat, ahol a kpernyhz rt a felhasznl. Ebbl sajt algoritmussal kell megllaptanunk, hogy a program milyen vlaszt szolgltasson a bemenet hatsra. Azonban a Windows Phone magas szint tmogatst nyjt az rintspontok kezelsre. Az opercis rendszer beptve tartalmaz mintkat (gestures), amelyek bizonyos rintsmdok hatsra aktivldnak, s a programoz szmra mr esemnyek kpben kerlnek megvalstsra. Ilyen lehet pldul egy egyszer, pr pillanatig tart rints (tap), vagy egyms utn gyorsan vgrehajtva kt rvid rints (double tap), de ez lehet akr egy folyamatos mozgats is a kperny felletn (touch and hold). Az 11-14. bra a klnbz rintsmintkat mutatja be.

11-14. bra: rintsmintk Windows Phone Mangn

283

11. Jtkok a Mango vilgban Az rintsmintk feldolgozsa az XNA alkalmazsokban nagyon knnyen elvgezhet! Els dolgunk engedlyezni a program szmra azokat a gesztusokat, amelyekkel dolgozni szeretnnk. Ezt a TouchPanel objektumon keresztl tudjuk megtenni. Az EnableGestures tulajdonsgt a GestureType elemeivel kell feltltennk, ahol felsoroljuk a hasznlni kvnt rintsmintkat. Az egyes elemeket logikai vagy mvelet segtsgvel tudjuk felsorolni. Ha a gesztusok engedlyezsre kerltek, akkor a jtkciklusunk Update szekcijban folyamatosan figyelnnk kell, hogy volt-e valamilyen bemenet. Ha voltak interakcik ennek ellenrzshez nem kell ms, mint a TouchPanel.IsGestureAvailable tulajdonsgnak lekrdezse , akkor elkezdjk azokat feldolgozni. Megkrjk az opercis rendszert, hogy szolgltassa vissza szmunkra azt a rintsmintt, amelyiket legutoljra szlelt. Ezt a TouchPanel.ReadGesture() metdusa teszi. Ha tbb minta is engedlyezve van, akkor meg kell vizsglnunk a minta tpust. A kvetkez kis mintaalkalmazs kt mintt figyel. Az egyik az egyszer rints, a msik pedig a szabad, folyamatos mozgats a kperny felletn. Ha egyszer rints trnt, akkor megvltoztatjuk a program httrsznt, ha pedig a szabadon val mozgats, akkor a Windows Phone logt brzol textrt elmozdtjuk az rints irnyba.
private private private private Texture2D xnaLogo; Texture2D wp7Logo; Point position; Color clearColor = Color.White;

protected override void Initialize() { TouchPanel.EnabledGestures = GestureType.FreeDrag | GestureType.Tap; base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); position = Point.Zero; xnaLogo = Content.Load<Texture2D>( @"xna-logo" ); wp7Logo = Content.Load<Texture2D>( @"wp7-logo" ); } protected override void Update(GameTime gameTime) { while ( TouchPanel.IsGestureAvailable ) { GestureSample gesture = TouchPanel.ReadGesture(); switch ( gesture.GestureType ) { case GestureType.FreeDrag: position = new Point( (int)gesture.Position.X - 149 / 2, (int)gesture.Position.Y - 177 / 2 ); break; case GestureType.Tap: clearColor = clearColor == Color.White ? Color.Black : Color.White; break; } } base.Update(gameTime); }

284

Grafikus programozsi s XNA alapok

protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear( clearColor ); spriteBatch.Begin(); spriteBatch.Draw( xnaLogo, new Rectangle( 200, 400, 230, 114 ), Color.White ); spriteBatch.Draw( wp7Logo, new Rectangle( position.X, position.Y, 256, 102 ), Color.White ); spriteBatch.End(); base.Draw(gameTime); }

Az rintsek hatsait a 11-15. brn lthatjuk.

11-15. bra: Az rintsek hatsa a mintaalkalmazsban

tkzsek detektlsa
Az tkzsek szlelse, azaz a jtk objektumainak egymssal val tkztetse minden jtkban nagyon fontos szerepet tlt be. Gondoljunk csak bele, hogy ha egy lvldzs jtkban nem kezeljk le a lvedk becsapdst, a goly szabadon elreplhet a vgtelenbe. Ez a jtklmnyt nemcsak, hogy teljesen megli, de a felhasznl szempontjbl hibsnak tnteti fel a programunkat amely teljesen jogos kvetkeztets! Hogyan trtnik az tkzsek kezelse? Elszr nzzk meg ezt ltalnostva! A fejezet korbbi rszben alaposan kivesztk a poligonvzak felptst, s levontuk a kvetkeztetst: egy grafikus alkalmazsban minden matematikai alapra vezethet vissza. Miutn sszetett alakzatokrl beszlnk, gy sokszgek sokszggel val tkzst (metszst) kell kezelnnk. Ha csak kt szereplt nznk, akkor is az A szerepl sszes poligonjra meg kell vizsglnunk, hogy B szerepl valamelyik poligonjval tkztt-e. Ez mg kevs objektum esetn is jelentsen vissza tudja fogni a teljestmnyt, ezrt ms mdszerre lesz szksgnk! Sokkal jobb megolds az, ha az objektum kr valami sokkal egyszerbb trgeometriai alakzatot vonunk, pl. tglatest, gmb, stb. Ha ezeknek az tkzst figyeljk, akkor sokkal kevesebb szmtssal jutunk eredmnyre. Viszont sok objektum esetben mg ez is lassulshoz vezethet, ezrt klnbz struktrkat s eljrsokat szoktak mg bevezetni. Pldul a BSP vagy a Quad fa a teret cellkra osztja fel, s ha kt cella olyan helyzetben van egymshoz kpest, hogy tudjuk, a bell tallhat objektumok kztt lehetetlen az tkzs, akkor velk mr nem is

285

11. Jtkok a Mango vilgban szmolunk. A mai jtkok jelents hnyada is ezeket a megkzeltseket hasznlja, klnbz mdokon kombinlva s tovbbfejlesztve azokat. Szerencsre mi ktdimenzis krnyezetben dolgozunk, gy jval egyszerbb esetekre kell csak felkszlnnk. Ngyszgekkel fogjuk krlvenni az alakzatokat, s annak is a knnyebben kezelhet formjval, ahol eltekintnk a klnbz forgatsoktl. Ha kt ngyszg akrmilyen formban is metszi egymst, akkor tkzs trtnt, s ennek fggvnyben haladunk tovbb a jtkban. Azokat a befog alakzatokat, amik a sk/trbeli forgatsokra is fel vannak ksztve, Axis Aligned Bounding Volume-nak hvjk, rszletes lersokat lehet tallni Wikipedin. Az IsCollision() metdus a kt befog ngyszget megnzi, hogy metszik-e egymst, s az ennek megfelel logikai rtket dobja vissza. Az Update() metduson bell folyamatosan figyeljk, hogy volt-e tkzs, s ha igen, akkor az egyik objektumot tsznezzk.
private Color logoColor = Color.White; protected bool IsCollision() { Rectangle xna = new Rectangle( 200, 400, 230, 114 ); Rectangle wp7 = new Rectangle( position.X, position.Y, 256, 102 ); return xna.Intersects( wp7 ); } protected override void Update(GameTime gameTime) { ... if ( IsCollision() ) logoColor = Color.Yellow; else logoColor = Color.White; base.Update(gameTime); } protected override void Draw(GameTime gameTime) { ... spriteBatch.Draw( wp7Logo, new Rectangle( position.X, position.Y, 256, 102 ), logoColor ); ... }

Animcik
Amikor szmtgpes jtkokban animcirl beszlnk, fontos megklnbztetnnk, hogy pontosan melyik esetrl is van sz. Amikor a telefon mozgatsnak segtsgvel egy autt kormnyozunk, s a kperny megrintsvel pldul lehetsgnk van fkezni, akkor a meglv objektumot mozgatjuk a trben klnbz szablyok alapjn. Egy msik eset az, amikor magt a virtulis objektumot animljuk, az auts pldnl maradva, az autnak tbb tengely krl forognak a kerekei vagy akr kinylhatnak az ajti. Ha az elbbirl van sz, akkor programozottan, kdbl kell az animcit ltrehoznunk, s a kdban kell meghatroznunk, hogy az alakzatot merre toljuk el trben, mennyire forgatjuk el, vagy mennyire kicsinytjk le, nagytjuk fel. Meghatrozhatunk grbket (utakat), amin az objektum vgighaladhat, akr egyes pontjaiban ms animcikkal kombinlva folytatdhat tovbb a cselekmny. Viszont a msodik esetben nem tudjuk kdbl (legalbbis csak nagyon nehzkesen) ltrehozni az elbb emltett lpseket, az adott geometrinak a pontjait krlmnyes lenne kln-kln transzformlni, s ebbl valamilyen valsgh

286

Grafikus programozsi s XNA alapok mozgst ellltani, ezrt ezt valamilyen modellez alkalmazs segtsgvel (3D Studio Max, Maya, Rhino 3D, stb) szoktk vgrehajtani. A trbeli animlsnak rengeteg aspektusa ltezik, amelyek a program komplexitst jelentsen nvelni tudjk. A modern jtkok jelents rsze megint csak a vals letre visszavezetve n. csontozson alapul karakter animcikat alkalmaz, ezt kiegsztve zletekkel s a csontok brhz (skin) val igaztsval. A grafikus szakember a csontokat animlja, zleti rszekkel sszekti ket, amely megszabja pldul, hogy egy trd mekkora szgben s merrefel tud hajlani. Ha ez megvan, akkor a poligonmodellel sszekti s definilja az anyagtulajdonsgokat. Ezek a tulajdonsgok azt rjk le, hogy ha a csontozat mozog, akkor a poligonvznak hogyan kell ahhoz alkalmazkodnia s deformldnia, transzformldnia a trben. Tovbb a csontozsos rendszer segt a jtktrben val adaptciban is, mivel a fizikai motor szintn felhasznlhatja a csontokat rugalmas testek fizikai hatsainak modellezshez. A csontozsos animcit az 11-16. bra mutatja be, amelyen a hres Unreal Engine jtkmotor karakteranimlsa lthat.

11-16. bra: Csontozsos animci Unreal Engine Kt dimenziban azonban nincsenek olyan poligonok, amelyeket animlni lehetne akrmelyik mdszert is hasznlva. Adott egy tlet: ha a karaktereket sprite-knt jelentjk meg, akkor az animci lehetne a kpek egyms utn vltakozsa adott sebessggel. Egy msodperc animcihoz tegyk fel, hogy szksg lenne 30 kpkockra. Ehhez 30 klnbz kpet kell egyms utn, gyorsan megjelenteni. 30 kln kpfjlban trolva a kpeket, azok kezelst jelentsen tlbonyoltannk, radsul feleslegesen. Helyette a sprite sheet nevezet megoldst fogjuk hasznlni. Az animci sszes lpse egy adott kpfjlban kerl eltrolsra, amelyet gy dolgozunk fel, hogy sorra vesszk a kp X Y mret rszeit. Ha egy soron vgigrtnk, akkor a kvetkez sorban folytatjuk a kis kpek kivagdosst, amg a vgre nem rnk az adott animcinak. A 11-17. brn egy futnak az animcijt bemutat sprite sheet lthat.

287

11. Jtkok a Mango vilgban

11-17. bra: Egy fut animcijnak lersa sprite sheettel Lthat, hogy a fenti kp egy 6 5 = 30 kpkocks animcit tartalmaz. A telefonon egy jtk 30 FPS-szel fut, de nem lehet minden animcinak azonos a sebessge, az teljesen furcsa hatst keltene, ha pldul egy aut ugyanolyan sebessggel haladna, mint a felhk. A kvetkezkben egy olyan sprite sheet osztlyt fogunk kszteni, amelyen szablyozhat, hogy az adott animcit milyen sebessggel jtssza le. Nzzk, milyen tulajdonsgokra lesz szksgnk az osztlyban: FrameSize Egyetlen kpkocka mrete (szlessg, magassg). SheetSize Hny kpkockt tartalmaz a sprite sheet (sorban, oszlopban)? CurrentFrame ppen melyik kpet jelentjk meg (sor, oszlop)? Texture Az a Texture2D objektumpldny, amely a sprite sheetet tartalmazza. FrameRate Az animci sebessge (kpkocka per msodperc). Position A kirajzoland sprite (X, Y) koordinti. Rotation Z-tengely krli elforgats mrtke szgben mrve.

Az osztly tetszs s igny szerint tovbb bvthet, de a fenti tulajdonsgok megvalstsval a program legtbb esetben mr gy is jl hasznlhatnak fog bizonyulni. Kt metdust kell ltrehoznunk. Az egyik a frisstsrt felel (Update), a msik pedig a kirajzolsrt (Draw). Ha az osztlyt a GameComponent sosztlybl szrmaztatjuk, akkor a ksbbiekben nem kell a metdusokrl sajt magunknak gondoskodnunk, a jtkciklus megfelel helyein meghvsra fognak kerlni. A frisstst megvalst metdus paramterl kap egy GameTime objektumpldnyt. Ennek feladata a jtkban eltelt id mrse. Mirt van erre szksg? Gondoljunk csak bele, ha a jtk nem futtathat valamilyen eszkzn megfelel sebessggel, akkor a valsgban eltelt id mrse nem lesz elegend,

288

Grafikus programozsi s XNA alapok szksgnk lesz egy olyan idmrsi mdszerre is, amely a jtkunk lassult vgrehajtsi sebessghez igazodik. A metduson bell megnzzk, eltelt-e mr annyi id, ami az FPS szmunknak megfelel, ha igen, akkor a CurrentFrame tulajdonsgot megfelelen nveljk, hogy a kvetkez kpkockra mutasson. A rajzolsrt felels kdunk a mr ismert SpriteBatch.Draw() metdust hvja egy ms paramterezsi mddal, mint amit a fejezet korbbi rszben hasznltunk. Szmunkra itt a msodik s a harmadik paramterek a fontosak. A msodik paramter feladata megmondani az XNA-nak, hogy melyik (X, Y) pozciba rajzolja fel a textrt s mekkora mretekkel. A harmadik paramter mr egy kicsit izgalmasabb. Itt kell megadnunk, hogy mekkora darabjt rajzolja ki az eredeti sheet-nek. Itt sorszm kpkocka_szlessg s oszlopszm kpkocka_magassg rtkekkel kell szmolnunk. A Draw() metdus tbbi paramtert a fejezet korbbi rszben mr tbeszltk.
public class SpriteSheet : GameComponent { public Point FrameSize { get; set; } public Point CurrentFrame { get; set; } public Point SheetSize { get; set; } public Texture2D Texture { get; set; } public Point Position { get; set; } public float Rotation { get; set; } private int timeSinceLastRender = 0; public int FrameRate { get; set; } public SpriteSheet( Game game, Texture2D tex, Point frameSize, Point sheetSize, int speed ) : base( game ) { CurrentFrame = Point.Zero; Texture = tex; FrameSize = frameSize; SheetSize = sheetSize; FrameRate = speed; } public void Draw( SpriteBatch spriteBatch ) { spriteBatch.Draw( Texture, new Rectangle( Position.X, Position.Y, FrameSize.X, FrameSize.Y ), new Rectangle( FrameSize.X * CurrentFrame.X, FrameSize.Y * CurrentFrame.Y, FrameSize.X, FrameSize.Y ), Color.White, Rotation, Vector2.Zero, SpriteEffects.None, 0.0f ); } public override void Update(GameTime gameTime) { timeSinceLastRender += gameTime.ElapsedGameTime.Milliseconds; if ( timeSinceLastRender > ( 1000 / FrameRate ) ) { timeSinceLastRender -= 1000 / FrameRate; int x = CurrentFrame.X; int y = CurrentFrame.Y; x++; if ( x >= SheetSize.X ) { x = 0; y++; if ( y >= SheetSize.Y )

289

11. Jtkok a Mango vilgban

y = 0; } CurrentFrame = new Point( x, y ); } base.Update(gameTime); } }

Ha az osztly kszen van, akkor a Game1.cs fjlban hasznljuk is fel! Hozzunk ltre egy j adattagot, amely az jonnan ltrehozott osztly egy pldnya! A LoadContent() metduson bell szksges inicializlnunk. A pozcijt a kperny kzepre kiszmtva adjuk meg, majd a jtk komponensei kz felvesszk az objektumpldnyt, ennek kvetkeztben az Update() metduson bell az XNA automatikusan hvni fogja az objektumhoz tartoz Update() metdust. Az emultoron val futtats eredmnyt a 11-18. bra illusztrlja.
private SpriteSheet walk; protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); walk = new SpriteSheet( this, Content.Load<Texture2D>( "walk" ), new Point( 240, 296 ), new Point( 6, 5 ), 20 ); walk.Position = new Point( ( 480 - 240 ) / 2, ( 800 - 296 ) / 2 ); Components.Add( walk ); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear( clearColor ); spriteBatch.Begin(); walk.Draw( spriteBatch ); spriteBatch.End(); base.Draw(gameTime); }

11-18. bra: A sprite animci egy pillanatfelvtele

290

XNA s Silverlight integrci

XNA s Silverlight integrci


A Windows Phone 7 els verzija mg lesen sztvlasztotta az XNA s a Silverlight ltal kpviselt kt kln vilgot, gy pldul egy Silverlightot hasznl programban nem jelenthettnk meg semmilyen XNA tartalmat. A Mango egyik nagy jdonsga, hogy kpes hibrid renderelsre, azaz Silverlight alkalmazsokban akr hromdimenzis, textrzott poligonmodelleket is meg tudunk jelenteni. Azonban a kt technolgia fzija krdseket vet fel! Az egyik jtkciklust hasznl, mg a msik egy esemnyvezrelt krnyezetet valst meg. Hogyan tudjuk a kettt kzs nevezre hozni? Az XNA pixelalap tartalmakat rajzol ki, amg a Silverlight vektoralapon szmtott vezrlkkel ltja el ezt a feladatot. Hogyan tudjuk a klnbz tartalmakat megjelenteni? Ezekre a krdsekre kapunk vlaszokat ebben a rszben.

Silverlight s XNA egytt a gyakorlatban


Ahhoz, hogy az XNA s Silverlight egyttmkdst gyakorlatban is megismerjk, egy Snake jtkot fogunk rni. Valsznleg mindenki jl ismeri a klasszikus kgys jtkot, ahol a szereplnk apr blokkokbl pl fel, s a jtkos feladata gy irnytani a kgyt, hogy a plyn vletlenszeren megjelen elesgeket sszegyjtse, mikzben nem tkzik se sajt testbe, se a plyt hatrol falakba. A jtkot bonyoltja, hogy minden egyes elesgdarabka felszedse utn a kgy hosszabb lesz, gy nehezebb lesz elkerlni, hogy valahol ne tkzzn. Ez a lers csak a jtk alapjait fogja bemutatni, a pontszmts, a klnbz jtklmny-elemek kialaktsa mr a kedves Olvas feladata, teljes mrtkben a kreativitsra bzom. A plya httert a 11-19 brn lthat 480800 pixel felbonts textra fogja adni, illetve egy apr pontot brzol textrt fogunk a kgy szegmensekhez felhasznlni. A plyn msra nem is nagyon lesz szksgnk, mg egy elemet leszmtva: a szneteltets gomb, melyet Silverlight segtsgvel valstunk meg. rdekessg: termszetesen XNA-ban is kszlnek klnbz menrendszerek s vezrlk, amelyeket nem jtkalkalmazsokban mr megszoktunk, azonban ezeknek az elksztse krlmnyesebb sokkal, ha nincs a segtsgnkre a Silverlight. A jtkot mint egy nagy llapotgpet kell elkpzelnnk, ahol maga a jtk irnytsa csak egyetlen llapotot jelent, s ezenkvl szmos egyb is megtallhat az llapotgrfban, pl: men megjelentse, ments megjelentse, jtk vge llapot, stb. A felrajzols ugyangy a jtkciklusban trtnik, s nincsen navigcis rendszernk, amely az egyes alkalmazsoldalak kztt tud minket tvinni. gy ha sikeresen ki is alaktunk egy menrendszert, akkor a gombokat, listadobozokat, szvegmezket mg magunknak kell implementlnunk. Ezt gy kpzeljk el, hogy lekezeljk a bemenetet, amely jelen esetben csak egy rints a telefon kpernyjn! Ha az rints koordinti az adott gomb ltal takart skrszbe tartoznak, akkor vgrehajtunk valamilyen esemnyt. Azonban figyelnnk kell arra, hogy a gombot csak egyszer tekintsk lenyomottnak. Mivel a jtkciklus msodpercenknt harmincszor lejtszdik, gy a gombnyoms is harmincszor hajtdna vgre.

291

11. Jtkok a Mango vilgban

11-19 bra: a Snake jtk httrtextrja Hozzunk ltre egy j projektet, ennek a tpusa most Windows Phone Silverlight and XNA Application legyen, a neve pedig Snake, ahogy a 11-20 brn is lthat!

11-20 bra: j projekt ltrehozsa a jtkhoz Lthat, hogy a f projekt tartalmazza a Silverlight alkalmazsokban jl megszokott MainPage.xaml fjlt, amely a felhasznli felletnknek az alapjt jelenti. Tovbb bvlt a projektnk az eddigiekhez kpest egy GamePage.xaml fjllal is, melynek deklaratv rsze teljes mrtkben res, a mgttes kd viszont az XNA-val val egyttmkdsre fel lett ksztve. Kszlt mg kt projekt. Az egyik az XNA tartalomkezelje, amellyel mr tallkoztunk a fejezet sorn, a msik viszont jdonsg. Egy XNA knyvtr, amely hivatkozik a Content projektre, tovbb alkalmas arra, hogy elksztsk benne az XNA komponenseinket. A jtk jelents rszt itt fogjuk megrni. Miutn a projektet ltrehoztuk, szksgnk lesz egy osztlyra, amely a kgynak a szegmenseit trolja. Minden egyes szegmensrl tudnunk kell a kvetkez informcikat: Position: a szegmens pozcija a jtk felletn (X, Y) koordintkkal Direction: az aktulis irny, amerre haladnia kell (irnyvektorknt tekintsnk r) PrevDirection: akkor fogjuk felhasznlni, amikor a kgy kanyarodik valamerre Texture: a kgyszegmens textrja

Hozzunk is ltre egy j osztlyt a SnakeLib projekten bell, melynek neve SnakeBlock, s a tartalma a kvetkez osztlydefinci a megfelel tulajdonsgokkal:

292

XNA s Silverlight integrci

public class SnakeBlock { public Vector2 Position { get; set; } public Vector2 PrevDirection { get; set; } public Vector2 Direction { get; set; } public Texture2D Texture { get; set; } }

Ha megvagyunk a szegmens osztllyal, akkor ksztennk kell mg egy msik osztlyt is (grem, nem visszk tlzsba az objektum-dekompozcit), amely magt a kgyt s a viselkedshez szksges elemeknek egy nagy rszt tartalmazza. Ezt is a SnakeLib nevezet XNA projekten bell. Elszr is szksges egy lista, amely a szegmenseket sorolja fel (kezdetben legyen telem), egy kezdeti irny- s pozcivektor. Miutn a textrkat az osztly magnak fogja lekrni, a ContentManager ltez pldnyt is t kell majd adni konstruktoron keresztl s letrolni azt. A sebessg sem kzmbs tnyez. Ha nem korltozzuk valamilyen mdon, akkor msodpercenknt 30szor lesz lptetve a jtkos, amitl teljesen irnythatatlann vlik. lltsuk majd be mondjuk fl msodpercenknti frisstsre, s ehhez troljuk le az utols frissts idpontjt! A konstruktor feltlti kezdeti rtkkel az adattagokat, s ltrehozza az els t szegmenst a kezdeti irny s a pozci fggvnyben:
public class SnakeObject { public List<SnakeBlock> snake { get; private set; } private ContentManager contentMgr; private readonly Vector2 baseDir = new Vector2( 0, 1 ); private readonly Vector2 basePos = new Vector2( ( 480 - 16 ) / 2, ( 800 - 16 ) / 2 ); private DateTime lastTime = DateTime.Now; public bool IsPaused { get; set; } // megllthat lesz a jtk Silverlight UI-rl public SnakeObject( ContentManager cm ) { this.contentMgr = cm; snake = new List<SnakeBlock>(); snake.Add( new SnakeBlock { Direction = baseDir, Position = basePos } ); snake.Add( new SnakeBlock { Direction = baseDir, Position = new Vector2( basePos.X, basePos.Y - baseDir.Y * 1 * 16 ) } ); snake.Add( new SnakeBlock { Direction = baseDir, Position = new Vector2( basePos.X, basePos.Y - baseDir.Y * 2 * 16 ) } ); snake.Add( new SnakeBlock { Direction = baseDir, Position = new Vector2( basePos.X, basePos.Y - baseDir.Y * 3 * 16 ) } ); snake.Add( new SnakeBlock { Direction = baseDir, Position = new Vector2( basePos.X, basePos.Y - baseDir.Y * 4 * 16 ) } ); snake[ 0 ].PrevDirection = snake[ 0 ].Direction; } }

293

11. Jtkok a Mango vilgban Kvetkez feladatunk a megfelel textra betltse a szegmensek szmra. Minden egyes blokk ugyanazt a textrt fogja kapni. A feladat egyetlen Texture2D pldnnyal is megoldhat lett volna, azonban szerettem volna egy automatizlt megoldst mutatni ciklus segtsgvel, amely jl hasznlhat olyan esetekben, amikor tbb objektum textrit tltjk be.
public void LoadContent() { foreach ( SnakeBlock block in snake ) block.Texture = contentMgr.Load<Texture2D>( @"Textures/sprite" ); }

A fejezet pldinak a vgigolvassa (esetleg vgigprblsa) utn a felrajzols nem okozhat problmt, a legegyszerbb paramterezsi mddal fogjuk meghvni a SpriteBatch.Draw() metdust.
public void Draw( GameTime time, SpriteBatch spriteBatch ) { foreach ( SnakeBlock block in snake ) spriteBatch.Draw( block.Texture, new Rectangle( (int)block.Position.X, (int)block.Position.Y, 16, 16 ), Color.White ); }

Betltttk a textrkat, fel tudjuk rajzolni a szegmenseket, nincs ms htra, mint a frisstst vgz Update() metdust megvalstani. Ez egy kicsit nagyobb falat lesz, mint azt elre gondolnnk. Elszr is a kpernyn gesztusok segtsgvel tud naviglni a felhasznl, ezt mindenkppen le kell kezelnnk. A kgy irnytshoz, mindegy, hogy hol r a kpernyhz, azt fogjuk nzni, hogy a hatrozott, irnyt mutat mozdulata merre mutat. Mivel az rintsminta csak azt tudja visszaadni, hogy vzszintesen s fgglegesen mekkora vltozs trtnt, gy az irnyvektort magunknak kell meghatroznunk. Arkusztangens segtsgvel kiszmoljuk a mozdulatbl szrmaz irnyvektorhoz tartoz szget, melyet radinban mrve kapunk vissza. Ezt neknk valdi szgre kell tvltanunk, amelyet egy segdfggvny vgez (GetAngle). Ha a szg megvan, akkor megnzzk, mely tartomnyba mutatott az irnyvektor, s ennek fggvnyben ellltjuk a kgy j irnyt. A frisstsnek van mg egy msodik rsze is, ami fl msodpercenknt a kgyt tovbblpteti a felleten. Amikor az j irnyt meghatroztuk, nem azt szerettk volna elrni, hogy a kgy sszes szegmense egyszerre mozduljon el az j irnyba, hanem itercinknt mindig csak egy szegmens, a r kvetkez pedig majd egy msik iterciban. Ehhez a Direction s a PrevDirection tulajdonsgokat fogjuk felhasznlni, amely a szegmensek kztt mindig egy elcssztatst fog jelenteni.
public void Update(GameTime gameTime) { if ( IsPaused ) return; while ( TouchPanel.IsGestureAvailable ) { GestureSample gesture = TouchPanel.ReadGesture(); if ( gesture.GestureType == GestureType.Flick ) { double angle = GetAngle( gesture.Delta.X, gesture.Delta.Y ); Vector2 dir = snake[ 0 ].Direction; if ( 45 <= angle && angle < 135 ) { if ( dir.Y <= 0 ) dir = new Vector2( 0, -1 ); }

294

XNA s Silverlight integrci

else if ( 135 <= angle && angle < 225 ) { if ( dir.X <= 0 ) dir = new Vector2( -1, 0 ); } else if ( 225 <= angle && angle < 315 ) { if ( dir.Y >= 0 ) dir = new Vector2( 0, 1 ); } else { if ( dir.X >= 0 ) dir = new Vector2( 1, 0 ); } snake[ 0 ].PrevDirection = snake[ 0 ].Direction; snake[ 0 ].Direction = dir; } } if ( ( DateTime.Now - lastTime ).TotalMilliseconds >= 500 ) { var dir2 = snake[ 0 ].Direction; snake[ 0 ].Position += new Vector2( dir2.X * 16, dir2.Y * 16 ); for ( int i = 1; i < snake.Count; ++i ) { snake[ i ].PrevDirection = snake[ i ].Direction; snake[ i ].Direction = snake[ i - 1 ].PrevDirection; snake[ i ].Position += new Vector2( snake[ i - 1 ].PrevDirection.X * 16, snake[ i - 1 ].PrevDirection.Y * 16 ); } snake[ 0 ].PrevDirection = snake[ 0 ].Direction; lastTime = DateTime.Now; } }

Mivel az rintsminta nem tudott szget meghatrozni, ezt magunknak kell megtennnk. A kperny s a jtkunk koordintarendszere egymshoz kpest el van forgatva, gy a fgglegesen mrt rtket invertlnunk kell. Tovbb negatv szgekkel nem szeretnnk szmolni, ezrt 2 p, azaz 360 fokos forgatssal szmoljuk ki az adott szget. Ha elllt a megfelel rtk, akkor az mg radinban van, ezrt t kell vltanunk vals szgmrtkbe.
public static double GetAngle( double deltaX, double deltaY ) { double num = Math.Atan2( -deltaY, deltaX ); if ( num < 0.0 ) { num = 6.28318530717959 + num; } return num * 360.0 / 6.28318530717959; }

Majdnem kszen vagyunk a kgyt ler osztllyal, de a jtkunk mit sem rne tkzsdetektci nlkl. Kt kln metdust fogunk bevezetni. Az elsnek annyi a feladata, hogy eldntse, beletkztt-e a kgy a falba vagy a sajt testbe, ha igen, akkor a megfelel logikai rtket adja vissza.

295

11. Jtkok a Mango vilgban A msik metdus feladata pedig az, hogy megnzze, a kgy feje rintkezett-e a plyn elszrt kinccsel, ha igen, akkor adjon hozz a kgy testnek legvghez egy j szegmenst. Az tkzsvizsglathoz megint csak jl kzeltett befoglal ngyszgeket hasznlunk, s azoknak a metszsviszonyt figyeljk.
public bool DetectCollision() { var snakePosition = snake[ 0 ].Position; if ( snakePosition.X <= 16 || snakePosition.X >= 464 ) return true; if ( snakePosition.Y <= 16 || snakePosition.Y >= 784 ) return true; Rectangle snakeHead = new Rectangle( (int)snake[ 0 ].Position.X, (int)snake[ 0 ].Position.Y, 16, 16 ); for ( int i = 1; i < snake.Count; i++ ) { Rectangle snakeBody = new Rectangle( (int)snake[ i ].Position.X, (int)snake[ i ].Position.Y, 16, 16 ); if ( snakeHead.Intersects( snakeBody ) ) return true; } return false; } public bool DetectCollisionWithNewBlock( SnakeBlock newBlock ) { Rectangle snakeHead = new Rectangle( (int)snake[ 0 ].Position.X, (int)snake[ 0 ].Position.Y, 16, 16 ); Rectangle block = new Rectangle( (int)newBlock.Position.X, (int)newBlock.Position.Y, 16, 16 ); if ( snakeHead.Intersects( block ) ) { var prev = snake[ snake.Count - 1 ]; snake.Add( new SnakeBlock { Position = prev.Position + new Vector2( -prev.Direction.X * 16, -prev.Direction.Y * 16 ), Direction = prev.Direction, Texture = prev.Texture } ); return true; } return false; }

A kgyt ler osztllyal kszen vagyunk. A GamePage.xaml fjlban ltre kell hoznunk a szneteltets gombot. A korbbi fejezetek sorn rszletesen lttuk, hogy trtnik ez, gy a kvetkez nhny sor kd semmilyen meglepetst nem tartogat. A gombnak explicit mretezst adtam, s a kperny jobb fels sarkba igaztottam. Tovbb ltrehoztam a Click esemnyvezrlt is.
<phone:PhoneApplicationPage x:Class="Snake.GamePage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" FontFamily="{StaticResource PhoneFontFamilyNormal}"

296

XNA s Silverlight integrci

FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" mc:Ignorable="d" d:DesignHeight="800" d:DesignWidth="480" shell:SystemTray.IsVisible="False"> <Grid x:Name="LayoutRoot"> <Button Width="140" Height="100" HorizontalAlignment="Right" VerticalAlignment="Top" Click="Button_Click">Pause</Button> </Grid> </phone:PhoneApplicationPage>

Mgttes kdban tbb j adattagot is ltre kell hoznunk. Szksgnk lesz egy j objektumpldnyra a kgy osztlyunknak, kelleni fog egy httr textra s egy vletlen szm genertor, amellyel az elesget fogjuk elszrni a plyn. Ahhoz, hogy ide ne kelljen a ksbbiekben visszatrnnk, elhelyeztem egy UIElementRenderer adattagot is, amelynek funkcijt a ksbbiekben rszletesen megismerjk majd, egyelre elg, ha deklarljuk.
private private private private private private private private ContentManager contentManager; GameTimer timer; SpriteBatch spriteBatch; SnakeObject snake; SnakeBlock newBlock; Texture2D background; Random rand = new Random(); UIElementRenderer uiRenderer;

Az osztly konstruktorban engedlyeznnk kell az rintsmintk hasznlatt, a tartalomkezel felhasznlsval inicializlnunk kell a kgy objektumpldnyunkat, s fel kell iratkoznunk az oldal LayoutUpdated esemnyre is, amely minden egyes alkalommal le fog jtszdni, amikor a fellet frissl.
public GamePage() { InitializeComponent(); contentManager = (Application.Current as App).Content; snake = new SnakeObject( contentManager ); TouchPanel.EnabledGestures = GestureType.Flick; timer = new GameTimer(); timer.UpdateInterval = TimeSpan.FromTicks(333333); timer.Update += OnUpdate; timer.Draw += OnDraw; LayoutUpdated += new EventHandler(GamePage_LayoutUpdated); }

Amikor az oldalra naviglunk (elszr a MainPage.xaml-lel indul az alkalmazs, s onnan trnk t a jtkoldalra), akkor be kell tltennk a tartalmakat, ami a mi esetnkben semmi mst nem jelent, mint a textrk lekrst a tartalomkezeltl. Itt trtnik meg az els felszedhet szegmens (ha az elesg nv tetszetsebb, akkor hvhatjuk gy is) inicializlsa is.
protected override void OnNavigatedTo(NavigationEventArgs e) { SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(true);

297

11. Jtkok a Mango vilgban

spriteBatch = new SpriteBatch(SharedGraphicsDeviceManager.Current.GraphicsDevice); snake.LoadContent(); background = contentManager.Load<Texture2D>( "Textures/Background" ); newBlock = new SnakeBlock { Position = new Vector2( rand.Next() % 480, rand.Next() % 800 ), Texture = contentManager.Load<Texture2D>( "Textures/sprite" ) }; timer.Start(); base.OnNavigatedTo(e); }

Kt nagyon fontos rsze van vissza a jtknak. A jtkciklus kt komponenst el kell ksztennk. Elszr rdemes a frisstst vgz Update() metdust ltrehozni, mivel tartalma egszen egyszer lesz, az tkzsek kt klnbz tpust fogja figyelni. A sima tkzs lekezelst az Olvasra bzom, amg az elesg sszeszedsrt felels tkztetst mg egytt elksztjk. Nagyon egyszer feladat! Semmi mst nem kell tennnk, amikor az elszrt szegmenst sszeszedjk, mint generlni a helyre egy msikat, mivel a kgy osztly tkzsdetektl metdusa az elz elemet automatikusan a kgy testhez fogja fzni.
private void OnUpdate(object sender, GameTimerEventArgs e) { snake.Update( null ); if ( snake.DetectCollision() ) ; // ezt a rszt az olvas kreatvitsra bzom if ( snake.DetectCollisionWithNewBlock( newBlock ) ) { newBlock.Position = new Vector2( rand.Next() % 480, rand.Next() % 800 ); } }

Mieltt a rajzolst is megvalstannk, mg kt dolog hinyzik. Az egyik a szneteltets gomb Click esemnyvezrlje, a msik pedig a LayoutUpdated esemnyvezrl. Az utbbit mirt is hoztuk ltre? Az XNA tartalom elsbbsget lvez a kirajzols sorn, s a Silverlight alapon definilt fellet automatikusan nem kerl megjelentsre. Ahhoz, hogy az is kirajzolsra kerljn, textrt kell belle ksztennk, amelyhez a tartalmat folyamatosan frisstennk kell.
private void Button_Click(object sender, RoutedEventArgs e) { snake.IsPaused = !snake.IsPaused; } void GamePage_LayoutUpdated(object sender, EventArgs e) { if ( uiRenderer == null || LayoutRoot.ActualWidth > 0 && LayoutRoot.ActualHeight > 0 ) uiRenderer = new UIElementRenderer( LayoutRoot, (int)LayoutRoot.ActualWidth, (int)LayoutRoot.ActualHeight ); }

s a vgre maradt a rajzolst vgz OnDraw() metdusunk ltrehozsa, melynek feladata a szntr felrajzolsa. Nagyon fontos megfelel sorrendben dolgoznunk. Elszr is megkrjk a krnyezetet, hogy renderelje le a Silverlight tartalmat, amely egyelre nem fog megjelenni. Utna felrajzoljuk a httr textrt s a kgyt. Miutn ezek is megjelentsre kerltek, akkor a textrba renderelt Silverlight tartalmat is egy egyszer Sprite-knt felrajzoljuk. 298

XNA s Silverlight integrci

private void OnDraw(object sender, GameTimerEventArgs e) { SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Color.Black); uiRenderer.Render(); spriteBatch.Begin(); spriteBatch.Draw( background, new Microsoft.Xna.Framework.Rectangle( 0, 0, 480, 800 ), Color.White ); spriteBatch.Draw( newBlock.Texture, new Microsoft.Xna.Framework.Rectangle( (int)newBlock.Position.X, (int)newBlock.Position.Y, 16, 16 ), Color.White ); snake.Draw( null, spriteBatch ); spriteBatch.End(); spriteBatch.Begin(); spriteBatch.Draw( uiRenderer.Texture, Vector2.Zero, Color.White ); spriteBatch.End(); }

Ha kszen vagyunk, sehol nincsenek mr a projektben szintaktikai hibk, akkor fordtsuk le, s futtassuk emultor segtsgvel! A 11-21 brn lthat eredmnyt kell kapnunk. Hatrozott mozdulatokkal irnythat a kgy, s a Pause gomb lenyomsnak hatsra a jtk szneteltetsre kerl, illetve jraaktivldik.

11-21 bra: A Snake jtk futs kzben

sszefoglals
Ebben a fejezetben megismerkedtnk a Windows Phone platformot alkot technolgik felptsvel, s betekintst nyertnk a szmtgpes (vagy mondhatnm inkbb okostelefonokra tervezett?) jtkok

299

11. Jtkok a Mango vilgban fejlesztsbe. ppen csak a felsznt rintve ttekintettk a szmtgpes grafika elmleti httert s ennek kapcsn a jtkokat alkot grafikus megoldsokat is. Megismerkedtnk az XNA Framework alapvet hasznlatval, illetve lttuk a Mangban jdonsgknt bevezetett hibrid renderelsi rendszer mkdst s hasznlatt is. Az utbbira ptve elksztettk egy Snake jtknak az alapjait is, melyet az Olvas tetszse szerint tovbb bvthet.

300

12. Marketplace
Ebben a fejezetben megismerkedhetnk a Windows Phone 7 koszisztmjnak kzponti szerepljvel, a Marketplace-szel. A telefon s a rajta lv opercis rendszer brmennyire is j, res lenne alkalmazsok nlkl. A Windows Phone 7-hez tartozik egy piactr, ahonnan alkalmazsokat tlthetnk le, illetve fejlesztknt publiklhatjuk sajt alkalmazsainkat. Azok lehetnek ingyenesek vagy djktelesek, s brki publiklhat, aki megfelel a Marketplace feltteleinek. Ebben a rszben a kvetkez tmkat nzzk t: Mi az a Marketplace? Kszlken trtn hibakeress Kszlk regisztrci Publikls Screenshot kszts Marketplace Test Kit Kpek s ikonok Marketplace Task-ek Trial Mode

APPHUB
Az AppHub a Microsoft Windows Phone 7 fejleszti menedzsment oldala, ahol a fejlesztk kezelhetik az alkalmazsaikat, frissthetik azokat, nyomon kvethetik azok npszersgt, s kvethetik az rtkestskbl befolyt sszegeket is. Az AppHub a http://create.msdn.com cmen rhet el. A fejleszti regisztrci ves dja jelenleg 99 USD, ami hrom fejleszti kszlk hasznlatt (developer unlock) tartalmazza s a piactrre val publikls lehetsgt. Az AppHubra hromfle regisztrcitpus ltezik: 1. Cg nevben (akkor hasznlatos, ha a fejleszt egy cg, vagy szervezet) 2. Magnszemly (akkor alkalmazzuk, ha egy egyszer magnszemlyrl van sz) 3. Dikknt (akkor vlasszuk ezt a lehetsget, ha aktv sttusz kzpiskolai vagy felsoktatsi hallgatk vagyunk. Ebben az esetben a DreamSpark program http://dreamspark.com keretein bell a 99 USD ves djat nem kell kifizetnnk, s ingyenesen publiklhatunk, akr djkteles alkalmazsokat is!) A regisztrcinl szksgnk lesz egy Windows Live ID-ra, cgek s a magnszemlyek esetn egy bankszmlra is. Cgek esetben a regisztrcit kveten egy GeoTrust nev cg fogja felvenni a kapcsolatot annak rdekben, hogy ellenrizze, a vllalat tnyleg az ltala megadott orszgban tevkenykedik. A regisztrci magnszemlyek esetn 1-2 napot, cgek esetn olykor 3-4 napot is ignybe vehet.

Kszlken trtn hibakeress s regisztrci


Knyvnk eddigi fejezeteiben az alkalmazsok fejlesztsnl csak az emultorra koncentrltunk, viszont az alkalmazsainkat clszer kiprblni egy fizikai kszlken is, mieltt publiklnnk azt. Egyfell ez azrt hasznos, mert felmrhetjk, hogy hasznlhatsg szempontjbl milyen az alkalmazsunk, msfell azrt, mert az emultor s a fizikai kszlk kztt komoly eltrsek lehetnek a teljestmnyt illeten. Ezrt minden esetben, ha elksztnk egy alkalmazst, clszer azt kiprblni egy fizikai kszlken is. Megnehezti azonban a dolgunkat, hogy a Windows Phone 7 -nl mr nemcsak egy egyszer fjl msolsbl ll a telepts, mint a Windows Mobile esetben, hanem mr csak az a fejleszt frhet a 301

12. Marketplace kszlkhez, aki rendelkezik fejleszti fikkal (developer account). Ahhoz, hogy legyen egy ilyen elfizetsnk, regisztrlnunk kell magunkat a Marketplace-en. Ha a regisztrcit elvgeztk, USB kbellel kssk ssze a kszlknket a szmtgpnkkel! Figyeljnk arra, hogy a Zune szoftvernek (www.zune.net) teleptve kell lennie! Amikor sszektttk a Windows Phone 7-et a gppel (12-1 bra), akkor automatikusan el fog indulni a Zune szoftver (ha ez valamilyen oknl fogva nem trtnne meg, indtsuk el manulisan!), majd ezt kveten el kell indtanunk a Windows Phone Developer Registration tool nevezet alkalmazst (ez az alkalmazs a Windows Phone 7 SDK rsze). Miutn elindtottuk, adjuk meg a Live ID-nkat azt, amelyikkel korbban a Marketlace-re regisztrltunk , majd ha ez megtrtnt, kattintsunk az Unregister gombra! Ha minden rendben zajlott, a telefonunk fejleszti zrolsa feloldsra kerlt (12-2 bra).

12-1 bra: Zune szoftver

Fontos! Csak gy tudjuk unlockolni a kszlket, ha a kpernyzr fel van oldva!

12-2 bra: Windows Phone Developer Registration Tool Az AppHub-on a sajt fejleszti fikunk devices menpontja alatt lthatjuk a zrols all feloldott kszlkeink listjt. Abban az esetben, ha esetleg lecserlnnk a jelenlegi kszlknket egy jabbra, akkor ezen az oldalon tudjuk eltvoltani a zrols feloldst is. Figyeljnk arra, hogy ha a kszlknket frisstettk vagy reseteltk, akkor a developer unlock is eltnik, ilyenkor ezt a folyamatot meg kell ismtelnnk!

302

Kszlken trtn hibakeress s regisztrci

12-3 bra: AppHub a feloldott fejleszti zrols kszlkek listjval Ha minden rendben zajlott, akkor mr lehetsgnk van az alkalmazsunkat a fizikai kszlknkn is tesztelni. Ez mind Visual Studio-bl, mind Expression Blendbl egyszeren megoldhat. Abban az esetben, ha a fejleszti krnyezetbl publikljuk a kszlkre az alkalmazst, a debugger rgtn elindul s ugyangy, ahogy az emultornl, hibt tudunk keresni az alkalmazsban. Ehhez mindssze a Visual Studio-ban kell a kimenetet tlltani Windows Phone Emulator-rl Windows Phone Device-ra. Ezt kveten az F5-t megnyomsa utn mr a kszlkre kerl fel az alkalmazs, s ott tudunk hibt keresni (12-4 bra).

12-4 bra: Kszlkre trtn publikci Figyelnnk kell arra is, hogy az alkalmazs Visual Studio-bl trtn teleptsekor is fel kell oldani a kpernyzrat! Ha ezt nem tennnk meg, akkor Access is denied hibt kapnnk.

Alkalmazsok teleptse
Abban az esetben, ha csak egyszeren telepteni szeretnnk egy mr lefordtott alkalmazst, amelynek keznkben van az XAP fjlja, akkor ezt az Application Deployment Tool-lal tehetjk meg, ami szintn a Windows Phone 7 SDK rsze. Az alkalmazs felptse nagyon egyszer: elszr megmondjuk, hogy melyik eszkz a cl (target) a kszlk vagy az emultor , majd kikeressk a teleptend XAP fjlt, s megnyomjuk a Deploy gombot (12-5 bra). Ha minden rendben zajlott, akkor az adott alkalmazs megjelenik a kszlk vagy az emultor alkalmazsai kztt. Itt is fontos megjegyezni, hogy a mvelet sorn a telefon kpernyje nem lehet zrolva!

303

12. Marketplace

12-5 bra: Az Application Deployment Tool A kszlkre maximum tz alkalmazst tudunk feltelepteni a feloldott fejleszti zr birtokban. Ha ennl tbbre lenne szksgnk, akkor egy elz, ltalunk teleptett alkalmazst el kell tvoltanunk.

ChevronWP7
A Microsoft tmogatsval elindult a http://labs.chevronwp7.com/ oldal (12-6 bra), ahol a hobbifejlesztk feloldhatjk telefonjuk zrolst, fggetlenl attl, hogy milyen rgiba tartoznak, vagy hogy az adott orszgbl elrhet-e a Marketplace. Br ez a szolgltats nem ingyenes, 9 USD-be kerl telefononknt, mgis hasznos lehet. A 9 USD-t egyszer kell kifizetnnk, nem kell vente megjtanunk, mint a Marketplace esetn. Ezzel a feloldssal csak a telefonra tudunk alkalmazsokat telepteni, a Marketplace-re nincs jogunk azokat feltlteni! Ahhoz, hogy hasznlni tudjuk, egy Live ID-re lesz szksgnk. Fontos kiemelni, hogy ez nem n. interop unlock, azaz nem kapunk hozzfrst a telefon mlyebb rszeihez. Ezzel a feloldssal is csak maximum 10 alkalmazst telepthetnk a kszlkre (dikok 3 alkalmazst).

12-6 bra: Chevronwp7 labs Ha van Marketplace elfizetsnk, ltalban felesleges ezt a szolgltatst megrendelnnk.

304

Publikls

Publikls
Ha ksz az alkalmazsunk, itt az ideje publiklni a Marketplace-en! Ahhoz, hogy publikljuk, az alkalmazsunknak tbb funkcionlis s formai kvetelmnynek meg kell felelnie. Ezeket az albbi 4 pontban foglalhatjuk ssze: 1. Az alkalmazsnak vlaszkpesnek kell lennie. 2. Az alkalmazsnak hatkonyan kell hasznlni a telefon erforrsait. 3. Az alkalmazsunk nem befolysolhatja a telefonunk megfelel mkdst. 4. Az alkalmazsunkban nem lehet rosszindulat kd (Maleware). Ez meglehetsen ltalnos lers arrl, hogy mit nem tehet az alkalmazsunk, de a fentieken kvl elg sok felttelt kell mg teljestennk ahhoz, hogy az a piactren megtallhat legyen! A kvetkez nhny lpsben bemutatjuk a publikls folyamatt. Nzzk meg lpsrl lpsre, hogy kell egy mr elkszlt alkalmazst publiklni a piactren! Ehhez t egyszer lpst kell elvgezni. Ltogassunk el az AppHub-ra: http://create.msdn.com, s a bejelentkezs utn kattinsunk a Submit for Windows Phone gombra (12-7 bra)!

12-7 bra: AppHub oldal Submit for Windows Phone A kvetkez ablak az Upload. Itt kell feltltennk az alkalmazsunkat, s egyedi nevet is itt kell vlasztanunk a szmra! Nzzk meg rszletesen, milyen informcit kell s lehet ezen az oldalon megadnunk (12-8 bra): App name for App Hub: Az alkalmazs neve, mely csak az AppHubon fog megjelenni. Ennek a nvnek egyedinek kell lennie! Distribute to: Kt menelem kzl vlaszthatunk, az els a Public Marketplace, amivel az alkalmazsunkat mindenki szmra elrhetv tesszk, a msik lehetsg pedig a Private beta test, ami akkor lehet hasznos, ha csak meghatrozott szemlyeknek szeretnnk az alkalmazst elrhetv tenni, pldul tesztelsi clbl. Browse to Upload a file: Itt kell feltltennk az XAP fjlunkat. Application version number: Itt hatrozhatjuk meg az alkalmazsunk verzijt. Az alkalmazsok verzizsa tetszleges. (Kezdhetjk akr 5.0-val is.) Requires technical exception: Ha ezt az opcit megjelljk, akkor felmentst krnk, mivel az alkalmazsunk valamilyen specilis oknl fogva nem felel meg a Windows Phone 7

305

12. Marketplace Application Certification Requirements ltal tmasztott kvetelmnyeknek. Az alkalmazsunk elbrlsa ilyenkor egyedi, s jval hosszabb ideig tart, mint egy tlagos alkalmazs esetn.

12-8 bra: Alkalmazs feltltshez szksges informci az AppHubon Ha az oldal adatait kitltttk, kattintsunk a Next gombra! Nhny msodperc mlva betltdik a Describe oldal (12-9 bra). Itt rhatjuk le rszletesen, hogy az alkalmazsunk mire val, milyen funkcii vannak, s a hozz tartoz kpeket, ikonokat is itt adhatjuk meg. Fontos megjegyezni, hogy ha tbbnyelv az alkalmazs, akkor minden nyelvhez kln-kln lerst kell adnunk! Nzzk t, hogy milyen tulajdonsgokat lehet s kell kitltennk! Kategria: Itt vlaszthatjuk ki, hogy az alkalmazs milyen kategriba s alkategriba (Subcategory) tartozik. Ezt ktelez kitlteni. App name: Ez a mez automatikusan tltdik ki. Ezt az informcit az XAP fjlbl nyeri ki a rendszer. Short Description: Itt az alkalmazsunk rvid lerst kell megadnunk. Ez maximum 25 karakter lehet, ennek segtsgvel hvhatjuk fel legelszr az alkalmazsunkra a felhasznlk figyelmt. Ezt a mezt ktelez kitlteni. Detailed Description: A programunk rszletes lerst adhatjuk meg, ez maximum 2000 karakter lehet, s ktelez kitlteni. Keywords: Meghatrozhatunk maximum 5 kulcsszt, amivel a felhasznlk knnyebben megtallhatjk az alkalmazsunkat. Ezt a mezt ktelez kitlteni. Legal URL: Egy olyan URL cm, amely az alkalmazsunkkal kapcsolatos licencekre, illetve egyb dokumentcira mutat, kitltse opcionlis. Email address: Egy olyan e-mail cm, amivel a felhasznlk kapcsolatba lphetnek az alkalmazs fejlesztivel, pldul az alkalmazs-tmogatsi csoporttal. Ez is opcionlis, de ajnlott a kitltse.

306

Publikls

12-9 bra: A Describe fl alatt adjuk meg az alkalmazsunk lerst Az alapadatokat ezzel meg is adtuk, most mr csak az alkalmazsunkkal kapcsolatos kpeket s ikonokat kell feltltennk. Nzzk meg sorban, mit is lehet megadni (12-10 bra)! A kpek ajnlott felbontsa 96DPI. Ezek a kpek nem lehetnek transzparensek! Large mobile app Tile (173x173 Fjl): Egy png fjl, a vsrlk ezt az ikont ltjk meg elszr a piactren, amikor az alkalmazsunkat betltik. Opcionlisan vlaszthat a megadsa. Small mobile app Tile (99x99 Fjl): Ezt a kpet a felhasznlk akkor ltjk, amikor egy katalgusban vagy egy keressi listban bngsznek, ktelez megadni. Large PC app Tile (200x200 PNG fjl): Ezt az ikont ltjk a felhasznlk, ha a Zune szoftverbl bngszik a piacteret. A kp megadsa ktelez. Background art (1000x800 PNG fjl): Ez a kp akkor lthat, ha az alkalmazsunk ki van emelve a Marketplace-en (n. featured app). Ebben az esetben ez a kp jelenik meg httrkpknt. Ezt a kpet lthatjuk a Zune-bl is, ha az alkalmazsunk rszletes nzett vizsgljuk. Screenshots( 480x800 PNG fjlok): Minimum egy, maximum nyolc kpet adhatunk meg, amelyek az alkalmazsunkat mkds kzben mutatjk be. Ezeket mindenkppen rdemes megadnunk, mert a felhasznlk sokszor ezek alapjn dntenek. Fontos megjegyezni, hogy ezeket a kpeket nem szabad grafikai szoftverrel mdostani. A screenshotok ksztsrl a kvetkez alfejezetben olvashatunk.

307

12. Marketplace

12-10 bra: Itt adhatjuk meg az alkalmazsunkhoz tartoz kpeket s kpernymentseket Ha a Describe oldalon minden lnyeges informcit kitltttnk, akkor kattintsunk a Next gombra! Nhny pillanat mlva betltdik a Price ablak. Itt tudjuk belltani azt, hogy az alkalmazsunk mely piacokon legyen elrhet s hogy mennyirt. Az r meghatrozsnl vegyk figyelembe, hogy a teljes r 70%-t kapjuk meg (bizonyos orszgoknl a helyi adkat is be kell fizetnnk),teht ha egy alkalmazst mi pldul 1 USD-rt szeretnnk eladni, az nlunk 0,7 centben realizldik. Ezen az oldalon a kvetkez dolgokat llthatjuk be (12-11 bra): Enable trials to be downloaded: Meghatrozhatjuk, hogy az alkalmazsunkat trial (prba) mdban engedlyezzk-e letlteni. A fejlesztnek kell meghatroznia, hogy a trial mdban mi az, amit engedlyez, illetve mit tilt le az alkalmazs funkcionalitsbl. A Trial md hasznlatval a fejezetnk ksbbi rszben ismerkedhetnk meg. Set Price tier: Itt hatrozhatjuk meg az alkalmazsunk rt. Az r 0.99 USD s 499.99 USD kztt lehet. Termszetesen ingyenesen is feltlthetnk alkalmazsokat, ilyenkor a 0.00 rtket vlasszuk! WorldWide distribution: Kivlaszthatjuk, hogy az alkalmazsunkat az sszes olyan orszgban elrhetv tesszk-e, ahonnan a Marketplace elrhet, vagy egyesvel megadhatjuk, hogy mely orszgban vagy rgiban publikljuk az alkalmazsunkat.

308

Publikls

12-11 bra: Price oldal az alkalmazsunk rt s piacterlett hatrozhatjuk meg Ha kitltttk a megfelel adatokat, akkor kattintsunk a Next gombra! Ezt kveten a Test ablakra jutunk. Itt nhny tesztelssel kapcsolatos adatot adhatunk meg (12-12 bra): Test notes or instructions: A mez kitltse opcionlis. Akkor kell kitltennk, ha az alkalmazsunk tesztelst vgz szemllyel specilis informcit szeretnnk megosztani. Publishing options: Azt hatrozhatjuk meg, hogy mikor kerljn az alkalmazs a piactrre. None: Ezzel a bellitssal nem lehet publiklni az alkalmazst. Menthetjk a folyamatot, s ezt kveten brmikor visszatrhetnk az oldalra az alkalmazst publiklni. As soon as its certified: Ez egy automatikus folyamat, mellyel az alkalmazsunkat rgtn publikljk a Marketplace-re, amint sikeresen tment az ellenrzseken. As soon as its certified, but make itt hidden: Hasonlan az elz belltshoz, itt is azonnal a Marketplace-re kerl az alkalmazs, ha tmegy a teszteken, de csak azok a felhasznlk rhetik el, akikkel mi megosztjuk az alkalmazs elrhetsgt (ehhez szksgnk lesz egy n. deep linkre.) Ezt akkor hasznljuk, ha az alkalmazsunkat csak egy szk rteg fogja hasznlni. (pl: egy cg szmra ksztnk egyedi fejlesztst). I will publish it manually after it has beed certified: A sikeres ellenrzs utn sajt magunk kzzel kell, hogy engedlyezzk a piactrre kerlst. Ezt a funkcit my dashboard menpont alatt rhetjk el.

Ha ezzel is kszen vagyunk, kattintsunk a Submit gombra, ekkor a soron kvetkez ksznt kperny fogad. Az elfogads folyamata nhny napot ignybe vehet: ltalban 1-2 nap, de ha esetleg 4-5 nap lenne, akkor sem kell aggdnunk.

309

12. Marketplace

12-12 bra: Az alkalmazs bekldse

Screenshot kszts
Az alkalmazsunk feltltse sorn a Marketplace megkveteli, hogy legalbb egy 480x800-as kpernykp legyen az alkalmazsunkrl mellkelve. A mretnek pontosnak kell lennie, s a kpet nem szabad mdostanunk semmilyen grafikai eszkzzel! A kpernykp ksztshez persze elg sokfle eszkzt tudunk felhasznlni: pldul Snipping tool, OneNote, de a legtbbjk hasznlata legtbbszr knyelmetlen. A neten persze tallhatunk erre is j nhny eszkzt, de a Windows Phone 7.1 SDK-ja ta ez a funkci mr az emultor mellett is megtallhat (12-13 bra).

12-13 bra: Screnshot ksztse Nzzk meg hasznlat kzben! Indtsuk el az alkalmazst, majd a nagytsi belltsokat (nagyt ikon) lltsuk 100%-ra, s kapcsoljuk ki a Frame rate szmllkat is! Ha ez megtrtnt, akkor indtsuk el az

310

Publikls alkalmazst, s navigljunk arra az oldalra, amirl a screenshotokat szeretnnk elkszteni, majd az emultor jobb fels sarkban tallhat menben vlasszuk ki az Additional Tool ablakot (12-14 bra)!

12-14 bra: Additional Tool A megjelen ablakban vlasszuk ki a Screenshot flet, s ezen kattintsunk a Capture gombra! Ezt kveten mr csak el kell mentennk ezt a kpet a Save gomb segtsgvel.

Windows Phone Marketplace Test Kit


A Windows Phone 7.1 SDK val rkezett egy hasznos eszkz (Marketplace Test Kit) is, amivel megvizsglhatjuk, hogy az alkalmazsunk megfelel-e a Marketplace kvetelmnyeinek. Mit is rul el ez az eszkz alkalmazsunkrl? Megfelelek-e a kpek s a kpernykpek a kvetelmnyeknek? Megfelel-e az XAP fjl mrte (maximum: 225 MB)? Elg gyorsan indul-e az alkalmazsunk? Nem hasznl-e tl sok memrit? Rendeltetsszeren mkdik-e a Back gomb? Nem hasznl-e olyan API-t, ami nem engedlyezett a szmunkra? Hasznl-e olyan API-t, ami nem engedlyezett egy Backround Agenttel? Nincs-e vratlan hiba, ha bezrjuk az alkalmazst? Stb. Application Details Automated Tests Monitored Tests Manual Test

A Test Kit felhasznli felletn ngy fl tallhat, ahol klnbz teszteket futtathatunk le:

Nzzk meg, mire alkalmasak ezek a tesztek! Application Details Az Application Details fln (12-15 bra) adhatjuk meg az ellenrzs sorn hasznlt, az alkalmazsunkhoz tartoz kpeket, ikonokat s kpernykpeket. Az Applicaton package mezbe az XAP fjl tvonala tallhat, az alapbellts szerint a Bin\Release mappban tallhat XAP-ra mutat. A tesztek lefuttatshoz egy Release konfigurcival trtn fordtsra is szksgnk van. Ezenkvl ezen a fln adhatjuk meg az alkalmazsok piactrre feltltend kpeit s kpernykpeit. Ha nem adjuk meg ezeket a kpeket, akkor a tesztnk sikertelen lesz.

311

12. Marketplace

12-15 bra: Application Details (Marketplace Test Kit) Automated Tests Az Automated Tests fln (12-16 bra) az ltalnos kritriumokat tudjuk tesztelni, pldul az alkalmazs mrett s kpeit. Ha lefuttatjuk a tesztet, akkor a teszt megmondja, hogy az alkalmazsunk szmra milyen Capability belltsokat (kpessgeket) kell meghatroznunk a WPAppManifest.xml fjlban. Az Application Details alatt megadott kpeket is itt teszteljk.

12-16 bra: Automated Tests (Marketplace Test Kit) Monitored Tests Ezen a fln (12-17 bra) mrhetjk meg az alkalmazsunk teljestmnyt s vlaszkpessgt. A teszt sorn az alkalmazst egy fizikai kszlken kell kiprblnunk, teht csak a fejleszti zrols feloldsval elltott kszlken tudjuk ezt megtenni. A teszt kzben a program ltal felknlt lehet legtbb felhasznli esetet hajtsuk vgre az alkalmazson!

312

Publikls

12-17 bra: Monitored Tests (Marketplace Test Kit) Manual Test A tesztnek van egy manulis rsze is, itt minden egyes tesztet vgre kell hajtanunk. A Test Descriptionban lert feltteleknek teljeslnik kell. Ha ezek teljesltek, akkor egyszeren a Result oszlop rtkt lltsuk t Passedra, ha nem teljesltek, akkor Failedre (12-18 bra)!

12-18: Manual Tests (Marketplace Test Kit) Ha ezeket a teszteket minden publikls eltt elvgezzk, akkor nagy valsznsggel semmilyen problma nem lesz a piactr publiklsi folyamata sorn sem. Clszer minden ksz alkalmazsnl lefuttatni ezeket a teszteket! Idt sprolhatunk vele, hisz kellemetlen, ha pldul egy transzparens kp miatt visszadobjk az alkalmazst.

Ikonok
Egy Windows Phone 7 es solution gy pl fel, hogy hrom specilis kpfjl tallhat benne: az ApplicationIcon.png, egy 62x62 pixeles kp, amely az alkalmazs ikonja, s az alkalmazsok listjban fog ltszdni; a Background.png egy nagyobb, 173x173 pixeles kp, amely a f kperny csempi kztt jelenik meg, ha az alkalmazst a felhasznl kirakja a fkpernyre; ezenkvl van mg egy SplashScreenImage.jpg, amely egy 480x800 pixeles kp, amit az alkalmazsunk indulsakor, illetve visszalpskor lthat a felhasznl.

Abban az esetben, ha az alkalmazsunk nagyon gyorsan be tud tltdni, felesleges a SplashScreenImage. Ezt azrt hasznljuk, hogy ha lassan tltdik be valamirt az alkalmazs, akkor a felhasznl ne nyomja meg rgtn a Back gombot. Clszer ezeket a kpeket mindig testreszabni. Figyeljnk oda, hogy minden kp Build Action tulajdonsga Content rtk legyen! Ha sajt kpet adunk

313

12. Marketplace az alkalmazshoz, akkor annak szintn a Content rtket kell felvennie! Persze nem muszj ezeket a neveket hasznlnunk, a belltsokat a WMAppManifest.xml fjlban testreszabhatjuk. File Mret (Pixel) Fjl tpus PNG Project File Plda

Small app icon 62 x 62 ApplicationIcon.png

Large app tile Background.png

173x173

PNG

<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2009/deployment" AppPlatformVersion="7.1"> <App xmlns="" ProductID="{1b0f2313-d341-4b64-b7b7-88caa0ed57b1}" Title="MarketPlace Sample" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal" Author="Turczy Attila" Description="Sample description" Publisher="Livesoft"> <IconPath IsRelative="true" IsResource="false">ApplicationIcon.png</IconPath> <Capabilities> <Capability Name="ID_CAP_CONTACTS"/> <Capability Name="ID_CAP_APPOINTMENTS"/> </Capabilities> <Tasks> <DefaultTask Name ="_default" NavigationPage="MainPage.xaml"/> </Tasks> <Tokens> <PrimaryToken TokenID="MarketPlaceSampleToken" TaskName="_default"> <TemplateType5> <BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImageURI> <Count>0</Count> <Title>MarketPlace Sample</Title> </TemplateType5> </PrimaryToken> </Tokens> </App> </Deployment>

Ha jl megnzzk ezt a fjlt, akkor lthatjuk, hogy itt az alkalmazsunkkal kapcsolatban specilis tulajdonsgokat adhatunk meg. Lerhatjuk, hogy mi legyen az alkalmazs cme (Title), milyen legyen a httere (Background) vagy ppen az ApplicationIcon neve s elrhetsge, st azt is, hogy melyik lapot tltse be az alkalmazs indulsakor.

Marketplace Task
Az elz fejezetekben mr foglalkoztunk a launcherekkel, de mg nem nztk meg kzelebbrl a piactrre jellemzeket. Ebben a rszben ttekinthetjk, melyek ezek, s hogyan is hasznlhatjuk fel azokat. Az alkalmazsunkbl elindthatjuk a Marketplace alkalmazst. Ehhez ngy taszk ll a rendelkezsnkre:
MarketplaceHubTask MarketplaceDetailTask

314

Marketplace Task
MarketplaceReviewTask MarketplaceSearchTask

Alapveten kt klnbz helyen tudunk keresni: az alkalmazsok s a zenk kztt ezt a ContentType tulajdonsgnl tudjuk megadni. Kezdjk a legegyszerbb taszkkal, a MarketplaceHubTaskkal (12-19 bra)! Ezzel egyszeren megnyithatjuk a Marketplace alkalmazst (Marketplace Hubot), a Content Type rtkvel pedig meghatrozhatjuk, hogy melyik tpust szeretnnk megjelenteni:
MarketplaceHubTask hubTask = new MarketplaceHubTask(); hubTask.ContentType = MarketplaceContentType.Applications; hubTask.Show();

12-19 bra: Marketplace Hub Ha viszont egy meghatrozott alkalmazs Marketplace oldalt szeretnnk betlteni, azt a MarkerplaceDetailTaskkal tehetjk meg (12-20 bra). Itt meg kell adnunk a hivatkozni kvnt alkalmazs egyedi azonostjt, s amikor betltdik, akkor a kivlasztott program rszletes nzete tltdik be, ahol lthatjuk az alkalmazs logjt, lerst, kpernykpeit, s kzvetlenl errl az oldalrl le is tltheti a felhasznl az alkalmazst. Ezzel a launcherrel pldul megtehetjk azt, hogy az ingyenes prba vltozatban folyamatosan reklmozzuk az ltalunk rt alkalmazsokat.
MarketplaceDetailTask detailTask = new MarketplaceDetailTask(); detailTask.ContentType = MarketplaceContentType.Applications; detailTask.ContentIdentifier = "078656ae-9f35-45bb-84b8-2f9270bbdd67"; detailTask.Show();

315

12. Marketplace

12-20 bra: Marketplace Details Task Nagyon fontos, hogy minl tbb felhasznl rtkelje az alkalmazsunkat (elnye: elrbb kerl a Top listban)! Ezt elsegthetjk a MarketplaceReviewTask hasznlatval. Ennek a taszknak nincs specilis paramtere, nem tehetjk meg pldul, hogy elre meghatrozott rtkelst adjunk meg, egyszeren csak megnyithatjuk az adott alkalmazs Review oldalt. Ezt a funkcit nem tudjuk kiprblni az emultorban, csak akkor tudjuk hasznlni, ha az alkalmazsunk publiklva van, s fizikai kszlkrl indtjuk el az albbi kdot:
MarketplaceReviewTask reviewTask = new MarketplaceReviewTask(); reviewTask.Show();

Az utols Marketplace-hez ktd taszk a MarketplaceSearchTask, ami lehetsget biztost arra, hogy megnyissuk a Marketplace keres ablakt, s abban alkalmazsokat, zenket vagy podcastokat keressnk. Akr a sajt magunk ltal ksztett alkalmazsokra is rkereshetnk.
MarketplaceSearchTask searchTask = new MarketplaceSearchTask(); searchTask.ContentType = MarketplaceContentType.Applications; searchTask.SearchTerms = "Auto"; searchTask.Show();

Trial Mode
Amikor alkalmazsunkat a piactrre publikljuk, meghatrozhatjuk azt, hogy annak van-e prba (trial) zemmdja. Ha van, s ezt bekapcsoljuk, akkor a feltlttt alkalmazsunkat szabadon letlthetik a felhasznlk anlkl, hogy megvennk azt. Annyiban klnbzik ez a verzi a teljestl, hogy az alkalmazslicenc IsTrial rtke true lesz, s a mi dolgunk, hogy milyen mdon korltozzuk az alkalmazs funkciit, vagy figyelmeztetjk a felhasznlt a vsrlsra. Pldul megtehetjk azt, hogy figyeljk, az IsTrial rtket, s ha az igaz, akkor maximum hromszor indthatja el a felhasznl az alkalmazst, utna lelltjuk; vagy idhz kthetjk. Reklmokat s figyelemfelkelt zeneteket is elhelyezhetnk az alkalmazsban, jelezve a felhasznlnak, hogy clszer lenne megvsrolnia azt. A korltozsok kialaktsa s kreatv megoldsa a mi feladatunk, a Marketplace csak annyiban nyjt segtsget, hogy az IsTrial rtket megfelelen belltja. Abban az esetben, ha megveszi a felhasznl az alkalmazst, az IsTrial rtke false lesz.
var license = new Microsoft.Phone.Marketplace.LicenseInformation(); var isInTrialMode = license.IsTrial();

A trial md szimullsa fejlesztsi idben viszonylag problms, ugyanis az IsTrial metdus eredetileg false rtkkel tr vissza, ezrt fejlesztsi idben ezt szimullnunk kell. Ennek kezelsre a DEBUG 316

sszefoglals szimblumot tudjuk felhasznlni: ha Realease mdban fordtjuk le az alkalmazst, akkor ez a szimblum eltnik:
public class ApplicationLicense { public bool IsInTrialMode { get { #if !DEBUG var license = new Microsoft.Phone.Marketplace.LicenseInformation(); return license.IsTrial(); #else return true; #endif } } }

Itt megvizsgljuk, hogy az alkalmazs nem DEBUG mdban indul-e. Ha nem, akkor az IsTrial metdustl krdezzk le, hogy milyen mdban fut az alkalmazs. Ebben az esetben az false rtkkel tr vissza. Ha DEBUG mdban indtjuk az alkalmazst, akkor mindig true rtket fogja visszaadni az IsInTrialMode tulajdonsg.

12-21 bra: Release s Debug md kztti vlts A feltteleket persze szabadon mdosthatjuk, a neknk tetsz mdon. Ahhoz, hogy mdostsuk a fordtsi mdot, a Visual Studio Toolbar-jn kell belltanunk, hogy milyen mdon szeretnnk fordtani (12-21 bra).

sszefoglals
Ebben a fejezetben megismerkedtnk a Marketplace-szel, a Windows Phone egyik kzponti szerepljvel. Megnztk azt, hogyan tudjuk a kszlknk fejleszti zrolst feloldani, hogyan tudunk publiklni a Marketplace-re, s milyen feltteleket kell alkalmazsunknak teljestenie ehhez. Azt is megvizsgltuk, hogy milyen Marketplace taszkok llnak a rendelkezsnkre, s hogy hogyan kell prbamd alkalmazst kszteni.

317

13. Teljestmny
Egy asztali vagy akr laptop szmtgphez hasonltva a telefon igencsak gyenge teljestmnnyel br. A telefon akkumultora egy asztali gpet csak pr percig tudna elltni rammal. A CPU egymagos, s hiba fut 1GHz-en, szmtsi teljestmnyben kb. egy 600 MHZ-en fut Pentium III-al llthat prba (1999-bl). Egy ktves Intel Core 2 processzor kb. 30-szor mlja ezt fell. Ami a GPU-t illeti, a Snapdragon processzor krlbell azt a teljestmnyt nyjtja, mint egy, szintn az elmlt vezred vgrl szrmaz grafikus krtya. De ht mihez kezdtnk ezzel az elkpeszt szmtsi ervel? Nos, leginkbb a felhasznli lmny javtsra fordtottuk! Ahogy a szmtgpek egyre gyorsabbak lettek, egyre jobban tudnak minket szolglni rvidebb vrakozsi idvel, tbb segtsggel a munkhoz, gazdagabb grafikval, nagyobb felbontssal, st, mr zleti alkalmazsoknl is megjelen animcikkal. A felhasznlk mra elvrnak egy bizonyos szint felhasznli lmnyt ami 2000-ben mg j volt, 2010-re mr nem elfogadhat. Az rintkpernyk megjelensvel az elvrsok tovbb nttek. Az rintkperny kzvetlen modellel vltja fel az egr kzvetett interakcis modelljt most mr a sajt ujjunkkal rintjk meg s mozgatjuk a kpernyn megjelen dolgokat! Ez nagyszer, de emiatt a dolgoknak a val vilgbeli trgyakhoz hasonlan kell reaglniuk. s a val vilgban a fizikai trgyak nem 5-10 fps-el (frame per second kpkocka per msodperc) mozognak, s ha odbb lkjk ket, nem vrnak mg pr tized msodpercet mieltt elkezdennek mozogni. Az asztali gpen valsznleg szre se vennnk 300ms ksleltetst a kattints s a szoftver reakcija kztt, de egy rintkpernyn ez mr igen zavar lehet. A fejleszti lmny is rengeteget vltozott fleg a Microsoft vilgban. Immr a .NET keretrendszer negyedik genercijt hasznljuk, s a mobil platformoktl is az asztali vagy webfejlesztskor megszokott produktivitst (termelkenysget) vrjuk el. A teljestmny nvelse lehetv teszi, hogy fejlettebb, magasabb szint eszkzket hasznljunk a fejleszts sorn legtbbszr mr nem trdnk bitekkel, bjtokkal s memriakezelssel az adatbzisokat s sokszor mg a vezrlsi folyamatot is grafikus eszkzkkel hozzuk ltre. A kliens-szerver kommunikci immr a keretrendszer rsze, nem kell minden egyes projektnl jra feltallnunk a kereket. Mi, a fejlesztk ugyanannyira nem kvnunk tz vet visszalpni az idben, mint ahogy a felhasznlk sem. Kisebb csoda, hogy a zsebnkben hordozhatjuk azt, ami tz ve csak az asztalon frt el. De ha belegondolunk abba, hogy a mai felhasznlk megnvekedett ignyeit kell fejlesztknt kielgtennk, a telefon ereje igencsak kevsnek tnik. Ez a mobil fejleszts egyik legnagyobb kihvsa. Lssuk, hogy a Windows Phone 7 platform Silverlight implementcija hogyan segt szembeszllni ezzel a kihvssal!

A tipikus teljestmny-problmkrl
Mg az tlagember sokszor csak annyit tud mondani, hogy lass, a fejlesztknek ennl pontosabban kell ismerni a tneteket ahhoz, hogy a problmkat kezelni tudja. Nzzk teht, milyen jelensgek tartoznak a teljestmny-gondok tmakrbe: Akadoz animcik: Mindenkinek ms az ingerkszbe, hogy mikortl zavarja egy animci darabossga, akadozsa. Abban viszont biztosak lehetnk, hogy a Windows Phone felhasznlk elvrsai igen magasak az egyik legfeltnbb s legtbbet emlegetett pozitvum a platformmal kapcsolatban, hogy milyen finom (silky smooth) animcikkal knyeztet el minket. Lass betltds: Az alkalmazs indtsa utn senki nem szereti, ha sokat kell vrni addig, amg az tnylegesen hasznlhat nem lesz. St, ha a betltds 5 msodpercnl tovbb tart s nincs n. splash screen az alkalmazsban, az OS meg is li azt. (Splash screen-nel 20 msodpercnk van az els kperny megjelensig).

319

13. Teljestmny Hossz vlaszid (reszponzivits): Ha megnyomtunk egy gombot a programban, mennyi id alatt jn meg a vlasz? Ha nincs semmi visszajelzs, mg az is lehet, hogy jra meg jra megnyomjuk a gombot, azt gondolva, hogy nem rzkelte a telefon az rintst! Grgets kzben res terletek jelennek meg (blanking): Egy hossz listt gyorsan vgigprgetve res terleteket ltunk a kirajzols nem tud lpst tartani a grgetssel. Elfogy a memria: Sokszor a felhasznl csak az alkalmazs lefagyst vagy hirtelen kilpst tapasztalja. Fejlesztknt legksbb a Marketplace ellenrzs sorn tallkozunk ezzel a jelensggel, mert a Microsoft nemes egyszersggel visszadobja a tl sok memrit hasznl alkalmazsokat

A CPU s a GPU feladata


A CPU ltalnos feladatokra alkalmas processzor kpes matematikai mveletek elvgzsre, utastsok s azokbl sztt algoritmusok vgrehajtsra. Az ltalunk rt program a CPU-n fut. A CPU (processzor) egy remek kis jszg, de van pr dolog, amire nem idelis. Ilyenek pldul a grafikai mveletek, vagy a vide dekdols. Ezrt a telefonokban egy GPU (grafikus processzor) is tallhat. A GPU hasonlan mkdik, mint a nagytestvrei az asztali gpeken hromszgeket kpes a trben elhelyezni s megjelenteni, tbb milli darabot msodpercenknt. Szerencsre Windows Phone fejlesztknt neknk nem kell a GPU-val ilyen alacsony szinten foglalkozni st, a legtbbszr szre sem vesszk, hogy a Silverlight motor a GPU-t dolgoztatja. Azonban a teljestmny-problmk orvoslshoz mr j, ha tudunk pr dolgot a GPU-rl. A GPU segt levenni a CPU vllrl a terhet az albbi mveletek esetn: Kompozci kt vagy tbb, egyms fed vagy flig tltsz textra (bittrkp) egymsra helyezse. A mozgats is ennek segtsgvel trtnik (a pozci vltoztatsa utn a kvetkez kpkockban (frame-ben) jra egymsra helyezdnek a textrk. Forgats egy bittrkp elforgatsa tmretezs nagyts vagy kicsinyts. A GPU kpes tmretezskor az leket elmosni, gy elkerlhet a pixeleseds. Perspektivikus torzts a textra elforgatsa 3D-ben. Ez nem igazi 3D, inkbb 2.5D, mivel nem testekrl csak lapos textrkrl beszlnk - de megfelel hasznlatval mgiscsak megteremthet a 3D illzija, mint ahogy a SurfCube 3D Browserben is trtnt (lsd 13-14. bra). (Komolyabb 3D alkalmazst inkbb XNA-val ksztsnk). Ngyszgletes vgs a textrkbl a GPU is kpes vgst kszteni (clip), amennyiben a vg geometria tglalap alak. Vide dekdols a Windows Phone-on a vide dekdolst s tmretezst dediklt hardver vgzi ez j hr, mert a CPU nmagban nem lenne elg ers nagyfelbonts videk lejtszsra. gy viszont marad ideje egyb feladatokra (pl. seek bar megjelentsre, feliratok elhelyezsre, stb).

Figyelmes olvasknak feltnhetett, hogy a GPU textrkat, bittrkpeket manipull. De hogy lesz egy vezrlbl (pl. egy gomb) textra? Ezt a folyamatot renderelsnek vagy raszterizlsnak hvjk, s a CPU vgzi. A CPU feladata mg a XAML rtelmezse, a vezrlk ltrehozsa, a layout (elrendezs) szmtsa, s termszetesen a programunk futtatsa is.

Csillagok, csillagok
Illusztrciknt ksztsnk egy egyszer programot ezen fogjuk megvizsglni a fenti teljestmnyproblmkat, s a javtsuk mdjt. A program az els lpsben egy csillagmezt jelent meg. Visual Studio-ban hozzunk ltre egy j C# nyelv Windows Phone alkalmazst CpuAndGpu nven, s a MainPage.xaml.cs -be rjuk be az albbiakat:

320

Csillagok, csillagok

using using using using using using

System; System.Diagnostics; System.Windows; System.Windows.Media; System.Windows.Shapes; Microsoft.Phone.Controls;

namespace CpuAndGpu { public partial class MainPage : PhoneApplicationPage { private Stopwatch stopwatch; // Constructor public MainPage() { stopwatch = new Stopwatch(); stopwatch.Start(); InitializeComponent(); CreateStarField(100); Loaded += OnLoaded; } private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) { MessageBox.Show("Startup time: " + stopwatch.ElapsedMilliseconds + " ms"); } public void CreateStarField(int numOfStars) { Random x = new Random(); for (int i = 0; i < numOfStars; i++) { Ellipse ellipse = new Ellipse(); double size = x.NextDouble()*3; ellipse.Width = size; ellipse.Height = ellipse.Width; ellipse.Fill = new SolidColorBrush(Colors.White); ellipse.Margin = new Thickness(x.Next(456), x.Next(607), 0, 0); ellipse.HorizontalAlignment = HorizontalAlignment.Left; ellipse.VerticalAlignment = VerticalAlignment.Top; ContentPanel.Children.Add(ellipse); } } } }

A Solution Explorer-ben trljk ki a SplashScreen.jpg fjlt. A program mkdse igen egyszer. A MainPage osztly ltrehozsa utn elindtunk egy stoppert, ami az induls ta eltelt ezredmsodperceket mri. A Loaded esemnykezeljben (ami a MainPage megjelense utn kerl meghvsra) egy MessageBox-ban kirjuk az indulshoz szksges idt. A stopper elindtsa utn az InitializeComponent fggvny a XAML-ben lertakat rtelmezi, majd az ltalunk rt CreateStarField metdus a paramterknt kapott numOfStarts szm vletlen elhelyezkeds s mret csillagot jelent meg a kpernyn. Ha elindtjuk a programot az emultorban, a 13-1 brn lthat eredmnyt kapjuk.

321

13. Teljestmny

13-1 bra: 100 csillag, 388 ms A programnak azonban a telefonon kell futnia, indtsuk el ott is! Egy els genercis LG Optimus 7 telefonon 558 ms alatt indul el az alkalmazs. De mi trtnik, ha nem csak 100, hanem akr tbb ezer csillagot szeretnnk megjelenteni? A mrsek eredmnye jl ltszik a 13-2. bra grafikonjn:

13-2 bra: csillagok kirajzolsi ideje emultoron s telefonon

322

Lass betltds kezelse A 20000 csillagos rtket telefonon mr meg sem tudtuk mrni, mivel az alkalmazs nem indult el 20 msodpercen bell, s gy az opercis rendszer meglte azt. Tapasztalt fejlesztk szmra feltnhet, hogy a csillagok kirajzolsakor van lehetsg mg a gyorstsra. Az ellipszis magassgt ugyanarra az rtkre lltjuk, mint a szlessgt (ami egy vletlen rtk) - de ezt a ellipse.Height = ellipse.Width; sorral rjk el. Ha ezt a sort lecserljk arra, hogy ellipse.Height = size, akkor a telefonon 5000 csillag mr 4202 ms alatt megjelenik (szemben az eredetileg mrt 4300al). Ennek az oka, hogy nem minden egyes csillagnl egy jabb Dependency Property get-et vgrehajtani. Taln nem tnik soknak ez a csillagonknti 0,2 ms, de egy sok ezerszer vgrehajtott ciklus kzepn mg az ilyen aprsgok is szmthatnak. A fenti ksrletbl kt fontos tanulsgot vonhatunk le. Az emultor performancia-karakterisztikja teljesen ms, mint a telefon. Ne vonjunk le kvetkeztetseket az alkalmazs teljestmnyre vonatkozan abbl, hogy hogyan viselkedik az emultorban! Br az emultor rendkvl pontos, s ugyanazt az OS-t futtatja, mint maga a telefon, ezt mgiscsak egy asztali gp processzorn s videokrtyjn teszi. Minden esetben ellenrizzk az alkalmazs futst egy fizikai eszkzn is, s a teljestmnyt arra hangoljuk be! A hagyomnyos .NET optimalizl technolgik s a jzan sz a Windows Phone fejleszts sorn is segtenek.

Lass betltds kezelse


A fenti csillagos alkalmazsnl egyrtelmen problma, hogy lassan tltdik be a telefonon. Nzzk, hogy lehet ezen javtani!

Az elrendezs (layout) kltsgeinek cskkentse


Figyelmesebben megnzve a MainPage.xaml - t, lthatjuk, hogy a csillagokat tartalmaz elem egy Grid. A Grid igen rugalmas, a rendelkezsre ll terlet vltozsait jl kezel, s sok mindenre jl hasznlhat kontner ugyanakkor ez a komplexits nyilvn nincs ingyen. Cserljk ht ki a Grid-et egy jval egyszerbb trsra, egy Canvas-ra:
<!--<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>--> <Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Canvas>

Mdostsuk a kdot is, hogy margk helyett a Canvas.Top s Canvas.Left tulajdonsg lltsval kerljenek a csillagok elhelyezsre:
public void CreateStarField(int numOfStars) { Random x = new Random(numOfStars); for (int i = 0; i < numOfStars; i++) { Ellipse ellipse = new Ellipse(); double size = x.NextDouble()*3; ellipse.Width = size; ellipse.Height = size; ellipse.Fill = new SolidColorBrush(Colors.White); ellipse.SetValue(Canvas.LeftProperty, (double)x.Next(456)); ellipse.SetValue(Canvas.TopProperty, (double)x.Next(607)); // ellipse.Margin = new Thickness(x.Next(456), x.Next(607), 0, 0); // ellipse.HorizontalAlignment = HorizontalAlignment.Left; // ellipse.VerticalAlignment = VerticalAlignment.Top; ContentPanel.Children.Add(ellipse); } }

323

13. Teljestmny 5000 csillaggal futtatva az alkalmazst, a Grid-es 4100 ms helyett 3093 ms-ot mrtnk! ltalban teht elmondhatjuk, hogy csak akkor hasznljunk bonyolult layout rendszereket, ha arra valban szksg van. Minden tmretezs, a gyerekek szmnak megvltozsa a vizulis fa teljes vagy rszleges jramretezst vonja maga utn - s minl kevesebb dolgot kell ehhez a CPU-nak vgeznie, annl gyorsabb lesz az alkalmazsunk.

Splash Screen
A Splash Screen a program indtst kveten megjelen egsz kpernys bra. A Splash Screen nem gyorst a beltdsen ugyanakkor, ha az indulst nem tudjuk 1-2 msodperc al szortani, a felhasznlnak sokkal jobb rzs egy zlses rajzot bmulnia, mint az res kijelzt. Figyelem, a WP7 alkalmazssablonban tallhat SplashScreen.jpg nem tartozik az zlses kategriba! A Marketplace elrsok meg is kvetelik a Splash Screen hasznlatt, ha az alkalmazs indulsa 5 msodpercnl tbb idt vesz ignybe. A Splash Screen addig ltszdik, amg az els kperny meg nem jelenik. A Splash Screen msik elnye, hogy a felhasznl amg nem vesz a kezbe stopperrt gyorsabbnak is fogja rezni a betltdst, mivel valami trtnik a kijelzn. Ezt az rzst szubjektv teljestmnynek hvjuk, s a felhasznli lmnyt jelentsen lehet javtani hozzrt mdon alkalmazott trkkkkel (lsd ksbb). Splash Screent igen knny az alkalmazsba pteni helyezznk el egy SplashScreenImage.jpg fjlt a WP7 projekt gykrknyvtrban s lltsuk a Build Action tulajdonsgot a Content rtkre!

Inicializcis teendk elhalasztsa


A fenti pldaprogramban a betltst jelentsen lasstja a csillagok kirajzolsa. Mi lenne, ha a betltds utn rajzolnnk csak ki a csillagokat? Mozgassuk t a CreateStarField metdust a konstruktorbl az OnLoaded esemnykezelbe:
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) { CreateStarField(5000); MessageBox.Show("Startup time: " + stopwatch.ElapsedMilliseconds + " ms"); }

Ha gy elindtjuk az alkalmazst a telefonon, kt dolgot vehetnk szre. Az egyik, hogy a stopperes zenet megjelensekor mg nem ltszanak a csillagok, viszont az zenet 3093 helyett mr csak 2876 ms-ot mutat. Ennek az oka az, hogy a tnyleges rajzols ekkor mg nem trtnt meg, a csillagok csak a MessageBox lezrsa utn jelennek meg. A msik jelensg az, hogy az alkalmazs szinte azonnal elindul, a fejlc-szveg villmgyorsan megjelenik. Ez azonban ne tvesszen meg senkit az alkalmazs a csillagok rajzolsa sorn nem reaglna az inputra, mivel a UI szl a csillagokkal van elfoglalva. Ezt knnyen ellenrizhetjk, ha a MainPage.xaml.cs-ben elhelyeznk egy gombot:
<Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Button Canvas.ZIndex="1">I am not doing anything...</Button> </Canvas>

A gomb megnyomsra a gomb inverzbe vlt. Azonban ez a raszterizls az UI szlon trtnik, ami el van foglalva a csillagok rajzolsval, gy csak a csillagok kirajzolsa utn fog a gomb az rintsre reaglni.

Httrszlak alkalmazsa
Tegyk ht t a csillagokat egy httrszlra! Ehhez az OnLoaded esemnykezelbe kell belenylni, illetve egy j, BGCreateStars metdust ltrehozni:

324

Lass betltds kezelse

private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) { Thread t = new Thread(BGCreateStars); t.Name = "Stars"; t.Start(); // // } CreateStarField(5000); MessageBox.Show("Startup time: " + stopwatch.ElapsedMilliseconds + " ms");

private void BGCreateStars() { for (int i = 0; i < 500; i++) { UIDispatcher.BeginInvoke(() => CreateStarField(10)); Thread.Sleep(30); } }

A BGCreateStars 500-szor lefuttatja a CreateStarField metdust 10 csillaggal, s minden futs utn pihen 30 ms-ot. A CreateStarField azonban az UI szlon kell, hogy fusson, mert az UI-t manipullja. Ezrt az UIDispatcher.BeginInvoke hvson keresztl kell elrni a CreateStarField metdust. A fentiek alapjn mdostott alkalmazsbl kivettk a MessageBox hvst is, mert az mg a csillagok kirajzolsa eltt megjelenne, gy nincs rtelme. A programot futtatva mr igen kellemes felhasznli lmnyben van rsznk: az indulsi id minimlis, a program azonnal reagl a gombnyomsra. A csillagok pedig szpen lassan jelennek meg, szinte olyan, mintha az alkalmazs egyesvel rajzolgatn ket.

Elre elvgzett munka


Ez mind szp, de mi van, ha neknk a teljes csillagmezre van szksgnk, a betltds utn azonnal? Ebben az esetben is van megolds egyszeren ksztsnk egy screenshotot a kvnt csillagmezrl, s tegyk be a ContentPanel httrkpnek (13-3. bra). Ehhez a projektben el kell helyezni a fjlt (pl. starsBG.png nven), s a tulajdonsgait belltani: a Build Action legyen Content, a Copy to Output Directory pedig Copy if newer. A MainPage.xaml.cs tartalmt teljes egszben visszallthatjuk az eredetire (a konstruktorban egy InitializeComponent hvs marad csak).

13-3 bra: A starsBG.png A MainPage.xaml - ben pedig a ContentPanelt a kvetkezre cserljk: 325

13. Teljestmny

<Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Canvas.Background> <ImageBrush Stretch="None" ImageSource="/starsBG.png"/> </Canvas.Background> <Button Canvas.ZIndex="1">I am not doing anything...</Button> </Canvas>

Tdm! Az alkalmazs fl msodpercen bell elindul mg 5000 csillaggal is! Ha mgis szksgnk lenne a vletlenszer csillagmezre, egyszeren ksztsnk 10 klnbz kpet, s azok egyikt lltsuk be kdbl httrnek.

Kis sszefoglals
A fenti alapelvek persze valdi alkalmazsoknl is hasznlhatk. Az inicilis teendk elhalasztsra j plda a SurfCube 3D Browser alkalmazs 4.0 vltozata. Mivel az app indulsa tllpte az 5-6 msodpercet, egyre tbb felhasznl panaszkodott. Volt, aki egyenesen azt gondolta, hogy a Splash Screen az bosszantsukra van ott, s csak azrt tettk oda, mert tetszett neknk a log. Ezt mind el is fogadta volna, de az mr felhbortotta, hogy az alkalmazs megvsrlsa utn is tl sokig volt lthat a Splash Screen! A SurfCube 4.0-ban ezrt a kocka oldalait mr eleve Collapsed llapotban tltjk be. Az els forgatskor vltunk t innen Visible-re. Ez kicsit knyelmetlen taln (br nmi loading felirattal s animcikkal ellenslyoztuk a dolgot), de lehetv tette, hogy az induls 3.5 msodpercre rvidljn. A msik dolog, ami sokat segthet, ha a ritkn hasznlt funkcikat kln assembly-be tesszk. Ekkor, amg az assembly-re nem trtnik hivatkozs a kdban, azt nem tlti be az opercis rendszer. Az elre elvgzett munkra pedig j plda a Nvnap alkalmazsom. Itt egy SQL CE adatbzis tartalmazza a nvnapokat. Ez az adatbzis egy szveges fjl alapjn, az els futtats sorn jn ltre a lapkk s az alkalmazs ksbbi futsa mr az SQL CE-t hasznljk. Mg jobb megolds ilyen esetben, ha a (csak olvassra sznt) SQL adatbzist mr a fejleszts sorn a XAP fjlba helyezzk, gy a legels futs is gyors lehet.

Akadoz animcik okai, megoldsa


Windows Phone Silverlightban tbbfle mdon lehet animcit ltrehozni. Kezdjk a legritkbban hasznlatos, de a teljestmny szempontjbl a legkritikusabb megoldssal az n. procedurlis animcival! Az animcival azt akarjuk szimullni, hogy mit lt egy rszeg, sokszem rhajs, akivel szembe jn a csillagos rben egy TIE figther. Ehhez elszr is elksztettem egy TIEFighter.xaml user controlt. Ennek kdjt felesleges lenne ide bemsolnom elrhet a knyvhz tartoz letlthet anyagok kztt (13-4 bra).

13-4 bra: a TIEFighter.xaml Expression Blend-ben

326

Akadoz animcik okai, megoldsa A procedurlis animci lnyege, hogy minden kpkockban (frame) jraszmoljuk az objektumok helyzett. A teljes kd a fejezethez mellkelt kdban elrhet, itt csak a lnyeget emelnm ki. Ahhoz, hogy a ProceduralAnim plda induljon el, a Properties/WMAppManifest.xml fjlban a DefaultTask NavigationPage rtkt mdostani kell:
<DefaultTask Name ="_default" NavigationPage="ProceduralAnim.xaml"/>

Maga az animci a ProceduralAnim.xaml.cs fjlban, a CompositionTargetOnRendering esemnykezelben trtnik. Ez a CompositionTarget osztly Rendering esemnye, amely minden alkalommal lefut, amikor az UI szl egy j kpkocka rajzolsra kszl. Az esemnykezel a kvetkezkppen nz ki:
private int frameCount = 0; private void CompositionTargetOnRendering(object sender, EventArgs eventArgs) { if (frameCount >= 100) frameCount = 0; for (int i = 0; i < Ties.Count; i++) { var tieFighter = Ties[i]; CompositeTransform tr = (CompositeTransform) tieFighter.RenderTransform; tieFighter.Opacity = frameCount/100.0; double scale = 1 + frameCount/100.0; tr.ScaleX = scale; tr.ScaleY = scale; tr.Rotation = frameCount / (i+1.0); } frameCount++; }

A Ties egy TIEFighter objektumokat tartalmaz lista. A fenti fggvny nem csinl mst, mint vgigmegy az sszes TIE Fighter-en, s mindegyiknek tlltja az tltszsgt, mrett s elforgatst. A 13-5 bra mutatja, hogy hrom TIE Fighter esetn (vagyis ha a rszeg rhajsnak hrom szeme van nyitva) milyen animcit lthatunk.

13-5. bra: hrom TIE fighter animcija Az brk jobboldaln lthat szmok az n. frame rate counter-ek rdemes itt kitrni rjuk. 327

13. Teljestmny

Frame Rate Counters


Az App.xaml.cs fjlban a konstruktorban a kvetkez sorokat tallhatjuk:
// Show graphics profiling information while debugging. if (System.Diagnostics.Debugger.IsAttached) { // Display the current frame rate counters. Application.Current.Host.Settings.EnableFrameRateCounter = true; // Show the areas of the app that are being redrawn in each frame. //Application.Current.Host.Settings.EnableRedrawRegions = true; // Enable non-production analysis visualization mode, // which shows areas of a page that are handed off to GPU with a colored overlay. //Application.Current.Host.Settings.EnableCacheVisualization = true; // Disable the application idle detection by setting the UserIdleDetectionMode property of the // application's PhoneApplicationService object to Disabled. // Caution:Use this under debug mode only. Application that disables user idle detection will continue to run // and consume battery power when the user is not using the phone. PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; }

Lthatjuk, hogy mg kt eszkz ll rendelkezsre a grafikai teljestmny analizlshoz - a redraw regions (jrarajzolt terletek) s a cache visualization (cache vizualizci). Ezekrl ksbb lesz sz. A fenti sorok hatrra, ha egy alkalmazst debug mdban indtjuk (F5-el), a kperny oldaln megjelenik nhny szmll (ezeket hvjuk Frame Rate Counter-eknek), amint az a 13-6 brn is lthat.

13-6. bra - Frame Rate Counters Mit is jelentenek ezek a szmok? Az egyes Frame Rate Counterek jelentst az albbi tblzat foglalja ssze, amely a szmokat balrl jobbra sorolja fel: Counter Composition szl frame rate Magyarzat Azt mutatja meg, hogy msodpercenknt hnyszor kerl a kperny frisstsre. Ha ez a szm 60-nl (egyes eszkzkn 50nl) kisebb, az animcik vesztenek folyamatossgukbl. Ha 30 al cskken, a felhasznlk is szreveszik a problmt, s a szm pirosra vlt. Az UI szl az, ahol a raszterizci (renderels) trtnik, s ahol az ltalunk rt kd fut (hacsak nem indtunk j szlat). Ezrt, az alacsony UI szl frame rate azt jelenti, hogy az alkalmazs nem

UI szl frame rate

328

Akadoz animcik okai, megoldsa

Counter

Magyarzat vlaszol idben az inputra. Elfordulhat, hogy ekkor a Composition szlon s a GPU-n tovbbra is folyamatosan futnak az animcik, de a felhasznli lmnyt igencsak rosszul rinti, ha az UI szlat leterheljk. Azt mutatja, hogy a textrk mennyi vide- s rendszermemrit hasznlnak Az explicit felletek szmt mutatja, amellyel a GPU dolgozik. Ha egy FrameworkElement pldnyon a CacheMode tulajdonsgot BitmapCache rtkre lltjuk, vagy a Composition szlon futtatunk egy animcit, a szmll rtke megn. A GPU ltal hasznlt implicit felletek szmt mutatja (lsd ksbb) A GPU-k egyik legfontosabb teljestmny-mutatja a Fill Rate. A GPU-k egy msodperc alatt csak bizonyos szm pixelt tudnak megrajzolni. A Windows Phone 7 esetn a kijelz 800x480 pixelt tartalmaz, s ezt egy els genercis hardver GPU-ja kpkocknknt kb. 2.5-szer tudja megtlteni. A Fill Rate 1-es rtke azt jelenti, hogy a GPU egy kpernynyi pixelt rajzol fel frame-eknnt. Ha ez a szm 2.5 fl emelkedik, a GPU szk keresztmetszett vlik. Ha a szmll 3 fltti rtket mutat, piross vlik, mert az animcik elvesztik folyamatossgukat a frame rate cskkensvel. Figyeljnk oda arra, hogy ha az alkalmazsnak megadunk egy httrsznt, ez nmagban 1-el nveli a Fill Rate-et, mert a GPU-nak elszr ezt a htteret kell megrajzolnia. Ezrt clszer a htteret tltsznak hagyni, ha a rendszer tmjt hasznljuk.

Textra-memria hasznlata Explicit felletek (surface) szma

Implicit felletek (surface) szma Fill Rate

A fentiek alapjn lthat, hogy hrom vadszgppel az emultor kb. 15 FPS-el tudja futtatni az UI szlat. (A telefonom12-13 fps-t mutat). A problmt nem a magas Fill Rate okozza, mivel az fixen 1. A telefon mg 1 TIE esetn is knnyen lemegy 20-30 FPS krnykre. Mi lehet ennek az oka?

Redraw Regions
Ha bekapcsoljuk a Redraw Region opcit, hozzrt szem szmra rgtn nyilvnvalv vlik a problma. A 13-8 brn lthat, hogy mit okoz a bekapcsolsa.

329

13. Teljestmny

13-8. bra: Redraw Regions A Silverlight a nagyobb sebessg rdekben sprol a rajzolssal. gy csak azokat a terleteket rajzolja jra, amelyek vltoznak kt kpkocka kztt. A Redraw Region ezeket az jrarajzolt terleteket minden egyes frame esetn klnbz sznnel megfesti (ez nmi CPU idbe telik, gy ne vgezznk FPS mrseket, ezzel az opcival). Az brn jl ltszik, hogy a kperny jelents rszt jra kellett rajzolni, ahogy a TIE Fighter elhalad a csillagok fltt s a kezelszervek alatt. Radsul maga a TIE Fighter is jrarajzolsra kerl, mivel folyamatosan vltozik a mrete s az elforgatsa. Ezt a raszterizlst minden frame-ben a CPU vgzi gy nem csoda, ha nem kpes msodpercenknt 20-25-nl tbbszr j kpkockt kszteni. Korbban emltettem, hogy a GPU sok olyan feladatot kpes hatkonyan elltni, amire itt is szksg van. Kompozci, forgats, tmretezs, stb ht akkor:

Hasznljuk a GPU-t!
Az Enable GPU Acceleration gomb bekapcsolsval a helyzet drmaian megvltozik. A Redraw Region abbahagyja az rlt villdzst. 3 vadszgp esetn a telefon mg rezhet lassuls nlkl animl. Mg tz TIE Fighternl sem esik 20 FPS al a sebessg. Ugyanakkor az emultor egy ers videokrtyval mindennem lassuls nlkl elvisel tz vadszgpet, de ht az a videokrtya ugye egsz ms kategria, a Call Of Duty MW 3-ra van mretezve Mi is trtnik ilyenkor?

330

Akadoz animcik okai, megoldsa

private void enableGPU_Click(object sender, RoutedEventArgs e) { foreach (var fighter in Ties) fighter.CacheMode = GetTIECacheMode(); } private CacheMode GetTIECacheMode() { bool enabled = enableGPU.IsChecked.Value; return enabled ? new BitmapCache() : null; }

A TIEFighter vezrlk CacheMode tulajdonsgt lltjuk attl fggen, hogy a GPU gyorstst a felhasznl be- vagy kikapcsolta ppen. Kikapcsolt esetben null rtket kap, mg bekapcsolva a BitmapCache osztly egy j pldnyt. A BitmapCache kifejezs mindent el is mond arrl, hogy mit jelent a GPU gyorsts. Azt jelenti, hogy az adott UIElement raszterizlt vltozata a GPU-ban eltrolsra kerl (cache). Ezutn a GPU vgzi az gy trolt textra mozgatst, tltszsgnak vltoztatst, a tbbi textra al- vagy fl helyezst, forgatst, tmretezst, perspektivikus torztst, vagy akr ngyszgletes vgst (clipping). Amennyiben az gy eltrolt elem textrja vltozik (pl. ms szne lesz), akkor a Silverlight Runtime automatikusan frissti a GPU textra-memrijban az elemhez tartoz kpet. Ez persze azt is jelenti, hogy bizonyos animcik gyorsabban futnak, mint msok. A CPU animlja pl. a nem tglalap alak vgsokat, a szn-animcikat, a layout-ot, gradienseket, stb. Ha ilyen animcikat hasznlunk, tegyk azt inkbb kis mretben gy a CPU-nak nem kell annyi pixelt tszmolnia, s gy fenntarthat a magas FPS rtk. A GPU mkdsnek nyomon kvetsre mg egy opci szolgl, ismerjk meg most ezt!

Cache vizualizci
A cache vizualizci opcit bekapcsolva a 13-9 brn lthat eredmnyt kapjuk.

13-9: bra: cache vizualizci s GPU gyorsts

331

13. Teljestmny A cache vizualizci kkkel fest meg, s flig tltszv tesz minden textrt, amit a GPU megjelent. gy nyomon kvethet az, hogy mely felleteket trolja a GPU. rdemes jra vgigvenni a Frame Rate Counter-eket: UI s Composition thread FPS ezek jval magasabbak a telefonon tapasztalhatnl, mivel a screenshot emultoron kszlt. Hasznlt textra memria 8 Mbyte, nem vszes Textrk szma a GPU jelenleg 12 textrval dolgozik. Ebbl 10 a TIE Fighter-ek (mindegyikre jut egy), egy a httr s egy a kezelszervek. rdemes megjegyezni, hogy br nem adtuk meg a httrkpnek s a kezelszerveknek a BitmapCache rtket, azokat a Silverlight automatikusan a GPU-n trolja, mivel elttk s mgttk cache-elt textrk tallhatk. Ezeket a felleteket implicit surface-nek nevezzk, s a 2-es rtk mutatja a szmllk kztt. Fill Rate A problma forrsa itt keresend, a telefon szpen be is pirostotta neknk. A Fill Rate 11.6 rtke azt jelenti, hogy a GPU minden frame-ben 11.6 kpernynyi pixelt rajzol ki. Ez igen magas szm az els genercis telefonokon mr 2.5 fltt elkezd cskkenni a frame rate, s 3.5 krnykn mr bntan elkezd akadozni az animci. A magas fill rate-et termszetesen a sok (s egyre nvekv mret) vadszgp okozza, br esetnkben ezen sokat javt az, hogy mire megnnek, egy jelents rszk kimegy a kpernyrl. A Fill Rate az j genercis telefonokban az ersebb GPU-nak hla mr magasabb rtknl kezd lasstani azonban mg j darabig figyelembe kell vennnk az els genercis telefonok sebessgt, gy nem engedhetjk meg magunknak az ellustulst.

A cache vizualizci megmutatja a feleslegesen hasznlt GPU textrkat, gy lehetv vlik azok kikszblse. De akrmennyi trkkzst csinlunk is, elbb-utbb elrjk a hardver teljestkpessgnek a hatrt 50 teljes mret vadszgpet mr egyik telefon sem fog lvezhet sebessggel mozgatni.

Beptett animcik s a GPU


A fenti animci persze jval egyszerbben reproduklhat Blend-ben, StoryBoard-ok segtsgvel. Az eredmny a StoryBoardAnim.xaml fjlban tallhat st nhny Easing-gel megbolondtva sokkal termszetesebb eredmnyt kapunk. A futtatshoz a mr ismert mdon rjuk t a WMAppManifest.xml fjlban a DefaultTask-ot:
<DefaultTask Name ="_default" NavigationPage="StoryBoardAnim.xaml"/>

Ha gy elindtjuk az alkalmazst, feltnhet, hogy az animci tkletesen folyamatos, mg t TIE Fighterrel is. Knnyen ellenrizhetjk ezt az lltst az Enable GPU Vis opci bekapcsolsval jl lthat, hogy minden vadszgp sajt GPU textrt kapott. Ez csak GPU hasznlatval lehetsges amit mi sehol nem kapcsoltuk be. Valban, a Silverlight futtatkrnyezete automatikusan bekapcsolja a GPU-t, amennyiben StoryBoard animcit hasznlunk procedurlis helyett. A legtbbszr nem is kell ezen gondolkozni, ez m a knyelem!

UI, Compositor s Input szlak


A StoryBoardAnim.xaml oldal nem tartalmaz csillagokat. Van azonban egy Add 6000 stars gomb a kpernyn. Ha ezt megnyomjuk, pr msodperccel ksbb megjelenik a 6000 csillag. A kdot megvizsglva azonban lthatjuk, hogy ennek a gombnak az esemnykezeljben egyszeren csak meghvjuk a CreateStarField metdust 6000-es szmmal. Semmi httrszl s egyb varzslat. A fejezet elejn lertakbl tudhatjuk, hogy ez a megkzelts hossz msodpercekre teljesen lefoglalja az UI szlat. s valban, az UI szl szhoz sem jut: a gomb benyomva marad jval az elengedse utn is (1310 bra), mivel az UI szl a csillagok kirajzolsval van elfoglalva, nem hagytunk idt arra, hogy a nem benyomott llapotot kirajzolja.

332

Hossz vlaszid kezelse

13-10 bra - A UI szlat teljesen blokkolja a 6000 csillag kirajzolsa, mg a gomb is benyomva maradt. Ugyanakkor az animci egy pillanatra sem lassult le a nagy csillaggyrts kzben! Ennek az az oka, hogy az animcik egy kln szlon, a Compositor szlon futnak (s a GPU-n kerlnek megjelentsre). Ez mindaddig gy van, amg olyan animcikat alkalmazunk, amikhez nincs szksg arra, hogy az elemeket jraraszterezze az UI szl, esetleg az elrendezs (layout) vltozsa miatt a vizulis ft jra kelljen szmolni. (A mozgatshoz s forgatshoz hasznlt RenderTransform a layout utn kerl alkalmazsra, gy az elrendezst nem befolysolja). A Mangoban egy j, harmadik szl is bevezetsre kerlt az input kezelsre. Ez s nhny tovbbi hangols a WP7 els kiadsban tapasztalhat legtbb, rossz vlaszidej szitucit megoldja. A legfeltnbb problma a listk grgetsekor jelentkezett a grgetett lista animcija folyamatos volt, de jabb rintsre (pl. ha a grdls meglltshoz megrintettk a kijelzt) nha csak msodpercnyi ksleltetssel reaglt. Ennek oka, hogy a UI szl (amely Mango eltt az inputot is kezelte) el volt foglalva a folyamatosan rkez elemek raszterizlsval, s gy csak ksn szlelte az rints esemnyt. Mondanom sem kell, hogy ez igen kellemetlen felhasznli lmnyt okozott, amit a Mangban (WP7.5) szerencsre mr javtottak a kln szlon fut input-kezels bevezetsvel.

Hossz vlaszid kezelse


A hossz vlaszidnek szmos oka lehet. A j hr, hogy a fentiekben bemutatott technikk a gyorsabb alkalmazs betltsre s a folyamatosabb animcik elrsre a legtbb esetben segthetnek itt is. Ha bonyolult UI-t kell megjelentennk, vegyk el az alkalmazs-indts optimalizlsnl lertakat. Ha hossz szmtst kell vgeznnk, hasznljunk httrszlakat, akr a BackgroundWorker osztly segtsgvel is. Az elkerlhetetlen vrakozst pedig knnyebb tehetjk, ha a felhasznlt tjkoztatjuk a folyamat llsrl (lsd a szubjektv teljestmny rsznl).

333

13. Teljestmny

ltalnos tippek
Szmos tovbbi tipp tallhat a neten, amivel a teljestmnyt javtani lehet. A legfontosabb annak megrtse, hogy semmi nincs ingyen a Grid fejlett layout kpessgeinek ra, hogy sokat kell szmolni az elemek elhelyezsn, a knny, deklaratv UI lers ra a XAML interpretlsnak kltsge, az adatkts rezsije. A teljestmny-optimalizls mvszete abban ll, hogy meg kell tallni azokat a pontokat, ahol rdemes a kd karbantarthatsgbl ldozni, plusz munkt befektetni a szemmel lthat eredmny rdekben. Nincs rtelme pldul rkat lni abba, hogy az alkalmazs indulsa 200 ms-al gyorsabb legyen. Ugyanakkor egy hossz listban az elemek kirajzolst akr 30ms-al is hasznos lehet megrvidteni annak rdekben, hogy a grgets kzben kevesebb legyen az n. blanking vagyis, amikor res elemek jelennek meg, mivel a layout s raszterizci nem kpes lpst tartani a gyors grgetssel. Lssunk teht nhny ilyen tippet a rszletes pldk mellzsvel: A Pivot vezrl gyorsabb, mint a Panorama. Egyszerstsk a layoutot - hasznljunk StackPanel-t, Canvas-t Grid helyett, ahol lehet! Listkban a DataTemplate-eknl ez klnsen hasznos lehet. Amit ma megtehetsz, azt nyugodtan megteheted holnap is (lsd a folyamatos csillag kirajzols az els pldkban a gyorsabb alkalmazs-induls rdekben). Ha a kpeket nem Resource-knt, hanem Content-knt helyezzk az alkalmazsba, gyorsabb lesz annak indulsa. A Compositor szlat lehetleg tartsuk 60 fps krl, a Fill Rate-et 2.5 alatt! Ha hatrozatlan ProgressBar-t (IsIndeterminate=True) alkalmazunk, kapcsoljuk ki ezt a belltst, ha mr nincs r szksg mg akkor is, ha a vezrl nem ltszik a kpernyn! Mg jobb, ha a Mango-ban megjelent SystemTray.ProgressIndicator -t (br ez csak a kperny tetejn jelenik meg), esetleg a Silverlight for Windows Phone Toolkitbl a PerformanceProgressBar vezrlt hasznljuk. A ScrollViewerben (s listkban) az animcikhoz hasonlan automatikusan GPU cacheelsre kerlnek az elemek. Adatbzis hasznlatakor definiljuk a Version oszlopot, implementljuk az INotifyPropertyChange interfszt az entitsokban, s hasznljunk elre fordtott lekrdezseket (compiled queries). A kpek dekdolsa alaprtelmezsben az UI szlon trtnik. A CreateOptions="BackgroundCreation" belltsval ez httrszlra tehet. Ez a funkci a leghasznosabb listknl (pl. Facebook ismersk listzsa), de szinten minden esetben rdemes megfontolni a hasznlatt (taln az egyetlen kivtel a Panorama httere a Panorama vezrlt csak a kp betltdse utn rdemes megjelenteni). A jpg dekdolsa gyorsabb, mint a png-. Hasznljunk jpg-t, hacsak nincs szksgnk a png tltszsgra (vagy vonalas grafikkon a jval kisebb fjlmretre). Az alkalmazsunkat daraboljuk tbb DLL-re, gy megrvidtve a betltsi idt! Az adatkts lassabb, mint a tulajdonsgot kzvetlen lltsa (pl. FirstNameTextbox.Text = Person.FirstName). Ne kezdjnk el azonban megszabadulni minden adatktstl, ritka, hogy ilyen drasztikus vltoztatsokra van szksg! Az UI szlat hagyjuk szabadon a hosszabb mveleteket httrszlon vgezzk, s lehetleg ugyanitt kommunikljunk a felhvel is.

Listk
Mrvad vlemnyek szerint a Windows Phone 7.0 kriptonitja (a zld svny, ami Supermant legyengtette) a listk teljestmnye volt. Szerencsre a Mangban szmos javtson esett t a listakezels, s tbbek kztt a fentebb mr emltett Input szlnak ksznheten nagysgrendeket javult az interaktivitsa.

334

Szubjektv teljestmny Olyannyira gy van ez, hogy a knyvhz ksztettem egy llatorvosi lovat. Egy olyan listt, aminek az ItemTemplate-je tele van teljestmnygyilkos elemekkel. sszetett, nehezen szmolhat elrendezs, sok szveg, kp (13-11 bra).

13-11 bra - sszetett ItemTemplate Amikor kiprbltam a telefonon, jtt a meglepets nem volt tapasztalhat semmi problma! Az animci 60 fps-el dngetett, a lista azonnal reaglt a mozdulatokra. Blanking sem volt tapasztalhat (az a jelensg, amikor olyan gyorsan prg egy lista, hogy az UI szlnak az jabb elemeket nincs ideje kirajzolni, ezrt res pixelek jelennek meg). Termszetesen a Mangban is lehet rosszul teljest listkat kszteni. Egy-kt lass ValueConverter vagy hatalmas kpek picire lekicsinytve, esetleg nmi gradiens a httrben mr gondot okozhatnak. De ha rendeltetsszeren hasznljuk a listkat s odafigyelnk a Fill Rate-re, ritkn fogunk problmba tkzni.

Szubjektv teljestmny
Szubjektv teljestmny alatt az alkalmazs sebessgnek az rzett rtjk, szemben a valdi, mrhet sebessggel. Nemegyszer a szubjektv teljestmny fontosabb a felhasznlnak, mint a valsgos.

335

13. Teljestmny Mr a fejezet elejn is volt arrl sz, hogy az interakci kzvetlensge miatt a teljestmny-elvrsok nagyobbak egy rintkpernys alkalmazssal szemben, mint egy egeres-billentyzetes programnl. Ha a program azonnal reagl, s jelzi, hogy vette az utastsunkat, esetleg egy kis animcival szrakoztat, amg dolgozik, sokkal gyorsabbnak rezzk. Radsul elmlik az a bizonytalan rzs, hogy megnyomtam? Nyomjam meg mg egyszer? ami a taktilis visszajelzs hinya miatt amgy is gyakori az rintkpernyk hasznlinl.

Tilt effektus
A tilt (bednts) effektus elssorban a visszajelzst segti. Ez a Metro nyelv egyik jellegzetes eleme az aktivlhat elemek az rints helytl fggen 3D-ben bedlnek, elengeds utn pedig visszaugranak a helykre. A bednts mkdse jl lthat a Start kpernyn (13-12 bra). Hasznlatval mr a lenyoms pillanatban tudathatjuk a felhasznlval, hogy a telefon vette az rintst.

13-12 bra: a tilt (bednts) effektus segti a visszajelzst A hats ltrehozshoz a Silverlight for Windows Phone Toolkit-ban tallhat TiltEffect osztlyt hasznlhatjuk (lsd mg http://www.windowsphonegeek.com/articles/Silverlight-for-WP7Toolkit-TiltEffect-in-depth). Akr egyetlen kdsorral az egsz PhoneApplicationPage-re engedlyezhetjk az effektust, ezt a kis pluszmunkt mindenkppen megri.

336

Szubjektv teljestmny

A folyamat jelzse
Hosszan tart folyamatoknl (pl. szerverre vrakozs, hosszas szmtsok) rdemes a felhasznlnak jelezni, hogy az alkalmazs dolgozik. Erre bevlt mdszer a ProgressBar hasznlata, vagy egy animci (pl. prg kr, mozg pttyk) megjelentse. Ha tudjuk, hogy a folyamatban nagyjbl hol tartunk, rdemes hatrozott folyamatjelzt vlasztanunk. Erre hasznlhatjuk akr a ProgressBar-t, a SystemTray.ProgressIndicator -t, a Toolkit-bl a PerformanceProgressBar vezrlt, vagy sajt megoldst, mint ahogy a Pictures Lab ksztje tette (1313 bra). Azonban, ha a folyamat idtartama bizonytalan (pl. egy szerver vlaszra vrunk) a ProgressBar hasznlata kerlend, mert a msik kt megoldssal szemben tlsgosan lefoglalja az UI szlat. Hatrozatlan esetben hasznlhatunk mg sajt animcit is (pl. egy kr forgatsa), amennyiben az a GPU-n fut. Hosszan tart folyamatoknl fontos mg, hogy a munkt httrszlon vgezzk, megrizve ezzel az UI szl vlaszkpessgt.

13-13 bra: a Pictures Lab kpszerkeszt program sajt design-nal jelzi, hogy hol tart a szmtsi folyamatban (engedllyel hasznlva)

Kztes animcik
Akr egy fl- vagy egy msodperces szmtst is azonnalinak lt a felhasznl, ha a krdses msodperc alatt trtnik valami a kpernyn. A WP7 animcii idelisak erre a clra, fleg, ha GPU-optimalizltan tudjuk ket vgrehajtani. Pldul egy lapozs vagy fade animci kzben megtrtnhet a betltend oldal layout-szmtsa s raszterizlsa, s gy az animci vgn az j informci azonnal megjelenhet (vagy beszhat).

Amikor a lassabb gyorsabb(-nak tnik)


A szubjektv teljestmny optimalizlsa nmileg hasonlt egy bvszmutatvnyhoz. A figyelem elterelsvel leplezzk a lnyeget s tverjk az rzkeket. J plda lehet erre a SurfCube bngszben a knyvjelzre val navigls. Mivel a knyvjelzk a kocka tetejn helyezkednek el (13-14. bra), egy knyvjelz kivlasztsa utn a kockt vissza kell forgatni az els oldalra, ahol a bngsz tallhat. Az objektv gyorsasg rdekben a knyvjelz megrintse utn azonnal elindtottuk a betltdst s a forgatst. Azonban a bngsz vezrl a CPU-t lefoglalja (fleg navigci elejn), s gy a visszaforgat animci nem ltszdik - ami mg rosszabb, a knyvjelz lenyomsrl csak pr tized msodperc ksssel

337

13. Teljestmny rtesl a felhasznl. Ezrt vltoztattunk a mkdsen, s a bngszt most mr csak a forgats animci befejeztvel irnytjuk t az j cmre. gy a teljes oldal-betltdsi id (az rintstl szmtva) ugyan nhny tized msodperccel megntt, de az azonnali reakci miatt a felhasznlk egyrtelmen (de tvesen) gy reztk, hogy az alkalmazs sokat gyorsult.

13-14 bra: a SurfCube visszafordul az els oldalra a knyvjelz kivlasztsa utn, s csak a forduls utn kezdi meg az oldal betltst (engedllyel hasznlva)

Memria-optimalizls
A memria takarkos hasznlata a szks erforrsok mellett mr csak azrt is fontos, mert a Marketplace az alkalmazs befogadsakor igen szigoran ellenrzi a memria hasznlatt. A szably az, hogy 256 Mbyte-os telefonon max. 90 Mbyte-ot hasznlhat a program, nagyobb memrival rendelkez kszlkeken ennl tbbet is. Termszetesen a Silverlight-ban s a .NET-ben megszokott optimalizl fogsok Windows Phone-on is mkdnek. rdemes azonban ttekinteni nhny platform-specifikus terletet.

338

Windows Phone Performance Analysis

A memria foglals kijelzse


Sajnos a fentebb mr rszletezett teljestmny-mr eszkzk kztt nem szerepel a hasznlt memria kijelzse. Szerencsre Peter Torr ksztett egy MemoryDiagnosticsHelper osztlyt (http://blogs.msdn.com/b/ptorr/archive/2010/10/30/that-memory-thing-i-promisedyou.aspx), aminek segtsgvel folyamatosan megjelenthet az alkalmazsunk memriahasznlata. Miutn a MemoryDiagnosticsHelper.cs fjlt hozzadtuk az alkalmazshoz, egyetlen sorral elindthat:
MemoryDiagnosticsHelper.Start(TimeSpan.FromMilliseconds(500), true);

Amennyiben az alkalmazst debuggerrel futtatjuk, a MemoryDiagnosticsHelper mg egy Debug.Assertel is jelzi, hogy tllptk a 90 Mbyte-os limitet. A MemoryDiagnosticsHelper ami a fenti pldban 500 ms-onknt fut s a Garbage Collector-t minden alkalommal mkdteti htrnyosan befolysolja az alkalmazs teljestmnyt: akadozhatnak az animcik, lassabbak lehetnek a szmtsok. Jmagam is j nhny felesleges rt eltltttem korbban folyamatosan mkd animcik akadozsa utn nyomozva, mikzben csak a MemoryDiagnosticsHelper bekapcsolsa okozta a gondot.

Optimalizls
Ha a fenti kdot a fejezet elejn tallhat pldaprogramba berjuk, lthatjuk, hogy 500 csillag esetn kb. 9Mbyte-ot foglal az alkalmazs, mg 5000-nl 16-ot. Nyilvnval teht, hogy a vizulis fa mrete befolysolja a memria-hasznlatot, de szerencsre viszonylag ritka, hogy tbb ezer vagy tzezer elem tallhat a fban, gy ennek hatsa elhanyagolhat. A legnagyobb memria-falk termszetesen a kpek. Hiba csak 100Kbyte-os egy 800x480 pixeles fnykp jpg formban a telefonnak minden egyes pixellel kell szmolnia, gy az 800x480x4 byte-ot (tbb, mint 1.5 Mbyte) foglal a memriban. Egy Panorama httere ennek tbbszrse is lehet. Radsul a megjelentett vezrlk szintn bitmap formban vannak jelen. Egy lista esetn a lthat elemeken kvl mg nhny tovbbi is renderelsre kerl, s a pixeljei a memriban troldnak. A mr messzire elgrgetett elemek ugyan trldnek a memribl, de a helykre a grgets sorn j elemek kerlnek (ezt hvjuk virtualizcinak, s a ListBox vezrlben ez az alaprtelmezett mkds). Knnyen elkpzelhet, hogy egy sokelemes panorma, ahol minden elem egy vagy tbb tovbbi, grdthet listt tartalmaz, mr igen komoly memrit felemszthet. Az alaprtelmezett Panorama alkalmazs pldul 28 Mbyte memrit eszik, anlkl, hogy kpek lennnek a listkban. A kpeknl ezrt (s a letltsi, nomeg a dekdolsi sebessg rdekben is) rdemes a kpeket a vgleges mretkben kezelni. Teht, ha egy 100x100-as thumbnail-t jelentnk meg, de a szerverrl 500x500-as kpet kapunk, akkor legjobb, ha a szerveren ksztnk 100x100-asat is. Ha ez nem lehetsges, akkor a kp dekdolsakor mr a vgs mretet adjuk meg:
PictureDecoder.DecodeJpeg(sourceStream, 100, 100);

Windows Phone Performance Analysis


Egy bonyolultabb alkalmazsban nem egyszer megtallni a teljestmny-problmk okt. Szerencsre a Windows Phone SDK rsze a Windows Phone Performance Analysis (WPPA) eszkz, amely pont ebben segt. Prbljuk ki a fejezet els mintapldjn, az 5000 csillagot kirajzol programon! A tesztelst minden esetben a fizikai eszkzn vgezzk, mivel az emultor a mr emltett okok miatt hamis eredmnyt fog adni. A pontosabb mrs rdekben vltsunk Release konfigurciba, majd a Visual Studio Debug menjben tallhat Start Windows Phone Performance Analysis menponttal indtsuk el a WPPA-t! A 13-15 brn lthat kperny jelenik meg, majd a Launch Application megnyomsa utn

339

13. Teljestmny elindul az alkalmazs a telefonon. Vrjuk meg, amg megjelennek a csillagok, majd lltsuk le az adatgyjtst!

13-15 bra: A Windows Phone Performance Analysis indtkpernyje Nmi szmols utn a 13-16 brn lthat eredmnyt kapjuk (nyomjunk egy jobb gombot, majd a Select All-t a grafikonon). Mit jelent mindez?

13-16 bra: Az analzis eredmnye A fels skla a msodpercekben mrt idt mutatja. Alatta a Frame Rate azt mutatja, hogy egy msodperc alatt a kperny hnyszor kerlt jrarajzolsra. Mivel a csillagok kirajzolsa utn az alkalmazs nem csinl semmit, ezrt nincs itt sok rtkelhet adat. Jellemzen 30 s 60 kztti rtkeket szeretnk itt ltni. A CPU-hasznlatot mutat grafikonon a fehr szn azt jelzi, amikor a CPU nem csinl semmit. A zld szn az UI szlat, a szrke a rendszer-szlat jelenti, az esetenknt megjelen lila pedig a az alkalmazs nem UI szlait (belertve a Compositor s a httr-szlakat).

340

Windows Phone Performance Analysis A memria-hasznlat grafikonja egyrtelm. Alatta a program ltal indtott StoryBoard-ok (piros CPU, lila nem CPU) s kpbetltsek tallhatk ezek ebben az alkalmazsban nem fordulnak el. Legvgl pedig a Garbage Collector esemnyei. Ha fent kijellnk egy legalbb fl msodperces idtvot, az als rszben a tipikus teljestmnyproblmkra hvja fel a figyelmnket a program. Pldul az els sorban azt jelzi, hogy magas CPU hasznlatot mrt az UI szlon olyan CPU hasznlatot, ami nem felttlenl a rajzolssal van sszefggsben. Ha a Performance Warnings melletti kis nyilacskra kattintunk, megtekinthetjk a frame-eket, illetve a CPU-hasznlatot. Elszr vlasszuk ki a Frames-t, ekkor a 13-17 brn lthat eredmnyt kapjuk!

13-17 bra: Az alkalmazs els 5 kpkockjnak adatai Lthat, hogy az alkalmazs a futsa sorn 5 kpkockt ksztett (0-tl szmozva). Ebbl az tdik (utols) kocka az, amikor az ellipsziseket kirajzoltuk. Ezt tbb mint 1 msodpercig rajzolta a telefon (Duration s CPU time). Lthat mg az adott frame Fill Rate-je s a textrk szma is. Nzzk meg, mi kerlt egy msodpercbe a 4-es kpkocka kiszmtsnl! Ehhez vlasszuk ki a 4-es kockt, majd a Frames szvegtl jobbra tallhat kis hromszgre kattintva vlasszuk a Functions menpontot. Lthatjuk, hogy a 4. kpkocka megrajzolshoz milyen fggvnyhvsokat hajtott vgre a rendszer. Az Inclusive samples-re ktszer kattintva, cskken sorrendbe rendezhetjk a hvsokat, s a 13-18 brn lthat eredmnybl le is vonhatjuk a kvetkeztetst: a legtbb idt a MeasureOverride s ArrangeOverride teht az elrendezshez szksges feladatok veszik el. Ezt az idt rvidthettk le, amikor Grid helyett Canvas-t hasznltunk. Az Inclusive azt jelenti, hogy az adott fggvnybl hvott tovbbi fggvnyek is beleszmtanak, az exclusive pedig, hogy csak a fggvny sajt idejt szmtjuk.

13-18 bra: A 4. kpkocka elksztshez szksges fggvnyhvsok De mi a helyzet az ellipszisek megrajzolsval? Ehhez a Frames melletti hromszgbl vlasszuk az Element Types lehetsget, s lthatjuk az 5000 ellipszist. Mg ltvnyosabb, ha a Visual Tree for Frame 4 opcit vlasztjuk (13-19 bra).

341

13. Teljestmny

13-19 bra: A 4. kpkocka vizulis fja s az egyes elemek megrajzolshoz szksges id Itt fban kibontva lthat, hogy melyik elemmel mennyit foglalkozott a telefon. Taln meglep lehet, hogy az ApplicationTitle TextBox kezelse egy tized msodpercbe kerlt. Ennyire lassan rajzolna szveget a futtatkrnyezet? A PageTitle viszont csak 5 ms. A jelensg oka, hogy az els szveg kirajzolsnl a krnyezetnek mg a TextBox osztlyt is be kellett tltenie s rtelmezni, mg a msodik TextBox-nl mr erre nem volt szksg, csak magra az elrendezsre s a rajzolsra. Visszatrve a kpkockkra (13-17 bra), les szemek szrevehettk, hogy a 4-es kockt a program indtsa utn 6.767 msodperccel kezdte csak el a telefon szmolni. Mi trtnt vajon a 3-as kocka vge s a 4-es eleje kztt, kzel 6 msodpercig? Erre a krdsre a vlaszt gy kaphatjuk meg, ha a diagramon kijelljk a 3-as s 4-es kpkocka kztti terletet, majd a Performance Warnings - CPU Usage - Functions nzethez naviglunk (13-20 bra).

342

sszefoglals

13-20 bra: A CreateStarField vitte el a 3-as s 4-es frame kztti id 88%-t. Lthat, hogy a telefon az ideje jelents rszt a MainPage konstruktorban, st azon bell a CreateStarField metdusban tlttte. rdemes ksrletezni mg a tbbi lehetsggel, s persze sajt alkalmazsokkal is! A Windows Phone Performance Analysis elsajttsa nem egyszer, de az egyik leghasznosabb eszkz lehet a fejleszts sorn a teljestmny-problmk azonostsban.

sszefoglals
Egy egsz knyvet lehetne rni arrl, hogy mikpp ksztsnk gyors, kitn teljestmny Windows Phone alkalmazsokat. Ez a fejezet csak az t elejt tudta megmutatni a CPU s GPU hasznlatt, a lass betltds s navigci, az akadoz animcik lehetsges okait s megoldst. Sz volt a szubjektv teljestmnyrl, a memriafoglals minimalizlsnak mdjairl s a mindezeket elemezni kpes Windows Phone Performance Analysis eszkzrl is.

343

You might also like