Vous êtes sur la page 1sur 102

WINDOWS PHONE 7 KDGYJTEMNY

Turczy Attila Livesoft Kft. 1|Oldal 2012.03.01.

Kszlt a Microsoft Magyarorszg megbzsbl

2|Oldal

Tartalomjegyzk
Elsz....................................................................................................................................................... 5 Kperny orientci mdostsa ............................................................................................................ 6 Software Input Panel (SIP) ....................................................................................................................... 8 System Tray ........................................................................................................................................... 10 Application Bar ...................................................................................................................................... 12 Vibrci.................................................................................................................................................. 14 FM Rdi................................................................................................................................................ 16 Hlzati Informcik ............................................................................................................................. 17 Navigci ............................................................................................................................................... 20 Navigci Paramter tadsa ............................................................................................................. 21 Navigci Objektum tadsa .............................................................................................................. 23 Back button ........................................................................................................................................... 24 Telefonhvs indtsa ............................................................................................................................. 25 SMS-klds ............................................................................................................................................ 26 E-mail kldse ....................................................................................................................................... 28 Web oldal betltse .............................................................................................................................. 29 Mdiatartalom lejtszsa ...................................................................................................................... 30 Keress a weben.................................................................................................................................... 31 Kamera hasznlata ................................................................................................................................ 32 Photo Library elrse ............................................................................................................................ 34 Telefonszm mentse ........................................................................................................................... 36 Telefonknyv Nvjegy kivlasztsa .................................................................................................... 37 Figyelmeztetsek s riasztsok ............................................................................................................. 38 GPS koordintk lekrdezse ................................................................................................................ 40 BingMaps vezrl hasznlata ................................................................................................................ 42 BingMaps PushPinek ............................................................................................................................. 44 3|Oldal

tvonaltervezs..................................................................................................................................... 45 Gyorsulsmr hasznlata .................................................................................................................... 49 Giroszkp hasznlata ............................................................................................................................. 52 Irnyt hasznlata ................................................................................................................................. 54 User Control ksztse ........................................................................................................................... 56 PopUp .................................................................................................................................................... 58 DatePicker Windows Phone 7 Toolkit ................................................................................................ 60 ExpanderView Windows Phone 7 Toolkit........................................................................................... 61 MultiselectList Windows Phone 7 Toolkit .......................................................................................... 64 PageTransition Windows Phone 7 Toolkit .......................................................................................... 65 HubTile Windows Phone 7 Toolkit ..................................................................................................... 67 WrapPanel Windows Phone 7 Toolkit ................................................................................................ 69 ContextMenu Windows Phone 7 Toolkit ........................................................................................... 71 Vezrl testreszabsa Expression Blend ............................................................................................ 73 Animci ltrehozsa Expression Blend ............................................................................................. 74 Animci ltrehozsa XAML (ProgressBar) ........................................................................................ 77 Animci ltrehozsa Kdbl ............................................................................................................. 79 Pivot s Panorma ................................................................................................................................. 80 I/O mveletek ........................................................................................................................................ 84 Alkalmazs belltsok........................................................................................................................... 86 Jegyzetfzet alkalmazs ksztse ......................................................................................................... 89 Adatbzis ltrehozsa............................................................................................................................ 94 Read-Only adatbzis ltrehozsa .......................................................................................................... 96 Webszolgltatsok elrse .................................................................................................................. 101

4|Oldal

Elsz
Amikor valaki a kezbe (vagy a monitorra) veszi ezt a knyvet, rgtn szembetnik, hogy ez nem szokvnyos szakmai knyv hosszas lersokkal, s ltalnos kijelentsekkel. Ezen knyv megrsnak az alaptlete az volt, hogy rthet, a Windows Phone 7 fejlesztsben tapasztalatlan szakemberek szmra is tlthat tmutatkat ksztsnk, melyek segtenek eligazodni ezen j terlet fejlesztsben. Pont ezrt a Windows Phone 7 fejlesztsnek lnyegesebb terleteit kiemelve, a legtbb funkcihoz tallunk benne rvid, maximum 1-2 oldalas lersokat, melyek lpsrl lpsre vezetnek vgig egy-egy alkalmazs megrsban, s a kdok is szerepelnek minden lpsnl. A knyvben mindent meglelnk, amire csak szksgnk van: a rdi-alkalmazstl kezdve, a GPS kezelsen keresztl a Windows Phone 7 toolkit vezrlkig, s az els lpsekben is nagy segtsget nyjt. A fejezetek nem kapcsoldnak szervesen egymshoz, ahol mgis, ott jellve van, gy tetszleges sorrendben haladhatunk, nem fontos az ltalunk sszelltott sorrendet kvetni. Ebben a knyvben nem megynk bele mlyen az egyes tmkba, hanem pldkon keresztl, a gyakorlatban segtnk elsajttani a tudsanyagot. Ha ezen tmk elmleti rsze komolyabban is rdekel, akkor minden kell informcit megtallsz a Windows Phone Fejleszts lpsrl lpsre cm knyvben. Ez a jegyzet egyfajta kiegsztse az elbb emltett knyvnek, melyek egyttes hasznlatval mind elmleti, mind gyakorlati tudsodat fejlesztheted. Remlem, hasznosnak tallod majd, s segt mindenben, amire szksged lesz a fejleszts sorn. Turczy Attila Budapest, 2012. Februr

5|Oldal

Kperny orientci mdostsa


A Visual Studio 2010-ben, amikor j Windows Phone 7 page-et (oldalt) hozunk ltre, akkor a Landscape vagy a Portrait elrendezsek kzl vlaszthatunk.

A Windows Phone 7 hromfle kperny orientcit tmogat: tmogatja a Protrait-t, a Landscape-et, valamint a PortraitOrLandscape-et. Azt, hogy az alkalmazsunk mit tmogasson, a PhoneApplicationPage direktvjban hatrozhatjuk meg, a SupportedOrientations tulajdonsgnl. Ha ez a tulajdonsg Protrait-ra van lltva, akkor az alkalmazsunk csak portr mdban fog futni, gy ha elforgatjuk a kijelzt, akkor sem trtnik vltozs. Landscape mdban az alkalmazsunk csak a fektetett megjelentst tmogatja. A PortraitOrLandscape belltsval az alkalmazsunk az elbb emltett mind a kt mdot tmogatja, gy ha a felhasznl a telefont elforgatja, akkor Landscape mdra vlt az alkalmazs, mg ha visszalltja, akkor portrait mdban fut tovbb. Portrait md
SupportedOrientations="Portrait"

Landscape md
SupportedOrientations="Landscape"

Feliratkozhatunk rteslhetnk a

az

(PhoneApplicationPage) s

OrientationChanged is az

esemnyre, amivel Ehhez az

vltozsrl,

vltoztathatunk

orientcin.

OrientationChangedEventArgs ot is hasznlhatjuk, amelynek az Orientation tulajdonsga megmondja, hogy a telefon jelenleg milyen pozciban van.

6|Oldal

private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e) { this.Orientation = e.Orientation; } Mg annyit rdemes tudni errl, hogy ha az elforgats utn kicsszik a kpbl a UI elem, akkor az scroll-ozhat lesz a kpernyn. Teht ha valamit rosszul mrtnk fel a UI-on, a felhasznl akkor is tudja hasznlni az alkalmazst, legfeljebb knyelmetlen lesz a szmra. Emultorban is megnzhetjk, hogy az alkalmazsunk hogy nzne ki: elfektethetjk a kijelzt, ehhez az emultor toolbar-jn kt gomb is van. Bal s jobb irnyba is eldnthetjk az emultor kijelzjt.

7|Oldal

Software Input Panel (SIP)


A mobilkszlkeken viszonylag kicsi a kijelz, gy egy teljes rtk billentyzetet nem kaphatnak a felhasznlk, m vannak specilis billentyzetek, specilis feladatok elltsra (SIP Software Input Panel), amellyel megknnythetjk a munkjukat. Az alkalmazsunk tervezsekor figyeljnk arra, hogy a beviteli mezkhz megfelel beviteli panelt adjunk! Telefonszm beviteli mezhz teljes bevitelimez felesleges s knyelmetlen. Ilyen esetben a TextBox InputScope tulajdonsgt llthatjuk be a szmunkra megfelel tpusra. Ezt a tulajdonsgot clszer minden beviteli mez esetben megadni. Nzznk hrom textbox-ot, hrom klnbz InputScope-pal! <TextBox Text="text" InputScope="Text" /> <TextBox Text="4251231234" InputScope="TelephoneNumber"/> <TextBox Text="a@b.com" InputScope="EmailUserName"/> Az eredmny:

Az InputScope-ot dinamikusan, kdbl is megadhatjuk: InputScope ins = new InputScope(); InputScopeName insName = new InputScopeName(); insName.NameValue = InputScopeNameValue.Number; ins.Names.Add(insName); tbTitle.InputScope = ins; A Windows Phone 7 ben rengeteg specilis InputScope van. A teljessg ignye nlkl:
AddressCity AddressCountryName AddressStateOrProvince AddressStreet AlphanumericFullWidth AlphanumericHalfWidth ApplicationEnd Bopomofo Chat CurrencyAmount CurrencyAmountAndSy mbol CurrencyChinese Date DateDay DateDayName DateMonth DateMonthName DateYear Default Digits EmailNameOrAddress EmailSmtpAddress EmailUserName EnumString FileName FullFilePath Hanja Hiragana KatakanaFullWidth KatakanaHalfWidth LogOnName Maps NameOrPhoneNumber Number NumberFullWidth OneChar

8|Oldal

Password PersonalFullName PersonalGivenName PersonalMiddleName PersonalNamePrefix PersonalNameSuffix PersonalSurname PhraseList PostalAddress

PostalCode Private RegularExpression Search Srgs TelephoneAreaCode TelephoneCountryCode TelephoneLocalNumber TelephoneNumber

Text Time TimeHour TimeMinorSec Url Xml Yomi

Lthat, hogy a cm megadstl kezdve, az URL-en keresztl, a keressi beviteli mezkig rengeteg scope ll a rendelkezsnkre. Tovbbi informcikat a Windows Phone fejleszts lpsrl lpsre knyv harmadik fejezetben olvashatunk. MSDN Cikk

9|Oldal

System Tray
A System Tray a rendszer ltal lefoglalt terlet, ahol a rendszerinformcik jelennek meg: trer, tltttsg, sttuszinformcik stb. Ezt elrejthetjk, de ha nem muszj, ne tegyk meg! Ezzel ugyan nyerhetnk nmi terletet, de a felhasznltl informcikat rejtnk el (sarktott plda: ha a felhasznl jtszik a kszlkn egy online jtkkal, s kzben tmegy az orszghatron, nem fog rlni, amikor megltja a telefonszmljn a roaming djat, amit nhny megabyte miatt kell fizetni, amit eljtszott. Vagy pp jtk kzben hirtelen lemerl a kszlk.) Ha mgis el akarjuk rejteni, akkor azt megtehetjk XAML-ben, a PhoneApplicationPage-nl: shell:SystemTray.IsVisible="false" Vagy C# kdbl: Microsoft.Phone.Shell.SystemTray.IsVisible = false; A Windows Phone 7 els vltozatban a System Tray nem sok dologra volt alkalmas. Tulajdonkppen csak elrejthettk, ha akartuk, de ms testreszabsra nem volt lehetsg. A Mango frisststl kezdve viszont plusz funkcionalitst is kapott, illetve nmi testre szabhatsgot is. Sok alkalmazsnl problma volt, hogy az alkalmazsnak volt egy alaprtelmezett arculata, de ahhoz a fekete-fehr system tray nem alkalmazkodott, ezrt elgg kilgott az alkalmazs fels rsze, gy egy kicsit butn nzhetett ki az alkalmazsunk. Most viszont mr van arra lehetsg, hogy a System Tray szneit is testre szabjuk. Nzznk egy pldt XAML-ben! <phone:PhoneApplicationPage ... xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" ... shell:SystemTray.BackgroundColor="Orange" shell:SystemTray.ForegroundColor="Black" shell:SystemTray.IsVisible="True">

A System Tray a testre szabhatsgon kvl kiegszlt egy ProgressIndicatorral is, gy nem kell kln progressbar-t hasznlnunk, ha egy hosszabb folyamatot akarunk jelezni a

10 | O l d a l

felhasznl

szmra.

Megtarthatjuk

System

Tray-t,

abban

elindthatjuk

megjelenthetjk a folyamatjelzt. A ProgressIndicator-t elhelyezhetjk kdbl. Ehhez szksgnk lesz a Microsoft.Phone.Shell nvtrre. using Microsoft.Phone.Shell; Hozzuk ltre a ProgressIndicator pldnyt (pldul a konstruktorban), s lltsuk be szmunkra megfelelen a tulajdonsgait! ProgressIndicator pIndicator = new ProgressIndicator(); pIndicator.IsVisible = true; pIndicator.Text = "Lekrdezs folyamatban..."; pIndicator.IsIndeterminate = true; Jelen esetben van egy ProgressIndicator-unk, aminek az IsVisible tulajdonsga True, a Text tulajdonsga a Lekrdezs folyamatban szveg, s az IsIndeterminate tulajdonsga True, azaz nem hatrozzuk meg, hogy hol tart a folyamat. Ha most elindtannk az alkalmazst, nem jelenne meg a ProgressIndicator. Ezt kln meg kell mondanunk a System Tray-nek, az albbi mdon: SystemTray.SetProgressIndicator(this, pIndicator); gy mr ha elindtjuk az alkalmazst (s ha most a konstruktorba helyeztk el a kdot), az albbi eredmnyt lthatjuk:

A ProgressIndicator-t elhelyezhetjk XAML-bl is, s persze tulajdonsgaihoz akr adatkthetnk is. Plda XAML-ben trtn Progress Indicator megadsra (PhoneApplicationPage s az elrendezs vezrl kz helyezhetjk): <shell:SystemTray.ProgressIndicator> <shell:ProgressIndicator x:Name="pIndicator" IsVisible="True" IsIndeterminate="True" Text="Adatok lekrdezse"/> </shell:SystemTray.ProgressIndicator> Az eredmny hasonl, mint az elz esetben. Ne feledjk: a ProgressIndicator eltntetsrl is neknk kell gondoskodnunk!

11 | O l d a l

Application Bar
Az Application Bar egy kis toolbar a Windows Phone lapon. Maximum ngy ikon gombot (icon button) s / vagy tovbbi men elemeket tartalmazhat. Az Application Bar segtsgvel az alkalmazsunk f funkciit tehetjk knnyen elrhetv. Br maximum 4 men elemet tartalmazhat, mgis ajnlott legfeljebb hrom ikon gombot (icon buttont) hasznlnunk. Fontos megjegyezni, hogy az ApplicationBar nem szokvnyos vezrl. nem a Silverlight rsze, s elg sok megkts van vele kapcsolatban. Egyfell kdbl is nehezebb elrni egyes men elemeit, msfell az adatktst sem tmogatja (fleg lokalizci esetn kell kerl megoldsokat alkalmazni). Nzznk egy egyszer pldt a hasznlatra: 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. Ha jl megnzzk a XAML kdot, akkor lthat, hogy az oldalon mr eleve van egy plda ApplicationBar elhelyezve, csak ki van kommentezve. <!--Sample code showing usage of ApplicationBar--> <!--<phone:PhoneApplicationPage.ApplicationBar> ... 3. Vegyk ki a kommentet a <phone:PhoneApplicationPage ell, s mris hasznlatba vehetjk az ApplicationBart. 4. Indtsuk el, s nzzk meg, hogy most hogy nz ki az ApplicationBar-unk! 5. A kperny als rszben ott az ApplicationBar, de az ikonok nem az igaziak, s a menuitem neveit is clszer volna valami beszdesebb nvvel elltni.

6. Els krben ikonokra lesz szksgnk. Szerencsre a Windows Phone 7 SDK tartalmaz nhnyat szmunkra. A projektnkben ksztsnk egy Images mappt (Add -> New Folder), majd adjunk hozz kt ikont a projekthez! Az Images mappra kattintsunk jobb egrgombbal, s vlasszuk ki az Add -> Existing Item menpontot! Navigljunk el a Windows Phone 7.1 SDK Icons mappjba ($Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Icons\dark), vlasszunk ki kt ikont, s adjuk hozz a projektnkhz! n most az add-et s a refresh-t fogom hozzadni. 12 | O l d a l

7. Jelljk ki a kt kpet, amit az elbb hozzadtunk, s a Properties Window-ban lltsuk t a Build Action Contentre!

8. Trjnk vissza a MainPage.xaml fjlhoz, s a kt ApplicationBarIconButton esetn rjuk t az IconUrl tulajdonsgt! Adjuk meg a kpek valdi nevt, s a Text-et mdostsuk ennek fggvnyben! A men item-ek Text tulajdonsgt is mdostsuk egy neknk szimpatikus szvegre! <phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> <shell:ApplicationBarIconButton IconUri="/Images/add.png" Text="add"/> <shell:ApplicationBarIconButton IconUri="/Images/refresh.png" Text="refresh"/> <shell:ApplicationBar.MenuItems> <shell:ApplicationBarMenuItem Text="info"/> <shell:ApplicationBarMenuItem Text="about"/> </shell:ApplicationBar.MenuItems> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar> 9. Most mr van egy szp, mde haszontalan toolbar-unk. A szimulls vgett iratkozzunk fel az ApplicationBarIconButton Click esemnyre! <shell:ApplicationBarIconButton IconUri="/Images/add.png" Text="add" Click="Add_AppBarClick"/> Figyeljk meg, hogy ebben az esetben nem RoutedEventArgs-unk van, hanem egy egyszer EventArgs. private void Add_AppBarClick(object sender, EventArgs e) { MessageBox.Show("Hozzadtam!"); } 10. Indtsuk el az alkalmazst, s prbljuk ki az ApplicationBar-t mkds kzben!

13 | O l d a l

Vibrci
Lehetsgnk van arra, hogy Vibrcis figyelmeztetseket adjunk a felhasznl szmra. Egyfell ez markns visszajelzs, msfell kellemes (Na, j, ez relatv .) Ehhez a Microsoft.Devices nvtr VibrateController assembly). Vibrajelzst nagyon egyszer adni, ugyanis ennek az osztlynak kt metdusa van: egy Start s meglepetsre van egy Stop metdusa is. Ksztsnk egy Windows Phone 7 alkalmazst, s helyezznk el a felhasznl felletn 2 gombot: az els neve btnStart, a felirata (Content) START legyen, a msodik gomb a btnStop nvre hallgasson, a felirata pedig legyen a STOP! Kattintsunk a START gombra ktszer, ezzel betltjk az alaprtelmezett esemnyt, a klikket! Mieltt az esemny trzst kitltennk, a nvtereknl oldjuk fel a Microsoft.Devices nvteret! using Microsoft.Devices; Ezt kveten hatrozzuk meg a btnStart klikk esemnynek trzst a kvetkez mdon: private void btnStart_Click(object sender, RoutedEventArgs e) { VibrateController vibrate = VibrateController.Default; vibrate.Start(TimeSpan.FromMilliseconds(5000)); } Ezzel megkapjuk a VibrateController pldnyt, majd a Start metdus meghvsnl megadjuk, hogy a Vibrci mennyi ideig tartson. Ezt milliszekundumban hatrozzuk meg. 1 msodperc 1000 milliszekundum. Ha most elindtjuk az alkalmazst az emultorban, akkor sokat a vibrcibl nem fogunk tapasztalni, ezrt ezt a pldt gy tudjuk kiprblni, ha kszlkre deploy-olunk. (Kszlkre trtn teleptsrl a Windows Phone 7 lpsrl lpsre 12. Marketplace fejezetben rszletesen olvashatunk.) Ha ez megvolt, kattintsunk a START gombra, ekkor a telefon 5 msodpercen keresztl fog vibrlni! Trjnk vissza a kdunkhoz, s iratkozzunk fel a STOP gomb klikk esemnyre is, majd a btnStop klikk esemnynek trzsbe rjuk a kvetkezt: private void btnStop_Click(object sender, RoutedEventArgs e) { VibrateController vibrate = VibrateController.Default; vibrate.Stop(); } osztlyra lesz szksgnk (Microsoft.Phone

14 | O l d a l

rtelemszeren, a VirbrateController pldnyt globlisan is elhelyezhetjk, hogy ne kelljen folyton a pldnyt lekrdezni. A jobb rthetsg kedvrt itt helyeztk most el. Indtsuk el az alkalmazst! Kattintsunk a START gombra, majd 1-2 msodperc mlva a STOP gombra. Ilyenkor megszakad a vibrlsa. nll feladat: Az SOS morzejelt rjuk meg vibramotor hasznlatval (akr vizulis visszajelzst is adhatunk)! MSDN Cikk

15 | O l d a l

FM Rdi
Minden Windows Phone 7 kszlk rendelkezik FM Radio tunner-rel. Ezt mi is kezelhetjk a sajt alkalmazsunkbl, gy akr egy sajt komplex FM Rdi alkalmazst is kszthetnk. Ehhez szksgnk lesz a Microsoft.Devices.Radio nvtrre. using Microsoft.Devices.Radio; Az FM rdi bekapcsolsa s belltsa nagyon egyszer. Elszr is meg kell adnunk, hogy milyen rgis belltsokat szeretnnk hasznlni: ez lehet Europe, UnitedStates vagy Japan (RadioRegion enumerci) . FMRadio.Instance.CurrentRegion = RadioRegion.Europe; Ezenkvl meghatrozhatjuk, hogy bekapcsoljuk-e a rdit (kt llapota lehet, On s Off) (RadioPowerMode enumerci): FMRadio.Instance.PowerMode = RadioPowerMode.On; Ezt kveten mr csak frekvencit kell meghatroznunk: FMRadio.Instance.Frequency = 103.9; Amint lthat, mindsszesen hrom sor kell ahhoz, hogy egy egyszer FM rdis alkalmazsunk legyen Windows Phone 7-en. Itt megintcsak nem hasznlhatjuk ennek kiprblsra az emultort, kszlkre kell publiklnunk az alkalmazst, de figyeljnk arra is, hogy az FM rdi csak akkor fog elindulni, ha a headset be van dugva a kszlkbe, ugyanis a headset-ben van az antenna (a kszlk hangerejre is figyeljnk)! MSDN Cikk

16 | O l d a l

Hlzati Informcik
Lekrdezhetjk, hogy jelenleg van-e hlzati lefedettsgnk. Ehhez a NetworkInterface.GetIsNetworkAvailable() metdust hasznlhatjuk fel. A NetworkInterface a System.Net.NetworkInformation nvtrben tallhat. bool IsNetwork = NetworkInterface.GetIsNetworkAvailable(); txtIsNetwork.Text = IsNetwork.ToString(); Tulajdonkppen csak azt mondja meg, hogy van-e hlzat vagy sem, arrl, hogy a hlzat milyen, mr tovbbi informcikat nem ad. Azt se tudjuk meg, ha vltozs trtnik. Ahhoz, hogy figyeljk, hogy trtnt-e vltozs, a NetworkChange NetworkAddressChanged esemnyre kell feliratkoznunk: public MainPage() { InitializeComponent(); NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged); } void NetworkChange_NetworkAddressChanged(object sender, EventArgs e) { bool IsNetwork = NetworkInterface.GetIsNetworkAvailable(); txtIsNetwork.Text = IsNetwork.ToString(); } A Windows Phone 7 els vltozatban nem sok informci llt a hlzatrl rendelkezsnkre, ez viszont vltozott a Mango frisstssel. Immr van egy Microsoft.Phone.Net.NetworkInformation nvtr, azon bell pedig kt, informciban igencsak gazdag osztly: az egyik a DeviceNetworkInformation, a msik pedig a mr emltett NetworkInterface. Ezek az osztlyok lehetv teszik, hogy megtudjuk, az eszkz csatlakoztatva van-e a hlzathoz, s ha igen, mi a kapcsolat tpusa. Ez az informci nagyon hasznos lehet, amikor olyan alkalmazst ksztnk, amihez aktv hlzati kapcsolat szksges, vagy jelents mennyisg adatot kell letltennk Wi-Fi-n vagy cellulris hlzaton keresztl. Oldjuk fel a Microsoft.Phone.Net.NetworkInformation nvteret (ha hozzadtuk a

System.Net.NetworkInformation nvteret, most clszer eltvoltani) a kvetkez kddal: using Microsoft.Phone.Net.NetworkInformation; Ezt kveten krdezznk nhny alapvet informcit a kszlkrl: bool IsConnected = DeviceNetworkInformation.IsNetworkAvailable; bool IsCellularDataEnabled = DeviceNetworkInformation.IsCellularDataEnabled; bool IsCellularDataRoamingEnabled = DeviceNetworkInformation.IsCellularDataRoamingEnabled; bool IsWifiEnabled = DeviceNetworkInformation.IsWiFiEnabled; 17 | O l d a l

Lekrdezzk, hogy van-e hlzatunk (csakgy, mint a fentebbi esetben, csak itt a DeviceNetworkInformation-t hasznljuk fel erre a clra), ezenkvl lekrdezzk, hogy a mobil adatforgalom engedlyezve van-e mind itthon, mind klfldn, ugyanis lehetsgnk van pldul arra, hogy klfldn ne engedlyezzk az alkalmazs szmra, hogy neten keresztl kommunikljon. Az IsWiFiEnabled del megtudhatjuk, hogy a Wi-Fi engedlyezve van-e. Lekrdezhetjk a hlzat nevt is, amihez csatlakozunk, azaz, hogy Vodafone, T-Mobile, Telenor stb. string MobileOperator = DeviceNetworkInformation.CellularMobileOperator; Ami fontosabb, hogy most mr a kapcsolatunk tpust is lekrdezhetjk. Ehhez most kln metdust runk a felhasznlbart megjelentsrt: string ConnectionType = GetInterfaceTypeString(NetworkInterface.NetworkInterfaceType); A metdus picit hossz, mert a NetworkInterfaceType-nak elg sok vltozata ltezik: private string GetInterfaceTypeString(NetworkInterfaceType networkInterfaceType) { switch (networkInterfaceType) { case NetworkInterfaceType.AsymmetricDsl: return "Asymmetric DSL"; case NetworkInterfaceType.Atm: return "Atm"; case NetworkInterfaceType.BasicIsdn: return "Basic ISDN"; case NetworkInterfaceType.Ethernet: return "Ethernet"; case NetworkInterfaceType.Ethernet3Megabit: return "3 Mbit Ethernet"; case NetworkInterfaceType.FastEthernetFx: return "Fast Ethernet"; case NetworkInterfaceType.FastEthernetT: return "Fast Ethernet"; case NetworkInterfaceType.Fddi: return "FDDI"; case NetworkInterfaceType.GenericModem: return "Generic Modem"; case NetworkInterfaceType.GigabitEthernet: return "Gigabit Ethernet"; case NetworkInterfaceType.HighPerformanceSerialBus: return "High Performance Serial Bus"; case NetworkInterfaceType.IPOverAtm: return "IP Over Atm"; case NetworkInterfaceType.Isdn: return "ISDN"; case NetworkInterfaceType.Loopback: return "Loopback"; 18 | O l d a l

case NetworkInterfaceType.MobileBroadbandCdma: return "CDMA Broadband Connection"; case NetworkInterfaceType.MobileBroadbandGsm: return "GSM Broadband Connection"; case NetworkInterfaceType.MultiRateSymmetricDsl: return "Multi-Rate Symmetrical DSL"; case NetworkInterfaceType.None: return "None"; case NetworkInterfaceType.Ppp: return "PPP"; case NetworkInterfaceType.PrimaryIsdn: return "Primary ISDN"; case NetworkInterfaceType.RateAdaptDsl: return "Rate Adapt DSL"; case NetworkInterfaceType.Slip: return "Slip"; case NetworkInterfaceType.SymmetricDsl: return "Symmetric DSL"; case NetworkInterfaceType.TokenRing: return "Token Ring"; case NetworkInterfaceType.Tunnel: return "Tunnel"; case NetworkInterfaceType.Unknown: return "Unknown"; case NetworkInterfaceType.VeryHighSpeedDsl: return "Very High Speed DSL"; case NetworkInterfaceType.Wireless80211: return "Wireless"; default: return "Unknown"; } } Lthat, hogy hlzati s kapcsolati informcikat a Mango frisststl nagyon egyszeren lekrdezhetnk. Ezzel egytt az is elmondhat, hogy a System.Net.NetworkInformation ilyen tren elavult, s mr sokkal clszerbb a hlzati informcik meghatrozsra a Microsoft.Phone.Net.NetworkInformation nvteret hasznlni. MSDN Cikk

19 | O l d a l

Navigci
A Windows Phone 7 esetben Page-based (lap alap) navigci modellrl beszlnk. Hasonl a modell, mint a HTML-nl. Minden oldal egy egyedi URI cmmel rendelkezik, s ugyangy minden oldal llapotmentes! Amikor teht egy msik oldalra naviglunk az adott oldalbl, egy j pldny jn ltre. Na de nzzk meg ezt egy l pldn keresztl! 1. Hozzunk ltre egy j Windows Phone 7 projektet! 2. Adjunk hozz egy j oldalt: Add -> New Item -> Windows Phone Portrait Page! Az oldal neve legyen Second.xaml! Ezt az oldalt mdostsuk tetszsnk szerint. rjuk t a PageTitle-t Secondary-re stb! Csak hogy lssuk, hogy ez egy msik oldal. 3. Trjnk vissza a MainPage-re, s dobjunk fel a felhasznli felletre egy gombot! A gomb neve legyen btnNavigation, a felirata pedig a Navigci! 4. Kattintsunk ktszer a gombra, ezzel betltjk a gomb alaprtelmezett

esemnyvezrljt. A btnNav klikk esemnynek trzsbe rjuk a kvetkezt: private void btnNav_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/Second.xaml", UriKind.RelativeOrAbsolute)); } 5. Indtsuk el az alkalmazst, s prbljuk ki! Ebben az esetben a NavigationService Navigate metdust hvtuk meg. Ennek egy URI objektumot kell megadnunk: a Second.xaml a msik oldal neve. Arra figyeljnk oda, hogy ha mappba van rendezve az oldal, akkor az tvonalban szerepelni kell a mappa nevnek is, ahol keresheti! Tovbbi informcikat a Windows Phone fejleszts lpsrl lpsre knyv harmadik fejezetben olvashat. MSDN Cikk

20 | O l d a l

Navigci Paramter tadsa


Jogosan merlhet fel a krds, hogy ha Page-based navigcis modellt hasznl a Windows Phone, akkor hogy adhatunk t paramtereket egyik oldalrl a msiknak. Egyfell van egy query sztringes megolds is, ugyanolyan, mint a honlapok esetn. Ez az knny megadsi mdszer, egyszerbb esetekben clszer ezt hasznlni. A menete a kvetkez: 1. Hozzunk ltre egy j Windows Phone 7 alkalmazst! 2. Adjunk hozz egy j oldalt: Add -> New Item -> Windows Phone Portrait Page! Az oldal neve legyen Second.xaml! 3. Trjnk vissza a MainPage-re, majd a MainPage-re dobjunk fel egy TextBoxot s egy gombot! A Textbox neve legyen txtName, a Text tulajdonsga pedig res legyen! A gomb neve legyen a btnLogin, a Content tuldjosga pedig Bejelentkezs! 4. Kattintsunk a Bejelentkezs gombra ktszer s az esemny trzsbe rjuk a kvetkezt: private void btnLogin_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/Second.xaml?username="+ txtName.Text, UriKind.Relative)); } Lthat, hogy a paramtert az URI-ban adjuk t. Megadjuk a kulcsot, ami a krdjel utni szveg, majd az egyenlsgjel utn hozzfzzk a txtName tartalmt. 5. Ez eddig egyszer, viszont a fogad oldalt is fel kell ksztennk arra, hogy ezt a paramtert fogadja. Navigljunk el a Second.xaml.cs llomnyhoz, majd definiljuk fell az OnNavigatedTo metdust! protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); string userName = ""; if (NavigationContext.QueryString.TryGetValue("username", out userName)) { PageTitle.Text = userName; } } Ahhoz, hogy kinyerjk a paramter rtkt, a NavigationContext.QueryString.TryGetValue metdust hasznltuk. Indexer segtsgvel is lehetsges, de a TryGetValue az egyik legbiztonsgosabb mdja annak, hogy a paramter rtkt kinyerjk. Az els paramtere a 21 | O l d a l

kulcs, amit a navigcinl megadtunk. Fontos, hogy ez megegyezzen az eredeti kulccsal! Ha elrs trtnik, nem kapja meg az rtkt a userName sztring, ami egy out paramter. A TryGetValue egy boolen rtkkel tr vissza. Ha sikerlt rtket kivennie, akkor az rtke true, azaz az elgazsban lefutnak a kdok. Jelen esetben a PageTitle szvege az lesz, amit a paramterben tadtunk. Lthatjuk, hogy paramtert tadni nem bonyolult, viszont mi van akkor, ha komplex objektumot, esetleg listkat kellene tadnunk? Akkor ez a megolds egyfell knyelmetlen, msfell tl komplex s krlmnyes lehet. Ennek kikszblsre a ksbbiekben lthatjuk azt is, hogy lehet komplex objektumot tadni.

22 | O l d a l

Navigci Objektum tadsa


Gyakori eset, hogy nemcsak egy egyszer szveget szeretnnk paramternek tadni, hanem valamilyen sszetett objektumot. Megolds termszetesen erre is van. Ilyenkor a kvetkezt tehetjk: Megnyitjuk az App.xaml.cs llomnyt, s ltrehozunk egy egyszer tulajdonsgot (a tulajdonsg tpusa tetszlegesen komplex lehet), ebben a pldban ez egy szn lesz. public Color MyFavColor { get; set; } Ha ezt a tulajdonsgot vltoztatni szeretnnk egy oldalrl, akkor azt a kvetkezkppen tehetjk meg: (Application.Current as App).MyFavColor = Colors.Red; Ha csak az rtkt szeretnnk lekrdezni: Color myColor = (Application.Current as App).MyFavColor; sszetettebb objektumok tadsa esetn clszer ezt a mdszert hasznlni, mint indexek tadst a msik oldalnak.

23 | O l d a l

Back button
Minden Windows Phone 7 kszlk 3 fizikai gombbal rendelkezik: a vissza (Back), a Start (Windows) s a keress (Search) gombbal. Navigci sorn gyakran hasznljuk a vissza gombot, de ennek a funkcionalitst akr kdbl is megtehetjk. Ehhez a NavigationService GoBack metdust hasznlhatjuk fel. private void btnBack_Click(object sender, RoutedEventArgs e) { NavigationService.GoBack(); } Arra is van lehetsgnk, hogy az alkalmazsunkban figyeljk, hogy a felhasznl a Back gombra nyomott-e. Ehhez fel kell iratkoznunk a PhoneApplicationPage BackKeyPressed esemnyre (XAML-ben vagy C# kdbl): <phone:PhoneApplicationPage ... BackKeyPress="PhoneApplicationPage_BackKeyPress"> Az esemnykezelben ilyenkor sajt logikt helyezhetnk el. Megtehetjk, hogy a Back gomb rvnyessgt vesztse. Pldul: Az alkalmazsunkban lehet vsrolni, s egy varzsl segtsgvel oldalrl oldalra lpegetnk, majd ha megtrtnt a vsrls, nem szeretnnk engedlyezni a felhasznlnak, hogy visszafel haladjon, a vsrls lpseit mg egyszer vgigjrva (mg egyszer fizessen ugyanazrt a termkrt, stb). Ilyenkor a CancelEventArge Cancel tulajdonsgt true-ra kell lltani. Ezzel megakadlyoztuk a vissza gomb valdi hasznlatt (ms egyedi funkcit is illeszthetnk r). private void PhoneApplicationPage_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true; }

24 | O l d a l

Telefonhvs indtsa
Ebben a fejezetben Task-okkal s Chooser-ekkel fogunk foglalkozni. Tulajdonkppen mindegyik hasznlata egy kaptafra megy, legfeljebb a tulajdonsgok nevei lesznek jdonsgok egy-egy pldnl. Kezdjk pldnkat a telefonhvs indtsval! Lehetsgnk van arra, hogy sajt alkalmazsunkbl telefonhvst kezdemnyezznk, mgpedig a Microsoft.Phone.Tasks nvtr PhoneCallTask osztllyal. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A felhasznli felletre dobjunk fel egy HyperLinkButton-t, melynek a neve legyen hlbCall, a Content tuljadonsgnak most egy vals telefonszmot, a +36702823468 at adjuk meg! 3. Kattintsunk ktszer a hyperlinkbutton-ra, s az esemny vezrljbe rjuk a kvetkezt: PhoneCallTask phoneCall = new PhoneCallTask(); phoneCall.PhoneNumber = hyperlinkButton1.Content.ToString(); phoneCall.DisplayName = "Livesoft Kft."; phoneCall.Show(); 4. Ne feledjk feloldani a Microsoft.Phone.Tasks nvteret! A telefonhvs indtshoz ktelez megadnunk a hvand telefonszmot. Ezt a PhoneNumber tulajdongnl tesszk meg. Opcionlisan megadhatunk egy megjelentend nevet (Display Name tulajdonsg). A Show() metdus elindtja a task-ot, 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.

25 | O l d a l

SMS-klds
Lehetsgnk van SMS-t kldeni a WP7-es alkalmazsunkbl, ehhez is egy Lunchert tudunk felhasznlni. A kvetkez pldban egy olyan alkalmazst fogunk elkszteni, ami a Budapesti SMSparkolst knnyti meg. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. Dobjunk fel egy Textblock-ot a felletre, melynek neve txtPreNum, a Text tulajdonsga a 0670810, a FontSize 42 az InputScope pedig number legyen! (Ezzel a telefonszm eltaggal kezddnek a budapesti parkol SMS kzpontok telefonszmai. Most nem figyelnk arra, hogy 20-as 30-as vagy 70-es a telefonszm. Kln feladatban belltsknt megadhat, vagy lekrdezhet a jelenleg hasznlt hlzat alapjn.) 3. A Textblock mell dobjunk fel egy textbox-ot, melynek neve txtPostNum legyen, a Text tulajdonsga pedig res! 4. Al dobjunk fel egy textblock-ot, melynek text tulajdonsga legyen a Rendszm:! 5. Mell helyezznk el egy TextBox-ot, melynek neve a txtPNumber, a Text tulajdonsga pedig res! 6. Vgl egy button-t is dobjunk fel a felhasznli felletre, melynek neve btnSend, a Content tulajdonsga pedig Klds legyen! 7. Az alkalmazsunk lelke a klds gomb esemnyvezrljben lesz. Kattintsunk ktszer a klds gombra, ezzel feliratkozunk a gomb klikk esemnyre. 8. Oldjuk fel a Microsoft.Phone.Tasks nvteret: using Microsoft.Phone.Tasks; 9. A btnSend trzsbe pedig rjuk a kvetkezt: private void btnSend_Click(object sender, RoutedEventArgs e) { SmsComposeTask smsTask = new SmsComposeTask() { To = txtPreNum.Text + txtPostNum.Text, Body = txtPNumber.Text }; smsTask.Show(); } A kdban nem ellenriztk, hogy az adatok, amiket a felhasznl megadott, helyesek-e s megfelel formtumban vannak-e, ezrt ez most nll feladat. 26 | O l d a l

Ha elindtjuk az alkalmazst, majd kitltve a helyes adatainkkal a klds gombra nyomunk, akkor felugik a Windows Phone 7-bl jl ismert SMS-klds ablak. A felhasznlnak manulisan el kell kldeni az zenetet! Programkdbl mi ezt nem tehetjk meg (rtelemszeren, hogy rosszindulat vagy helytelen mkds esetn ne generlhassunk plusz kltsget a felhasznlnak). Arrl nem kapunk rtestst, hogy a felhasznl valban elkldte-e az zenetet. Ha el is kldjk, az alkalmazs nem vlt vissza, hanem ott maradunk az SMS-kld ablakban. Csak a Back (<-) gomb megnyomsval trhetnk vissza az alkalmazsunkhoz. MSDN Cikk

27 | O l d a l

E-mail kldse
Ahhoz, hogy az alkalmazsunkbl levelet kldjnk, az EmailComposeTask-ot kell hasznlnunk. Viszont figyeljnk arra, hogy ez a mvelet emultorbl nem fog mkdni, ugyanis ahhoz, hogy zenetet kldjnk, egy belltott e-mail fikkal kell rendelkeznnk, az emultor pedig cskkentett funkcionalitssal rendelkezik, s alapbl ezt nem tehetjk meg. Ha megprblnnk zenetet kldeni, akkor a fenti hibazenetet kapnnk. gy teht ezt a funkcit csak telefonra teleptve tudjuk majd kiprblni. A kvetkez feladatban egy support zenetkld oldalt ksztnk el. A clja az lesz, hogy a felhasznl elmondja, mi a problmja, vagy pp mennyire j az alkalmazsunk. Ezt az zenetet elkldi szmunkra e-mailben. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A felhasznl fellet LayoutRoot grid-jnek bal fels sarkba dobjunk fel egy textblock-ot, amelynek a felirata legyen az zenet szveg! 3. Al helyezznk el texbox-ot! Ennek adjunk egy viszonylag nagy mretet, s a Text tulajdonsgt trljk! 4. A jobb als sarokba dobjunk fel mg egy gombot! A gomb neve legyen a btnSend, a Content-je pedig a Klds felirat legyen! 5. Kattintsunk ktszer a Klds gombra! Miutn a Visual

Studio tvltott a kdnzetbe, oldjuk fel a Microsoft.Phone.Tasks nvteret: using Microsoft.Phone.Tasks; 6. A btnSend esemny vezrljbe rjuk a kvetkezt: private void btnSend_Click(object sender, RoutedEventArgs e) { EmailComposeTask emailTask = new EmailComposeTask() { To = "info@livesoftkft.com", Subject = "[SUPPORT]", Body = txtMsg.Text }; emailTask.Show(); } 7. Kszen is vagyunk. Indtsuk el az alkalmazst s prbljuk ki!

28 | O l d a l

Web oldal betltse


Ha az alkalmazsunkban van pldul egy URL cm, amit meg szeretnnk jelenteni, megtehetjk vagy a WebBrowser vezrlvel, vagy ha ez szmunkra felesleges, akkor magt a telefonba beptett bngsz felletet is alkalmazhatjuk. A WebBrowserTask-ot hasznlhatjuk fel erre a clra: 1. Hozzunk ltre egy j Windows Phone 7 alkalmazst! 2. Helyezznk el a felletn egy HyperLinkButton-t, melynek Content-je legyen pldul a http://devportal.hu, a neve pedig hlbLink! 3. Kattintsunk ktszer a hyperlinkbutton-ra, s miutn tvltott a Visual Studio kdnzetbe, oldjuk fel a Microsoft.Phone.Task nvteret: using Microsoft.Phone.Tasks; 4. Ezt kveten az esemny trzsbe rjuk a kvetkez kdsorokat: private void hlbLink_Click(object sender, RoutedEventArgs e) { WebBrowserTask webTask = new WebBrowserTask(); webTask.Uri = new Uri(hlbLink.Content.ToString(), UriKind.Absolute); webTask.Show(); } A WebTask-nak kt tulajdonsga van: az egyik az URI, a msik az URL. rtelemszeren itt kell megadni a webcmet, ahova a bngsz a ksbbiekben elnavigl. Azt viszont rdemes tudni, hogy az URL tulajdonsg mr elavult, gy ne hasznljuk! Ha elindtjuk az alkalmazst, s rkattintunk a HypetLinkButton-ra, akkor a kvetkezket tapasztalhatjuk: 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 ksznheten teljes HTML 5 tmogatssal rendelkezik, gy a generlt oldal teljesen megegyezik a szmtgpeken megszokottal. Nhny msodpercet kveten megjelenik a vrt eredmny. MSDN Cikk

29 | O l d a l

Mdiatartalom lejtszsa
Ha mdiatartalmakat szeretnnk lejtszani, akkor felhasznlhatjuk a kszlk mdialejtszjt. Mind az auditartalmat, mind a videtartalmat le tudjuk jtszani. A mdia forrsa lehet loklis, de akr tvoli is. Loklis mdiaforrs esetn az Isolated Storage-n trolt mdia fjl tvonalt kell megadnunk. A MediaPlayerLauncher hasznlata nagyon egyszer. Meg kell adnunk a mdiafjl tvonalt, majd meg kell hvnunk a Show metdust. Ha meg szeretnnk jelenteni a mediaplayer controlokat, akkor a Controls tulajdonsggal bellthatjuk, hogy mik jelenhetnek meg. Nzznk egy egyszer pldt: MediaPlayerLauncher mpLauncher = new MediaPlayerLauncher(); mpLauncher.Location = MediaLocationType.Data; mpLauncher.Controls = MediaPlaybackControls.All; mpLauncher.Media = new Uri(@"http://mschannel9.vo.msecnd.net/o9/mix/09/wmv/key01.wmv", UriKind.Absolute); mpLauncher.Show(); Ha ezt a kdsort lefuttatjuk, mris indul a vide.

MSDN Cikk

30 | O l d a l

Keress a weben
Lehetsgnk van arra, hogy a Windows Phone 7 alaprtelmezett keresjt (Bing) alkalmazva kereshessnk a weben. Ezt az alkalmazsunkbl is meghvhatjuk, ehhez a SearchTask osztlyt kell segtsgl hvni. sszesen egy tulajdonsga van, a SearchQuery, ennek kell megadnunk a keressi kifejezst, majd meg kell hvnunk a Show metdust. Lssuk kdbl is: SearchTask search = new SearchTask(); search.SearchQuery = "Serj Tankian"; search.Show(); Az eredmny:

MSDN Cikk

31 | O l d a l

Kamera hasznlata
Ha az alkalmazsunkbl kpet szeretnnk kszteni, a CameraCaptureTask-ot hvhatjuk segtsgl. Ilyenkor a Windows Phone 7 beptett s megszokott felhasznli fellete fogadja a felhasznlt. Elksztheti a fott, majd ha ksz, s az accept gombot is megnyomtuk, visszatrnk az alkalmazshoz, ahol aztn tovbbi fotmveletet is elvgezhetnk. Nzznk erre is egy egyszer s gyors pldt! 1. Ksztsnk egy j Windows Phone 7 alkalmazs projektet! 2. A felhasznli felltre elszr dobjunk fel egy gombot, a gomb neve legyen btnPhoto, a Content tulajdonsga pedig legyen a Fot ksztse szveg (nveljk meg a mrett a gombnak, hogy a szveg elfrjen)! 3. A gomb al helyezznk el mg egy image-vezrlt is, melynek mrete tltse ki minl inkbb a rendelkezsre ll felhasznli felletet! Az image-vezrl neve legyen az imgPhoto! 4. Kattintsunk ktszer a btnPhoto gombra! Miutn tvltott a Visual Studio kdnzetbe, oldjuk fel a kvetkez kt nvteret: using Microsoft.Phone.Tasks; using System.Windows.Media.Imaging; 5. A btnPhoto klikk esemnyt az elzekben mr ltrehoztuk. Az esemny trzsben pldnyostsuk a CameraCaptureTask osztlyt! Iratkozzunk fel a Completed esemnyre, majd hvjuk meg a Show metdust. A Completed esemny akkor kvetkezik be, ha sikerlt a fot elksztse, s a felhasznl elfogadta azt. private void btnPhoto_Click(object sender, RoutedEventArgs e) { CameraCaptureTask camTask = new CameraCaptureTask(); camTask.Completed += new EventHandler<PhotoResult>(camTask_Completed); camTask.Show(); } 6. A Completed esemnyre ugyan feliratkoztunk, de mg nem rtuk meg Completed trzst. Itt megvizsgljuk, hogy a TaskResult az OK-e, azaz a felhasznl valban ksztett-e kpet s elfogadta-e azt. Ha ez gy van, akkor ksztnk egy BitmapImage objektumot, s a SetSource metdusban tadjuk a fot Streamjt (ChoosenPhoto). Utols lpsknt az Image kontrol Source tulajdonsgnak tadjuk ezt a bitmapImage-t, ami pedig megjelenti. void camTask_Completed(object sender, PhotoResult e) { if (e.TaskResult == TaskResult.OK) { 32 | O l d a l

BitmapImage bmp = new BitmapImage(); bmp.SetSource(e.ChosenPhoto); imgPhoto.Source = bmp; } } 7. Indtsuk el az alkalmazst, s prbljuk ki! Br fizikai kszlken a legidelisabb kiprblni, az emultor ad azrt alternatvt a kiprblsra. Az emultor esetn egy tglalap szik krbe a kijelzn, s azt fotzhatjuk le, majd jelenthetjk meg az image kontrolban.

Br a Windows Phone 7 Mango frisststl van arra is lehetsg, hogy direkt mdon elrjk a kamert, ha a feladat nem kveteli meg, akkor sokszor clszerbb inkbb a CameraCaptureTask-ot hasznlni, hisz ezt a felhasznl mr jl ismeri, s plusz funkcionalitssal is rendelkezik. MSDN Cikk

33 | O l d a l

Photo Library elrse


Lehetsgnk van arra, hogy elrjk a telefonunk mdiaknyvtrt, s onnan vlasszunk fott, amit hasznlni szeretnnk (ez pldul egy fotmanipulcis alkalmazsnl elengedhetetlen), st, meghatrozhatjuk azt is, hogy milyen mret kpre van szksgnk, gy ha a felhasznl nem megfelel mret kpet adna t a szmunkra, akkor ktelezhetjk annak levgsra. Ezenkvl rdemes megemlteni, hogy a PhotoChooserTask-ot hasznlva akr kpet is kszthetnk. Mindjrt meg is nzzk, hogy hogyan. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A felhasznli felltre elszr dobjunk fel egy gombot, a gomb neve legyen btnPhoto, a Content tulajdonsga pedig legyen a Kp kivlasztsa szveg (nveljk meg a mrett a gombnak, hogy a szveg elfrjen)! 3. A gomb al helyezznk el mg egy image-vezrlt is, melynek mrete tltse ki minl inkbb a rendelkezsre ll felhasznli felletet! Az image-vezrl neve legyen az imgPhoto! A vezrl Width tulajdonsga legyen 450, a Height pedig 200! 4. Kattintsunk ktszer a btnPhoto gombra. Miutn tvltott a Visual Studio kdnzetre, oldjuk fel a kvetkez kt nvteret: using Microsoft.Phone.Tasks; using System.Windows.Media.Imaging; 5. A btnPhoto klikk esemnyt az elzekben mr ltrehoztuk. Az esemny trzsben pldnyostsuk a PhotoChooserTask osztlyt! A ShowCamera tulajdonsg segtsgvel megadhatjuk, hogy kszthetnk-e fott a PhostoChosser-bl, a PixelWidth tulajdonsgt pedig lltsuk be 450-re, s a PixelHeight tulajdonsgot 200-ra! A Completed esemnyre iratkozzunk fel, majd hvjuk meg a Show metdust! PhotoChooserTask photoChooser = new PhotoChooserTask(); photoChooser.ShowCamera = true; photoChooser.PixelWidth = 450; photoChooser.PixelHeight = 200; photoChooser.Completed += new EventHandler<PhotoResult>(photoChooser_Completed); photoChooser.Show(); 6. A Completed esemny trzst mg nem rtuk meg. Itt megvizsgljuk, hogy a TaskResult rendben van-e, azaz a felhasznl kivlasztott vagy ksztett-e kpet . Ha ez gy van, akkor ksztnk egy BitmapImage objektumot, s a SetSource metdusban tadjuk a fot Stream-jt (ChoosenPhoto). Utols lpsknt az Image kontrol Source tulajdonsgnak tadjuk ezt a bitmapImage-t, ami pedig megjelenti azt. void photoChooser_Completed(object sender, PhotoResult e) { 34 | O l d a l

if (e.TaskResult == TaskResult.OK) { BitmapImage bmp = new BitmapImage(); bmp.SetSource(e.ChosenPhoto); impPhoto.Source = bmp; } } 7. Indtsuk el az alkalmazst, s prbljuk ki, hogyan is mkdik! Nzzk meg az eredmnyt kpekben:

MSDN Cikk

35 | O l d a l

Telefonszm mentse
Chooser segtsgvel lehetsgnk van arra, hogy egy adott telefonszmot az alkalmazsunkbl a kapcsolataink (Contacts) kz mentsnk. Termszetesen ehhez is a Microsoft.Phone.Tasks nvteret kell felhasznlnunk. using Microsoft.Phone.Tasks; A nvjegy mentshez a SavePhoneNumberTask-ot hvjuk segtsgl. Pldnyosts utn lthatjuk, hogy ennek az osztlynak rengeteg tulajdonsga van, amit kitlthetnk: nv, telefonszm, cg stb. Nhny informcit most megadunk, majd a completed esemnyre feliratkozunk, s legvgl meghvjuk a Show metdust. SaveContactTask sct = new SaveContactTask() { MobilePhone = "+36702823468", Company = "Livesoft Kft.", FirstName = "Attila", LastName="Turczy" }; sct.Completed += new EventHandler<SaveContactResult>(sct_Completed); sct.Show(); Ezt kveten megrjuk a Completed esemny trzst. Itt a felhasznlnak rtestst kldnk annak fggvnyben, hogy sikerlt-e a nvjegy mentse vagy sem. void sct_Completed(object sender, SaveContactResult e) { string msg = string.Empty; switch (e.TaskResult) { case TaskResult.Cancel: msg = "Nvjegy mentse megszaktva!"; break; case TaskResult.None: msg = "Nvjegy mentse NEM sikerlt!"; break; case TaskResult.OK: msg = "Nvjegy elmentve!"; break; } MessageBox.Show(msg, "Kapcsolat mentse", MessageBoxButton.OK); } MSDN Cikk

36 | O l d a l

Telefonknyv Nvjegy kivlasztsa


A PhoneNumberChooserTask ugyangy, mint az elbbi Chooser, szintn a Contacts alkalmazst nyitja meg, viszont ez mr adatot is szolgltat a hv alkalmazs szmra: a Completed esemnykezel msodik paramtere egy PhoneNumberResult tulajdonsg, amin keresztl elrhetjk a kivlasztott partner nevt s telefonszmt, viszont tovbbi informcikat ez a taszk mr nem szolgltat. Ha tovbbi informcikat szeretnnk lekrdezni, akkor ahhoz a Contacts osztlyt kell segtsgl hvnunk, ugyanis a Contacts osztly segtsgvel a telefonon trolt sszes nvjegyhez hozzfrhetnk. Nzznk erre egy rvid pldt: 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(); Az eredmny:

MSDN Cikk

37 | O l d a l

Figyelmeztetsek s riasztsok
A Windows Phone 7 Mango frisststl lehetsgnk van sajt riasztsok s emlkeztetk ksztsre. A riasztsok aktivlshoz nem kell folyamatosan hasznlni az alkalmazst, lezrhatjuk nyugodtan, hisz a riasztst a telefon temezje fogja elvgezni (ScheduledActionService). Nzznk egy rvid pldt arra, hogyan tudunk j figyelmeztetst kszteni! Ebben a nhny kdsorban egy autplya-matrica lejrst figyel alkalmazst szimullunk. Szksgnk lesz a Microsoft.Phone.Scheduler nvtrre: using Microsoft.Phone.Scheduler; j figyelmeztets hozzadsa: Alarm alarm = new Alarm("Autopalya"); alarm.Content = "Lejrt az autplya-matricjnak az rvnyessge!"; alarm.BeginTime = DateTime.Now.AddMinutes(1); ; alarm.Sound = new Uri("Springsteen.mp3", UriKind.Relative); ScheduledActionService.Add(alarm); Pldnyostjuk az Alarm osztlyt, amelynek tadunk egy nevet, de arra figyeljnk oda, hogy ennek a nvnek egyedinek kell lennie! A Content tulajdonsgnl megadunk egy zenetet, amit majd a figyelmeztetsben megjelentnk. A BeginTime-nl megadhatjuk, hogy a figyelmeztets mikor induljon. (Most nem tl vals a plda, hisz 1 perc alatt jr le az autplya-matricnk rvnyessge.) rdekessgknt rdemes megemlteni a Sound tulajdonsgot, ahol akr sajt zent / hangot is megadhatunk. Fontos megjegyezni, hogy ennek az mp3 fjlnak az alkalmazs mellett kell szerepelnie (Content)! Sajnos a Zune mdiaknyvtrbl nem adhatunk meg audi fjlt. Ha lejrt az id, akkor az albbi zenet fog minket fogadni, s elindul az mp3 fjl is, amit korbban megadtunk.

Ha valamilyen oknl fogva el szeretnnk tvoltani a figyelmeztetst, akkor azt a ScheduledActionService.Remove metdusval tudjuk megtenni. A metdusnak meg kell adnunk a figyelmeztets egyedi azonostjt (Name): 38 | O l d a l

ScheduledActionService.Remove("Autopalya"); Termszetesen van arra is lehetsg, hogy keressnk az temezsek kztt: var reminder = ScheduledActionService.Find("Autopalya"); if (reminder != null && reminder.IsScheduled == false) { }

39 | O l d a l

GPS Koordintk lekrdezse


Minden Windows Phone 7 kszlk rendelkezik GPS szenzorral, gy sajt alkalmazsunkbl lekrdezhetjk a jelenlegi pozcinkat is. J tudni, hogy amikor helymeghatrozst szeretnnk hasznlni, elszr a cella s a wifi informcikat hasznlva fel pozicionl minket, ugyanis ez gyorsabb s energiatakarkosabb, mint a GPS hasznlata, viszont sokkal pontatlanabb. Nzznk egy egyszer pldt, hogyan rhetjk el az alkalmazsunkbl a GPS informcikat! 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. Dobjunk fel a felhasznli felletre 6 db TextBlock-ot, a nevei sorban legyenek a kvetkezk: tbLat, tbLong, tbHorAccu, tbVerAccu, tbTimeStamp, tbSpeed, a Text tulajdonsga pedig legyen egy (ktjel)! Az elrendezsk nem lnyeges. 3. A projektnknek szksge lesz a System.Device.dll-re.

Kattintsunk a Solution Explorer-ben a References-re jobb egrgombbal, majd vlasszuk ki az Add Reference menpontot! A megjelen ablakban vlasszuk ki a .NET flet, majd keressk ki a System.Device-t, vlasszuk ki, majd kattintsunk az OK gombra! 4. Nyissuk meg a MainPage.xaml.cs fjlt, s oldjuk fel a System.Device.Location nvteret: using System.Device.Location; 5. Most, az egyszersg kedvrt, a konstruktorban hozzunk ltre egy GeoCoordinteWatcher pldnyt, aminek a pontossgt most lltsuk High-ra! Ezt kveten feliratkozunk a PositionChanged esemnyre, hogy rtesljnk, hogy trtnt-e a pozciban valamilyen vltozs, valamint legvgl meghvjuk a Start metdust, s ezzel elindul a GPS szenzor (stop metdussal lelltjuk). public MainPage() { InitializeComponent(); GeoCoordinateWatcher gcw = new GeoCoordinateWatcher(GeoPositionAccuracy.High); gcw.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(gcw_PositionChange d); gcw.Start(); }

40 | O l d a l

6. Egy dolog maradt htra: meg kell rnunk a PositionChanged esemny trzst. Mivel most nem hasznltunk fel trkpet, gy csak kiratjuk a jelenlegi adatokat egy-egy textblock-ba. void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { tbLat.Text = e.Position.Location.Latitude.ToString(); tbLong.Text = e.Position.Location.Longitude.ToString(); tbHorAccu.Text = e.Position.Location.HorizontalAccuracy.ToString() + " m"; tbVerAccu.Text = e.Position.Location.VerticalAccuracy.ToString() + " m"; tbTimeStamp.Text = e.Position.Timestamp.DateTime.ToLongDateString(); tbSpeed.Text = e.Position.Location.Speed.ToString(); ; } 7. Ezzel tulajdonkppen ksz is vagyunk. Indtsuk el az alkalmazst! A helymeghatrozst hasznl alkalmazsokat clszer fizikai kszlkeken tesztelni, de ha ppen nincs kznl egy, a 7.1-es SDK-tl erre is van lehetsgnk emultorbl. 8. Miutn elindult az alkalmazs, kattintsunk az emultor mellett tallhat toolbar-on a dupla nylra, s az Additional Tools ablak location fln helyezznk el pontokat! Majd ha megvan, kattintsunk a play gombra, s mris szimullva van a koordintk vltozsa.

Lthat, hogy a GPS szenzor kezelse nagyon egyszer, s ha nincs fizikai kszlknk, most mr kiprblhat emultorbl is.

41 | O l d a l

BingMaps vezrl hasznlata


Ahhoz, hogy a BingMaps szolgltatst hasznljuk, szksgnk lesz egy ApplicationKey-re. Ezt brki ingyenesen krhet a BingMaps Portlon (a felhasznli feltteleket felttlenl olvassuk el!). A BingMaps kontrol hasznlata rendkvl egyszer. Nzznk is egy gyors pldt! 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A Layoutroot elrendezs vezrlre dobjunk fel egy Mapvezrlt a toolbox-rl! Ezt clszer a toolbox-rl feldobni, ugyanis ilyenkor automatikusan nvteret behzza is. a Microsoft.Phone.Controls.Maps valahogy gy nz ki: <my:Map Margin="6" Name="map1"/> 3. Ugyan elkezdhetjk hasznlni a vezrlt, de Bingmaps vezrln megjelenik egy figyelmeztets, hogy nem megfelelek a hitelest adatok (Invalid Credentials). A Bingmaps portlrl krt application key-t adjuk meg a szmra, ezt a CredentialsProvider tulajdonsgnl tehetjk meg. <my:Map Margin="6" Name="map1" CredentialsProvider="AnY59ktyRJ-7g-" Maps vezrlt, s a figyelmeztets is eltnik. 4. Most mg csak a Bing Maps jelenik meg. Azt, hogy hol jelenjen meg, a meg. Center Ez tulajdonsg egy megadsval tpus hatrozhatjuk GeoCordinate /> XAML-ben

Ha ezt megtettk, mr jogszeren hasznlhatjuk a Bing

tulajdonsg. A pozci ugyan megvan, de azt is meg kell hatroznunk, hogy mennyire legyen rkzeltve az adott pontra. A kvetkez XAML lers egy Budapest belvrosban lv pontot fog megjelenteni. <my:Map Margin="12,0,0,12" Name="map1" CredentialsProvider="AnY59ktyRJ-7g-m_yDX1ZpiAvAR5EQ3SjX..." Center="47.4753, 019.0552" ZoomLevel="15"/> 5. Ha emultoron teszteljk az alkalmazst, clszer megjelenteni a ZoomBar-t. Ezt a ZoomBarVisibility tulajdonsggal tehetjk meg. ZoomBarVisibility="Visible"

42 | O l d a l

6. Magt a trkpet kt klnbz mdban hasznlhatjuk: RoadMode s ArialMode. Utbbi a mholdkp-vltozat, elbbi az alaprtelmezett trkpnzet. Hogy melyik mdon jelenjen meg a trkp, azt a Mode tulajdonsggal tudjuk befolysolni. C# kdbl: using Microsoft.Phone.Controls.Maps; map1.Mode = new AerialMode(); XAML-bl: <my:Map Margin="6" Name="map1" CredentialsProvider="AnY59ktyRJ-7g-m_yDX1ZpiAvAR5EQ3SjX3WqDl" Center="47.4753, 019.0552" ZoomLevel="15" ZoomBarVisibility="Visible"> <my:Map.Mode> <my:AerialMode /> </my:Map.Mode> </my:Map> 7. Mg kt tulajdonsgot rdemes ismerni: az egyik a LogoVisibility, a msik a CopyRightVisibility. Az elbbivel a Bing logt tntethetjk el a bal sarokbl, mg az utbbival a CopyRight informcikat a jobb sarokbl. Ezt ltalban meg is szoktuk tenni. Plusz informcit a vgfelhasznl szmra nem tl sokszor hordoznak ezek az adatok. CopyrightVisibility="Collapsed" LogoVisibility="Collapsed" nll feladat: krdezzk le a jelenlegi GPS koordintnkat, s a Bing Maps kzppontjnak adjuk meg! Ha mozgunk, a Bing Maps trkpnek a kzppontja is mdosuljon!

43 | O l d a l

BingMaps PushPinek
POI (Path Overhead Indicator) informcikat is elhelyezhetnk a BingMapson. Erre hasznlatosak a PushPinek. Nagyon egyszer a kezelsk, gyakorlatilag a pont koordintjt s a content-et kell megadnunk a szmra, s mris megjelenik a trkpen. Az elz feladatot folytatva a trkpet most kiegsztjk nhny pushpin-nel. Elszr nzzk meg, hogyan hogy lehet egy pushpin-t XAML-ben hozzadni. <my:Pushpin Location="47.4746,019.0498" Content="Allee Bevsrlkzpont" /> Ez nagyon egyszer, de legtbbszr a PushPin-eket dinamikusan C# kdbl szoktuk a trkphez adni. Ebben az esetben a Map-vezrl gyermek elemhez kell adnunk egy Pushpin pldnyt. A Pushpin-nek ugyangy a content s a Location tulajdonsgt kell megadni. A Location GeoCordinate tpus (System.Device.Location). map1.Children.Add( new Pushpin() { Content = "Evosoft Hungary Kft", Location = new System.Device.Location.GeoCoordinate(47.4683, 019.0522) }); Az eredmny ennek megfelelen egy trkp, ahol mind a kt POI megjelenik.

Amit viszont szrevehetnk, hogy a POI-nak van egy alaprtelmezett megjelentse. Termszetesen ennek a sablonjt is megvltoztathatjuk (akr tma szinten is). Nzznk egy gyors pldt arra, hogyan vltoztathatjuk meg a PushPin kinzett. A bevsrlkzpont most egy Logo-t is kap: <my:Pushpin Location="47.4746, 019.0498" Background="Transparent"> <StackPanel> <TextBlock Text="Alle bevsrlkzpont" /> <Image Source="allee.jpg" Width="48" Height="48" /> </StackPanel> </my:Pushpin> Lthat, hogy nagyon egyszer POI pontokat a trkphez adnunk, st, ha testre akarjuk szabni, azt a mr megszokott egyszersggel megtehetjk.

44 | O l d a l

tvonaltervezs
A trkpen kvl egyb hasznos szolgltatst is knl szmunkra a Microsoft, ezeket a funkcikat szabvnyos web szolgltatson keresztl rhetjk el. Geocode Service Cmek, nevezetes helyek, fldrajzi nevek keresse, koordintkk alaktsa vagy koordintk alapjn ezek kinyerse. http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc Route Service tvonalak tervezse az 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). http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc Search Service Nevezetes helyek, pldul ttermek, mozik keresse ez pozcihoz is kthet. http://dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc Nzznk az tvonaltervezsre egy pldt! 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A felhasznli felletre dobjunk fel egy gombot, a gomb neve legyen a btnRoute, a Content-je az tvonaltervezs legyen! 3. A felhasznli felletre dobjunk fel egy Map vezrlt (ha feldobjuk a megfelel nvteret automatikusan betlti). llitsuk be a CredentialsProvider-nl az API keynket, a Centert-t s a Zoom Level szintet! A Map-re dobjunk fel mg kt PushPin-t, ezenkvl lesz egy MapPolyLine is, ez fogja reprezentlni majd az tvonalat. A XAML a kvetkezkppen fog kinzni: <my:Map Margin="0,70,12,6" Name="map1" CredentialsProvider="AnY59ktyRJ-7g..." Center="47.4753, 019.0552" ZoomLevel="15" ZoomBarVisibility="Visible" CopyrightVisibility="Collapsed" LogoVisibility="Collapsed"> <my:MapPolyline Name="lRoute" Stroke="Red" Opacity="0.7" StrokeThickness="8" /> <my:Pushpin Location="47.4746, 019.0498" Content="Allee 45 | O l d a l

Bevsrlkzpont" /> <my:Pushpin Location="47.4683, 019.0522" Content="Evosoft Hungary Kft." /> </my:Map> <Button Content="tvonal tervezs" Height="72" HorizontalAlignment="Left" Name="btnRoute" VerticalAlignment="Top" Width="243" Click="btnRoute_Click" /> 4. Kattintsunk ktszer az tvonal tervezse gombra, ekkor betltdik a kdnzet. 5. Kattintsunk a Solution Explorer-ben a References-re jobb egrgombbal, s vlasszuk ki az Add Service Reference menpontot!

6. A megjelen ablakban adjuk meg az tvonaltervez szolgltats cmt, majd kattintsunk a Go gombra! Ebben a pillanatban megprblja megtallni a szolgltatst. A Namespace neve legyen pldul RouteSzolg!

7. Oldjuk fel ennek a szolgltatsnak a nvtert, valamint tovbbi nvtereket is: using using using using [PROJECTNEVE].RouteSzolg; Microsoft.Phone.Controls.Maps; System.Collections.ObjectModel; System.Device.Location; (Ezt a konstruktor el helyezzk most)! private const string apkiKey = "AnY59ktyRJ-7g-..."; private readonly Credentials cred = new Credentials { ApplicationId = apkiKey }; 9. A btnReoute klikk esemnynek trzsben elszr pldnyostjuk a RouteServiceClient-et: RouteServiceClient rc = new RouteServiceClient();

8. Ksztsnk egy vltozt- a Credentials vltozt- s ehhez egy megfelel tulajdonsgot

46 | O l d a l

10. Ahhoz, hogy tvonalat tervezznk, meg kell hvnunk a CalculateRoute metdust, ami egy RouteRequest pldnyt ignyel, ezt viszont fel kell paramtereznnk. A RouteServiceClient pldnyostsa utn pldnyostsuk a RouteOptions nevezet osztlyt. Itt meghatrozzuk, hogy a pontok listjt hogyan kapjuk vissza: az tvonal gyors legyen, vegye-e figyelembe a forgalmi adatokat, valamint hogy gyalog vagy autval tervezze az tvonalat. Ebben az esetben a kvetkezkppen pldnyostjuk a RouteOptions-t: RouteOptions options = new RouteOptions() { RoutePathType = RoutePathType.Points, Optimization = RouteOptimization.MinimizeTime, TrafficUsage = TrafficUsage.TrafficBasedTime, Mode = TravelMode.Driving }; 11. Most adjuk meg a kiindulsi s a vgpontot! Ez egy Waypoint lista lesz: ObservableCollection<Waypoint> points = new ObservableCollection<Waypoint>() { new Waypoint { Location = new GeoCoordinate(47.4746, 019.0498) }, new Waypoint { Location = new GeoCoordinate(47.4683, 019.0522) } }; 12. Most mr megvannak a kezd- s a vgpont, valamint az tvonaltervezsi belltsok is. Itt az ideje elkszteni a RouteRequest pldnyt. Ennek meg kell adnunk a RouteOptions-t, Waypoints gyjtemny (kezd- s vgpont), valamint a Credentials-t (Application Key): RouteRequest request = new RouteRequest() { Credentials = cred, Options = options, Waypoints = points }; 13. Nincs ms htra, mint meghvni a szolgltatst, s feliratkozni a Completed esemnyre. Elszr iratkozzunk fel a CalculateRouteCompleted esemnyre: rc.CalculateRouteCompleted += new EventHandler<CalculateRouteCompletedEventArgs>(rc_CalculateRouteCompleted); 14. Ezt kveten hvjuk meg a szolgltatst, s adjuk t szmra a RouteRequest pldnyt! 47 | O l d a l

rc.CalculateRouteAsync(request);

15. Most mr csak az eredmny kirajzolsa van htra. rjuk meg a Completed esemny trzst: void rc_CalculateRouteCompleted(object sender, CalculateRouteCompletedEventArgs e) { LocationCollection lCollection = new LocationCollection(); foreach (var item in e.Result.Result.RoutePath.Points) { lCollection.Add(item); } lRoute.Locations = lCollection; // pozcionljuk a trkpet az tvonalra! map1.SetView(e.Result.Result.Summary.BoundingRectangle); } 16. Elkszlt az alkalmazsunk, indtsuk el, s prbljuk ki mkds kzben! 17. Amikor elindul az alkalmazs, kt POI pontot ltunk a trkpen. Ha rkattintunk az tvonal tervezse gombra, akkor egy webszolgltats krst indtunk. Amint megrkezik a vlasz, megkapjuk az idelis tvonalat a kt pont kztt. Az eredmny kpekben:

48 | O l d a l

Gyorsulsmr hasznlata
A Windows Phone 7-es kszlkkel lekrdezhetjk, hogy milyen irnyba hat a gyorsuls a telefonunkra (X, Y, Z koordintk mentn). Mint minden szenzor esetn, itt is fontos megvizsglnunk, hogy a kszlk tartalmazza-e az adott szenzort. Ezt az Accelerometer IsSupported statikus tulajdonsg lekrdezsvel tehetjk meg. A kvetkez feladatban egy olyan alkalmazst fogunk elkszteni, amely egy labdt fog megjelenteni a kijelzn. A labda gy s olyan gyorsan fog mozogni, mint amennyire a felhasznl a kszlket dnti. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A Layoutroot grid-et trljk ki, s helyezznk el a felhasznli felletre egy canvas-t! A Canvas-be rajzoljunk egy ellipszist (100 x 100 px), ennek adjunk egy sznt (mi most RadialGradientBrusht adtunk meg): <Canvas > <Ellipse Canvas.Left="66" Canvas.Top="100" Height="100" Name="ball" Stroke="Black" StrokeThickness="1" Width="100"> <Ellipse.Fill> <RadialGradientBrush> <GradientStop Color="#FFB6BAA5" Offset="0" /> <GradientStop Color="Red" Offset="1" /> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> </Canvas> 3. Ezt kveten a referencikhoz adjuk hozz a Microsoft.Devices.Sensors-t, s a Microsoft.XNA.Framework assembly-t! Solution Explorer-ben klikkeljnk jobb egrgombbal, s a References-en a megjelen helyi menbl vlasszuk ki a Microsoft.Devices.Sensors-t,valamint a Microsoft.XNA.Framework assembly-t, s kattintsunk az OK gombra! 4. Oldjuk fel a Microsoft.Devices.Sensor, s a Microsoft.XNA.Framework nvtereket: using Microsoft.Devices.Sensors; using Microsoft.Xna.Framework; 5. A konstruktor eltt hozzunk ltre egy Accelometer-t, a pldnyostst majd csak a konstruktorban hozzuk ltre! Accelerometer acMeter = null; 6. A konstruktorban ellenrizzk, hogy valban van-e ilyen szenzor, s ha van, akkor pldnyostsuk ezt az osztlyt, s iratkozzunk fel a CurrentValueChanged esemnyre,

49 | O l d a l

hogy rtesljnk a gyorsulssal kapcsolatos vltozsokrl! A Start metdus meghvsa utn szleljk a vltozsokat. public MainPage() { InitializeComponent(); if (Accelerometer.IsSupported) { acMeter = new Accelerometer(); acMeter.CurrentValueChanged += new EventHandler<SensorReadingEventArgs<AccelerometerReading>>(acMeter_CurrentV alueChanged); acMeter.Start(); } else { MessageBox.Show("A kszlkben nincs gyorsulsmr a kszlkben!"); } } 7. Termszetesen meg kell rnunk a CurrentValueChanged esemny trzst is. Elszr lekrdezzk a labda jelenlegi pozcijt, majd a szenzor ltal meghatrozott adatokat beszorozzuk 10-zel (gyorstunk rajta). Ezt kveten van egy egyszer (m nem teljesen pontos) ellenrzsi pont, ahol ellenrizzk, hogy a labda ne hagyja el a kijelzt, vgl megadjuk a labda j pozcijt. Ehhez a Dispatcher.BeginInvoke-ot hasznltuk, ugyanis a gyorsulsmr esemnye egy httrszlon fut. Ahhoz, hogy hozzfrjnk a felhasznli fellethez ebbl a szlbl, kell a Dispatcher. void acMeter_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) { Dispatcher.BeginInvoke(() => { double newLeft = (double)ball.GetValue(Canvas.LeftProperty) + e.SensorReading.Acceleration.X * 10; double newTop = (double)ball.GetValue(Canvas.TopProperty) + e.SensorReading.Acceleration.Z * 10; if (newLeft < 0) newLeft = 0; else if (newLeft > 400) newLeft = 400; if (newTop < 0) newTop = 0; else if (newTop > 700) newTop = 700; ball.SetValue(Canvas.LeftProperty, newLeft); ball.SetValue(Canvas.TopProperty, newTop); }); } 8. Indtsuk el az alkalmazst, s prbljuk ki mkds kzben! A Windows Phone 7.1 SDK-tl emultorban is kiprblhat, de ha szenzort hasznlunk, akkor minden esetben prbljuk ki egy fizikai kszlken is!

50 | O l d a l

Az eredmny kpekben.:

51 | O l d a l

Giroszkp hasznlata
Ezzel a szenzorral megllapthatjuk, hogy a felhasznl hogyan mozgatja a trben a telefont. A giroszkp nem tartozik a telefon alapfelszereltsghez, viszont vannak kszlkek, amik tmogatjk ezt a szenzort. A giroszkp hasznlata nagyon hasonlt az acceloromterhez. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A referencikhoz adjuk hozz a Microsoft.Devices.Sensors s a Microsoft.XNA.Framework menbl vlasszuk ki assembly-t! a Solution Explorer-ben s a kattintsunk jobb egrgombbal, a References-en a megjelen helyi Microsoft.Devices.Sensors Microsoft.XNA.Framework assemblyt, s kattintsunk az OK gombra! 3. Oldjuk fel a Microsoft.Devices.Sensors s a

Microsoft.XNA.Framework nvtereket: using Microsoft.Devices.Sensors; using Microsoft.Xna.Framework; 4. A Contentpanel gridjhez adjunk ngy Textblock-ot: az els hrom az X, Y, Z trbeli pozcikat fogja megjelenteni, mg az utols Textblock akkor jelenik meg, ha a giroszkp nem tmogatott eszkz. Ezenkvl hrom line-t is rajzolunk. Ennek fogjuk a mreteit vltoztatni. A XAML a kvetkezkppen nz ki: <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Height="30" HorizontalAlignment="Left" Margin="20,100,0,0" Name="xTextBlock" Text="X: 1.0" VerticalAlignment="Top" Foreground="Red" FontSize="28" FontWeight="Bold"/> <TextBlock Height="30" HorizontalAlignment="Center" Margin="0,100,0,0" Name="yTextBlock" Text="Y: 1.0" VerticalAlignment="Top" Foreground="Yellow" FontSize="28" FontWeight="Bold"/> <TextBlock Height="30" HorizontalAlignment="Right" Margin="0,100,20,0" Name="zTextBlock" Text="Z: 1.0" VerticalAlignment="Top" Foreground="Blue" FontSize="28" FontWeight="Bold"/> <Line x:Name="xLine" X1="240" Y1="350" X2="340" Y2="350" Stroke="Red" StrokeThickness="4"></Line> <Line x:Name="yLine" X1="240" Y1="350" X2="240" Y2="270" Stroke="Yellow" StrokeThickness="4"></Line> <Line x:Name="zLine" X1="240" Y1="350" X2="190" Y2="400" Stroke="Blue" StrokeThickness="4"></Line> <TextBlock Height="30" HorizontalAlignment="Center" Margin="6,571,6,0" Name="statusTextBlock" Text="" VerticalAlignment="Top" Width="444" /> </Grid> 5. Ezt kveten hozzunk ltre egy giroszkpot (most a konstruktor eltt tesszk ezt meg)! Pldnyostsa ksbb trtnik meg a konstruktorban. Gyroscope gSensor; 52 | O l d a l

6. A konstruktorban ellenrizzk, hogy rendelkezsnkre ll-e a giroszkp! Ha igen, pldnyostsuk, s iratkozzunk fel a CurrentValueChanged esemnyre, ezt kveten hvjuk meg a Start metdust! A TimeBetweenUpdates tulajdonsggal a mintavtelezsi idt hatrozhatjuk meg: public MainPage() { InitializeComponent(); if (Gyroscope.IsSupported) { gSensor = new Gyroscope(); gSensor.TimeBetweenUpdates = TimeSpan.FromMilliseconds(30); gSensor.CurrentValueChanged += new EventHandler<SensorReadingEventArgs<GyroscopeReading>>(g_CurrentValueChange d); gSensor.Start(); } else { statusTextBlock.Text = "A giroszk nem tmogatott!"; } } 7. A CurrentValueChanged esemny trzst is rjuk meg: itt kirjuk a Textblock-nak az X, Y,Z rtkeket, valamint ennek fggvnyben cskkentjk vagy pp nveljk a vonalak rtkeit. void g_CurrentValueChanged(object sender, SensorReadingEventArgs<GyroscopeReading> e) { Dispatcher.BeginInvoke(() => { Vector3 rotationReading = e.SensorReading.RotationRate; xTextBlock.Text = "X " + rotationReading.X.ToString("0.00"); yTextBlock.Text = "Y " + rotationReading.Y.ToString("0.00"); zTextBlock.Text = "Z " + rotationReading.Z.ToString("0.00"); xLine.X2 yLine.Y2 zLine.X2 zLine.Y2 }); } 8. Indtsuk el az alkalmazst s prbljuk ki! Emultoron nem tudjuk kiprblni ezt a funkcit, viszont sajnos a fizikai kszlkek egy rsze sem tmogatja ezt a szenzort. 53 | O l d a l = = = = xLine.X1 yLine.Y1 zLine.X1 zLine.Y1 + + rotationReading.X rotationReading.Y rotationReading.Z rotationReading.Z * * * * 200; 200; 100; 100;

Irnyt hasznlata
Meghatrozhatjuk, hogy a telefonunk melyik gtj fel nz. Hasznlata nagyon hasonl az elzekben megismert szenzorokhoz. Sajnos ez szintn olyan szenzor, amit nem tudunk kiprblni az emultorban, a kiprblshoz olyan fizikai kszlkre van szksgnk, amely tmogatja ezt a szenzort. Nzzk is meg mkds kzben: 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A referencikhoz adjuk hozz a Microsoft.Devices.Sensors Explorer-ben s a jobb

Microsoft.XNA.Framework

assembly-t.

Solution

kattintsunk

egrgombbal, a References-en a megjelen helyi menbl vlasszuk ki a Microsoft.Devices.Sensors s a Microsoft.XNA.Framework assemblyt s kattintsunk az OK gombra! 3. Oldjuk fel a Microsoft.Devices.Sensors s s a Microsoft.XNA.Framework nvtereket: using Microsoft.Devices.Sensors; using Microsoft.Xna.Framework; 4. A Contentpanel gridjhez adjunk ht Textblock-ot, ezen kvl egy line-t is rajzolunk a felhasznli felletre, ennek fogjuk a mreteit vltoztatni. A XAML a kvetkezkppen nz ki: <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Height="30" HorizontalAlignment="Left" Margin="20,73,0,0" Text="MAGNETIC" VerticalAlignment="Top" Foreground="White" FontSize="28" FontWeight="Bold"/> <TextBlock Height="30" HorizontalAlignment="Right" Margin="0,74,47,0" Text="TRUE" VerticalAlignment="Top" Foreground="Gray" FontSize="28" FontWeight="Bold"/> <TextBlock Height="30" HorizontalAlignment="Left" Margin="20,100,0,0" Name="magneticValue" Text="1.0" VerticalAlignment="Top" Foreground="White" FontSize="28" FontWeight="Bold" Width="147" TextAlignment="Center" /> <TextBlock Height="30" HorizontalAlignment="Right" Margin="0,100,20,0" Name="trueValue" Text="1.0" VerticalAlignment="Top" Foreground="Gray" FontSize="28" FontWeight="Bold" Width="123" TextAlignment="Center" /> <TextBlock Height="30" HorizontalAlignment="Left" Margin="20,140,0,0" Name="xBlock" Text="X: 1.0" VerticalAlignment="Top" Foreground="Red" FontSize="28" FontWeight="Bold"/> <TextBlock Height="30" HorizontalAlignment="Center" Margin="0,140,0,0" Name="yBlock" Text="Y: 1.0" VerticalAlignment="Top" Foreground="Green" FontSize="28" FontWeight="Bold"/> <TextBlock Height="30" HorizontalAlignment="Right" Margin="0,140,20,0" Name="zBlock" Text="Z: 1.0" VerticalAlignment="Top" Foreground="Blue" FontSize="28" FontWeight="Bold"/> <Line x:Name="magneticLine" X1="240" Y1="350" X2="240" Y2="270" Stroke="White" StrokeThickness="4"></Line> </Grid

54 | O l d a l

5. Ezt kveten hozzunk ltre egy irnytt (most a konstruktor eltt tesszk ezt meg)! Pldnyostsa ksbb trtnik meg a konstruktorban. Compass compassSensor; 6. Nzzk meg, hogy a kszlk tmogatja-e az adott szenzort! Ha igen, pldnyostsuk a Compass osztlyt, lltsuk be a mintavtelezsi intervallumot, valamint iratkozzunk fel a CurrentValueChanged esemnyre, s vgl hvjuk meg a Start metdust: public MainPage() { InitializeComponent(); if (Compass.IsSupported) { compassSensor = new Compass(); compassSensor.TimeBetweenUpdates = TimeSpan.FromMilliseconds(1); compassSensor.CurrentValueChanged += new EventHandler<SensorReadingEventArgs<CompassReading>>(compass_CurrentValueCh anged); compassSensor.Start(); } } 7. A CurrentValueChanged trzst is rjuk meg: itt kiratjuk a megfelel rtkeket, valamint a kirajzolt vonalat (Line) mdostjuk az gtjnak megfelelen: Void compass_CurrentValueChanged(object sender, SensorReadingEventArgs<CompassReading> e) { Dispatcher.BeginInvoke(() => { magneticValue.Text = e.SensorReading.MagneticHeading.ToString("0.00"); trueValue.Text = e.SensorReading.TrueHeading.ToString("0.00"); magneticLine.X2 = magneticLine.X1 - (200 * Math.Sin(MathHelper.ToRadians((float)e.SensorReading.MagneticHeading))); magneticLine.Y2 = magneticLine.Y1 - (200 * Math.Cos(MathHelper.ToRadians((float)e.SensorReading.MagneticHeading))); xBlock.Text = "X: " + e.SensorReading.MagnetometerReading.X.ToString("0.00"); yBlock.Text = "Y: " + e.SensorReading.MagnetometerReading.Y.ToString("0.00"); zBlock.Text = "Z: " + e.SensorReading.MagnetometerReading.Z.ToString("0.00"); }); } 8. Ezt az alkalmazst is csak fizikai kszlken tudjuk kiprblni, amelyben van irnytszenzor. Az rdekessg kedvrt a kszlk mellett mozgassunk egy mgnest, s figyeljk meg ennek a hatst! 55 | O l d a l

User Control ksztse


Sokszor elfordul fejlesztsi eset, hogy ugyanazt a modult, komponenst jra s jra fel kell hasznlni a projekten bel, vagy egy msik projektben. Nem lenne tl hatkony minden esetben jra megrni ugyanazt a kdsort, vagy pp msolni a kdokat. Nzznk erre egy egyszer pldt! Tegyk fel, hogy lenne egy olyan alkalmazsunk, ahol a szolgltats elrshez be kell jelentkeznie a felhasznlnak! A Login vezrlt az alkalmazs sorn legalbb 5-6 helyen feldobhatjuk, de nem szeretnnk ezt ilyen sokszor jra megrni. Kell teht egy ltalnosabb megolds. 1. Ksztsnk egy j Windows Phone 7 projektet, a neve legyen a WP7UserControlDemo! 2. A Solution Explorer-be kattintsunk jobb egrgombbal, majd adjunk egy j User Controlt a projektnkhz: Add -> New Item -> Windows Phone User Control! A User Control neve legyen a LoginControl! 3. A LoginControl tervezi nzetben helyezzk el a kvetkez vezrlket: a. TextBlock: Text = Felhasznl nv: b. TextBox: Name = txtUserName c. TextBlock: Text = Jelsz: d. PasswordBox: Name = pwdBox e. Button: Name=btnCancel, Content=Mgse f. Button: Name=btnLogin, Content=Bejelentkezs

g. A User Control mrett lltsuk a vezrlknek megfelelen ! 4. A User Control mr most is hasznlhat, de ksztnk a user control-nak kt esemnyt: az egyik a Mgse, a msik a Bejelentkezs gombra val nyoms lesz. Kattintsunk mind a kt gombra, ezzel betltve a kt gomb klikk esemnyt, majd ksztsnk egy delegtumot s kt egyszer esemnyt! A kd a LoginControl kdja, a kvetkezkppen fog kinzni: public partial class LoginControl : UserControl { public delegate void ButtonEventHandler(object sender, EventArgs e); public event ButtonEventHandler CancelClick, LoginClick; public LoginControl() { InitializeComponent(); 56 | O l d a l

} private void btnCancel_Click(object sender, RoutedEventArgs e) { if (CancelClick != null) { CancelClick(sender, e); } } private void btnLogin_Click(object sender, RoutedEventArgs e) { if (LoginClick != null) { LoginClick(sender, e); } } } 5. Itt az ideje kiprblni a vezrlt: nyissuk meg a MainPage.xaml.cs fjlt, majd az xml nvterek kz vegyk fel a projektnket! (Adjunk szmra egy aliast is! Ez most a control nvre fog hallgatni.) xmlns:control="clr-namespace: WP7UserControlDemo " 6. A layoutroot (grid) elrendezsvezrlbe pedig helyezzk el a login vezrlnket! <control:LoginControl/> 7. Ha mindent jl csinltunk, mr meg is jelenik a tervezi nzetben a Login vezrlnk. Mg annyit tegynk meg, hogy a Login vezrlnk LoginClick esemnyre feliratkozunk, s annak az esemnynek adunk egy trzset: <control:LoginControl LoginClick="Login_Click" /> 8. A code behind-ba egyszeren csak hvjuk meg a MessageBoxot: private void Login_Click(object sender, EventArgs e) { MessageBox.Show("Sikeres bejelentkezs!"); } 9. Indtsuk el az alkalmazst, s prbljuk ki mkds kzben a vezrlt! Az jrafelhasznlhatsg jegyben igyekezznk mindig vezrlkben gondolkodni, s prbljuk minl ltalnosabb funkcionalitssal elltni.

57 | O l d a l

PopUp
Egy page-en (oldalon) bell messagebox-on kvl feldobhatunk tovbbi ablakokat is. Ezeket a felugr ablakokat nevezzk popup-nak. A PopUp egy gyermek elemet tud tartalmazni, de az lehet akr egy sszetett elrendezsvezrl, ami tovbbi vezrlket tartalmaz. Gyakran a PopUp egy UserControl-t tartalmaz, gy most n se egy gomb poppostst akarom bemutatni, hanem az elz LoginControl-t fogjuk feldobni. 1. Nyissuk meg az elz WP7UserControlDemo t! 2. Ha a MainPage-en szerepel a login vezrl, akkor egyszeren csak tvoltsuk el! 3. Azrt, hogy ne legyen tltsz a Login vezrl, s legyen kerete, nyissuk meg a LoginControl.xaml-t, majd a grid-et helyezzk egy Border-be, aminek van httrszne, kerete s keretszne! <Border Background="Black" BorderBrush="Wheat" BorderThickness="1"> <Grid x:Name="LayoutRoot" > ... 4. Trjnk vissza a MainPag-re, s a adjunk hozz egy gombot, melynek neve legyen a btnLogin, a Content-je pedig Bejelentkezs! 5. Nyissuk meg a XAML-t, s a ContentPanel-ben helyezznk el egy PopUp-ot! A neve legyen a LoginPopup, megismert a tartalma pedig A az elzleg Login-vezrl! Login-vezrlnek

iratkozzunk fel a Login Click esemnyre is! Ksbb ezt is megrjuk. <Popup x:Name="LoginPopup"> <control:LoginControl LoginClick="Login_Click" /> </Popup> 6. Ha ezzel megvagyunk, kattintsunk a btnLogin gombra ktszer, majd a klikk esemny trzsben nyissuk ki a PopUp ablakot! A PopUp megjelentst vagy elrejtst az IsOpen tulajdonsggal llthatjuk. A PopUp mindvgig az oldalunkon van, csak elrejtve, akkor jelenik meg, ha mi az IsOpen tulajdonsgot true-ra lltjuk. private void btnLogin_Click(object sender, RoutedEventArgs e) { LoginPopup.IsOpen = true; } 7. A LoginClick trzst is rjuk meg, ez pedig egy zenetbl fog llni, s a PopUp bezrsbl. 58 | O l d a l

private void Login_Click(object sender, EventArgs e) { MessageBox.Show("Sikeres bejelentkezs!"); LoginPopup.IsOpen = false; } Prbljuk ki az alkalmazst, nzzk meg, hogyan mkdik! Figyeljk meg, hogy a Mgse gombra kattintva nem zrdik be a PopUp! nll feladatknt oldjuk meg ezt a problmt!

59 | O l d a l

DatePicker Windows Phone 7 Toolkit


Ha megnyitjuk a Visual Studio 2010-et, s elkezdennk keresni egy olyan Windows Phone 7 vezrlt, amivel dtumot lehetne megadnia a felhasznlnak, akkor olyat nem tallnnk. Persze feldobhatunk egy Texbox-ot, s az InputScope-pal is varzsolhatunk, de ez egyfell knyelmetlen, msfell nem clspecifikus, s sok hibt is rejthet magban. Ha DateTime picker-re van szksgnk, akkor a Windows Phone 7 toolkit-jt kell hasznlnunk. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A referencikhoz adjuk hozz a Microsoft.Phone.Controls.Toolkit assembly-t!

3. Nyissuk meg a MainPage.xaml-t, s az XML nvterek kz vegyk fel a toolkit-et:


xmlns:toolkit="clrnamespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

4. A ContentPanel-be adjuk hozz a DatePicker-t: <toolkit:DatePicker /> 5. Indtsuk el az alkalmazst! Ltszlag csak egy egyszer textbox-ot ltunk egy dtummal, de amikor rkattintunk, betltdik a DatePicker oldala.

60 | O l d a l

ExpanderView Windows Phone 7 Toolkit


Vannak esetek, amikor bizonyos vezrlket (szveget vagy akr mst) el szeretnnk rejteni, s csak akkor jelentennk meg, amikor felttlenl fontos. Az expanderView vezrl egy specilis panel, amely sszecsukhat, valamint lenyithat, s a benne tallhat vezrlket csoportosthatjuk. Nzznk egy pldt a hasznlatra: 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A referencikhoz adjuk hozz a Microsoft.Phone.Controls.Toolkit assembly-t! 3. Nyissuk meg a MainPage.xaml-t s az XML nvterek kz vegyk fel a toolkit-et!
xmlns:toolkit="clrnamespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

4. A ContentPanelhez adjunk egy ExpanderView-t, amelynek a header-je legyen a Tartalom szveg! <toolkit:ExpanderView Header="Tartalom"> </toolkit:ExpanderView> 5. A ExpanderView-ba tovbbi vezrlket is elhelyezhetnk. Mi most egy Textblock-ot fogunk elhelyezni benne, aminek a TextWrapping tulajdonsgt Wrap-re llitjuk, a Text tulajdonsgot pedig lorem ipsum szveggel tljk ki (cikket is bemsolhatunk). <toolkit:ExpanderView Header="Tartalom"> <toolkit:ExpanderView.Items> <TextBlock TextWrapping="Wrap" Text="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna." /> </toolkit:ExpanderView.Items> </toolkit:ExpanderView> 61 | O l d a l

6. Indtsuk el az alkalmazst, s prbljuk ki mkds kzben! Kattintsunk a tartalom szvegre! Ekkor az ExpanderView kinylik, s megjelenti a benne tallhat tartalmat. Ha ismtelten rkattintunk, akkor sszezrdik. FONTOS tudni, hogy megszabhatunk ms Expander objektumot is, amivel kinyithatjuk vagy sszezrhatjuk az ExpanderViewet (pl.: kpzeljnk el egy hrolvas alkalmazst, ahol csak a cmek ltszanak, de ha a felhasznl a cikk cmre vagy a mellette tallhat gombra kattint, akkor az ExpanderView lenylik, s megjelenik a tartalma). Figyeljk meg, hogy mind a nyitsnak, mind a zrsnak van egy alaprtelmezett animcija is! Az eredmny kpekben:

A Windows Phone 7 Outlook-ja is hasznlja az ExpanderViewt.

62 | O l d a l

63 | O l d a l

MultiselectList Windows Phone 7 Toolkit


Ha tbb elemet szeretnnk kivlasztani egy listbl, akkor a MultiselectList nagy segtsg lehet a szmunkra. Ez a vezrl is a Windows Phone 7 Toolkit rsze. Hasznlata nagyon egyszer. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A referencikhoz adjuk hozz a Microsoft.Phone.Controls.Toolkit assembly-t! 3. Nyissuk meg a MainPage.xaml-t, s az XML nvterek kz vegyk fel a toolkit-et!
xmlns:toolkit="clrnamespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

4. Dobjunk fel egy Textblock-ot, melynek szvege legyen a Krem vlassza ki a Pizzafeltteket szveg! 5. A textblock al dobjunk fel egy multiselectList-et, a neve legyen mlPizza! 6. Vigynk fel 2-3 multiselectItem-et (most XAML-bl): <toolkit:MultiselectList x:Name="mlPizza" Margin="0,42,0,370"> <toolkit:MultiselectItem Content="Sonka" /> <toolkit:MultiselectItem Content="Gomba" /> <toolkit:MultiselectItem Content="Kukorica"/> </toolkit:MultiselectList> 7. Ha az IsSelected tulajdonsgot True-ra lltjuk, akkor az adott elem alapbl ki lesz jellve. 8. A MultiselectList-hez kdbl is hozzadhatunk elemeket. mlPizza.Items.Add( new MultiselectItem() { Content = "Szalmi" }); 9. Termszetesen van adatktsre s sablonok kialaktsra is lehetsg.

64 | O l d a l

PageTransition Windows Phone 7 Toolkit


Amikor naviglunk kt oldal kztt, semmilyen animcit nem kapunk, tulajdonkppen csak felugrik az j oldal. Viszont ha szeretnnk valamilyen oldalak kztti tmeneti animcit kszteni, akkor bizony vagy mi ksztjk el azt, vagy felhasznljuk pldul a Toolkit adta lehetsgeket. Ennek a lpsei a kvetkezk: 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. Adjunk hozz egy j oldalt (Second.xaml)! 3. A MainPage re dobjunk fel egy gombot, a Content-je legyen a Navigci, majd kattintsunk ktszer r, s a klikk esemnyben navigljunk t a Second oldalra! NavigationService.Navigate(new Uri("/Second.xaml", UriKind.RelativeOrAbsolute)); 4. Indtsuk el az alkalmazst, s nzzk meg, hogy amikor rkattintunk a gombra, hirtelen felugrik a msik oldal (Second.xaml), s semmilyen tmenet nincs a kt oldal kztt! 5. A referencikhoz adjuk hozz a Microsoft.Phone.Controls.Toolkit assembly-t! 6. Nyissuk meg a MainPage.xaml-t, s az XML nvterek kz vegyk fel a toolkit-et!
xmlns:toolkit="clrnamespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

7. A Page element al adjuk a kvetkez kdsorokat: <toolkit:TransitionService.NavigationInTransition> <toolkit:NavigationInTransition> <toolkit:NavigationInTransition.Backward> <toolkit:TurnstileTransition Mode="BackwardIn"/> </toolkit:NavigationInTransition.Backward> <toolkit:NavigationInTransition.Forward> <toolkit:TurnstileTransition Mode="ForwardIn"/> </toolkit:NavigationInTransition.Forward> </toolkit:NavigationInTransition> </toolkit:TransitionService.NavigationInTransition> <toolkit:TransitionService.NavigationOutTransition> <toolkit:NavigationOutTransition> <toolkit:NavigationOutTransition.Backward> <toolkit:TurnstileTransition Mode="BackwardOut"/> </toolkit:NavigationOutTransition.Backward> <toolkit:NavigationOutTransition.Forward> <toolkit:TurnstileTransition Mode="ForwardOut"/> </toolkit:NavigationOutTransition.Forward> </toolkit:NavigationOutTransition> </toolkit:TransitionService.NavigationOutTransition> 65 | O l d a l

Ugyanez C# kdban (ritkbban hasznlatos): NavigationInTransition navInTransition = new NavigationInTransition(); navInTransition.Backward = turnstileTransition; turnstileTransition.Mode = TurnstileTransitionMode.ForwardIn; navInTransition.Forward = turnstileTransition; NavigationOutTransition navOutTransition = new NavigationOutTransition(); turnstileTransition.Mode = TurnstileTransitionMode.BackwardOut; navOutTransition.Backward = turnstileTransition; turnstileTransition.Mode = TurnstileTransitionMode.ForwardOut; navOutTransition.Forward = turnstileTransition; PhoneApplicationPage phoneApplicationPage = (PhoneApplicationPage)(((PhoneApplicationFrame)Application.Current.RootVisu al)).Content; TransitionService.SetNavigationInTransition(phoneApplicationPage, navInTransition); TransitionService.SetNavigationOutTransition(phoneApplicationPage, navOutTransition); 8. Egy lps maradt mg htra. Nyissuk meg az App.Xaml.cs fjlt, s a RootVisual meghatrozsnl a RootFrame-et az albbiak szerint hozzuk ltre: RootFrame = new Microsoft.Phone.Controls.TransitionFrame(); 9. Indtsuk el az alkalmazst, s prbljunk meg elnaviglni, majd vissza a kt oldal kztt! szre fogjuk venni, hogy az oldalak kztti navigcinl egy rvid animci fog vgbemenni, s az alkalmazsunk mris dinamikusabb vlt. A pldban a Trunstile Transitiont hasznltuk, ami a Windows Phone 7-en az egyik leggyakrabban hasznlatos animci, hisz ilyen animci trtnik a f kpernyn is. De ezen kvl hasznlhatjuk mg a slide, rotate swivel vagy a roll animcikat is. Nhny animci kpekben:

66 | O l d a l

HubTile Windows Phone 7 Toolkit


A HubTile-t a Metro UI megjelenshez terveztk. Ez egy specilis tglalap alak vezrl, s csak 173x173 pixel mret lehet (Width s a Height tulajdonsga ugyan mdosthat, de a tglalap ugyangy 173x173-as mret marad, de sajt stlus s sablon kszthet hozz). 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A referencikhoz adjuk hozz a Microsoft.Phone.Controls.Toolkit assembly-t! 3. Nyissuk meg a MainPage.xaml-t s az XML nvterek kz vegyk fel a toolkit-et!
xmlns:toolkit="clrnamespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

4. A projektnkhz ksztsnk egy j mappt, melynek a neve legyen Images (Add -> New Folder)! Keressnk a neten Budapestrl, New Yorkrl, Londonrl s Moszkvrl egy-egy jellegzetes kpet, s adjuk hozz az Images mapphoz ket (nlam most Budapest.jpg, London.jpg, NewYork.jpg s Moscow.jpg van)! 5. Adjuk a ContentPanel nevezet grid-hez a 4 HubTitle-t, ahol a Title az orszg neve, a Message pedig a vros neve! A Source tulajdonsgnl a kp tvonalt kell meghatroznunk. <toolkit:HubTile Source="Images/Budapest.jpg" Title="Magyarorszg" Message="Budapest" Margin="191,6,92,428" /> <toolkit:HubTile Source="Images/London.jpg" Title="Egyeslt Kirlysg" Message="London" Margin="12,6,271,428" /> <toolkit:HubTile Background="Blue" Source="Images/Moscow.jpg" Title="Oroszorszg" Message="Moszkva" Margin="12,185,271,249" /> <toolkit:HubTile Source="Images/NewYork.jpg" Title="Egyeslt llomok" Message="New York" Margin="191,185,92,249" /> Ennl a pldnl most marg is meg van hatrozva. Termszetesen mozgassuk tetszs szerint a HubTitle-ket. 6. Mint lthatjuk, ennek a vezrlnek van egy alaprtelmezett animcija is. Ha ezt nem szeretnnk lefuttatni, akkor meg is fagyaszthatjuk: az IsFrozen tulajdonsgt ilyenkor True ra kell lltani (alapbl False). (Opcionlis) a. A HubTitle a rendszertl rkli a csempk sznt, de az explicite-et fell is definilhatjuk, ilyenkor a Background tulajdonsgot kell meghatroznunk. b. A HubTitle-t csoportokba is foglalhatjuk, s csoportokban kezelhetjk is. Ehhez a GroupTag tulajdonsgot kell hasznlnunk. Pldul belltjuk ezt a

67 | O l d a l

tulajdonsgot az eurpai orszgoknl, s ha szeretnnk, akkor az sszes HubTitle-t, ami a csoportban van, befagyaszthatjuk pldul: HubTileService.FreezeGroup("Europa"); HubTileService.UnfreezeGroup("Europa"); c. Kdbl is hozzadhatunk HubTitle-t ritkbb esetben, de valamikor jl jn. Ne felejtsk el az elrendezsvezrlnek is tadni! HubTile hubTile = new HubTile(); hubTile.Message = "Nmetorszg"; hubTile.Title = "Mnchen"; d. Figyelmeztetseket is megadhatunk, az zenetet a Notification tulajdonsgnak kell megadni. Ez csak akkor jelenik meg, ha a DisplayNotification True-ra van lltva! <toolkit:HubTile DisplayNotification="True" Notification="AKCI!" Source="Images/London.jpg" Title="Egyeslt Kirlysg" Message="London" Margin="12,6,271,428" /> 7. Indtsuk el az alkalmazst, s prbljuk ki mkds kzben! Funkcionlisan sok dolgot nem csinl, de amit mgis, azt legalbb szpen s hibtlanul.

68 | O l d a l

WrapPanel Windows Phone 7 Toolkit


A Windows Phone 7 SDK-ja nmagban csak a Grid, a StackPanel s a Canvas elrendezsvezrlt tmogatja. Viszont egy specilis elrendezsvezrl csak a Toolkit rsze. Ezt fleg template-ek esetn szoktuk hasznlni.

Hasonl szerepet tlt be, mint a StackPanel, viszont van egy apr klnbsg, mgpedig az, hogy optimlisan kitlti a rendelkezsre ll helyet, vagyis a vezrlk tbb sorban is megjelenhetnek, ha nem frnek ki. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A referencikhoz adjuk hozz a Microsoft.Phone.Controls.Toolkit assembly-t! 3. Nyissuk meg a MainPage.xaml-t, s az XML nvterek kz vegyk fel a toolkit-et:
xmlns:toolkit="clrnamespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

4. A ContentPanel gridbe helyezznk el egy wrappanel-t (ki is cserlhetjk, de figyeljk meg, hogy a ContentPanel egy tovbbi Gridben szerepel)! <toolkit:WrapPanel> </toolkit:WrapPanel>

69 | O l d a l

5. Most dobljunk a wrappanel-be tovbbi vezrlket (pldul gombokat)! Az elrendezsvezrl specilis, hisz hogyha nem frne ki az adott vezrl egy sorba, akkor a kvetkez sorba dobja. (Fontos! Explicit mdon nem erltethetjk ki a sordobst, kerl megoldsok persze lteznek.) <toolkit:WrapPanel> <Button Content="Alma" Height="71" Name="button1" Width="160" /> <Button Content="Krte" Height="71" Name="button2" Width="160" /> <Button Content="Bann" Height="71" Name="button3" Width="160" /> <Button Content="Narancs" Height="71" Name="button4" Width="160" /> <Button Content="Anansz" Height="71" Name="button5" Width="160" /> </toolkit:WrapPanel>

70 | O l d a l

ContextMenu Windows Phone 7 Toolkit


Ha Windows Phone 7-et hasznlunk, olykor helyi (Context) menkkel is tallkozunk. Tipikus eset az, amikor egy alkalmazst el akarunk tvoltani a kszlkrl. Ilyenkor kivlasztjuk az alkalmazst, majd rbknk, s nhny msodpercig lenyomva tartjuk az ujjunkat. Ilyenkor ugrik fel a context men. A Context men szintn nem az alapvet SDK rsze, de van arra lehetsgnk, hogy mi is ksztsnk ilyen ment, ugyanis ez a Windows Phone 7 toolkit rsze.

Nzznk erre a vezrlre is egy pldt: 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A referencikhoz adjuk hozz a Microsoft.Phone.Controls.Toolkit assembly-t! 3. Nyissuk meg a MainPage.xaml-t, s az XML nvterek kz vegyk fel a toolkit-et:
xmlns:toolkit="clrnamespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

4. A ContentPanel-hez adjunk egy gombot: a szvege legyen a Helyi men (termszetesen nemcsak gomb esetben hasznlhat a ContextMenu)! 5. A Button elemek kz vegynk most fel egy ContextMenu-t, s adjunk hozz hrom men elemet (Msols, Kivgs, Beilleszts), valamint egy szepartor elemet! Az XAML gy nz ki: <Button Content="Helyi men" Height="72" HorizontalAlignment="Left" Margin="12,6,0,0" Name="button1" VerticalAlignment="Top" Width="283" > <toolkit:ContextMenuService.ContextMenu> <toolkit:ContextMenu> 71 | O l d a l

<toolkit:MenuItem Header="Msols" /> <toolkit:MenuItem Header="Kivsg" /> <toolkit:Separator /> <toolkit:MenuItem Header="Beilleszts" /> </toolkit:ContextMenu> </toolkit:ContextMenuService.ContextMenu> </Button> 6. Ha most elindtjuk az alkalmazst, s rnyomunk a gombra hosszan, akkor megjelenik a helyi men (mg funkcionalitssal nem br!).

7. Ha funkcival is el akarjuk ltni, akkor a MenuItem-eknek meghvhatjuk a Klikk esemnyt (hvjunk meg egy MessageBox-ot az esemny trzsben). <toolkit:MenuItem Header="Msols" Click="MenuItem_Click" /> 8. Indtsuk el az alkalmazst, s prbljuk ki mkds kzben a ContextMenu-t!

72 | O l d a l

Vezrl testreszabsa Expression Blend

73 | O l d a l

Animci ltrehozsa Expression Blend


Ahhoz, hogy ltvnyos alkalmazsokat ksztsnk, az animci nagyon fontos. Az Expression Blend elssorban dizjnereknek ksztett eszkz, amellyel mind a dizjn, mind az animcik ksztse nagyon egyszer feladat. Mivel animcit legtbbszr Expression Blend-ben ksztnk, gy a tutorialban is ezt az eszkzt fogjuk hasznlni XAML gpelse helyett. Ebben a feladatban egy krt fogunk mozgatni a telefon kpernyjn. Nagyon egyszer feladat, mgis az animci kszts alapjait el tudjuk sajttani a segtsgvel. 1. Indtsuk el az Expression Blend-et, s hozzunk ltre egy j Windows Phone 7 alkalmazst! A neve legyen mondjuk a Wp7AnimDemo!

2. A felhasznli felletre dobjunk fel egy gombot, ez a gomb fogja az animcit elindtani. A Content tulajdonsgnak adjuk meg az Animci indtsa szveget, s mretezzk a szvegnek megfelelen (gombot feldobni az oldals toolbar-rl tudunk, bal oldalon van)!

3. Dobjunk fel a felhasznli felletre egy ellipszist is, ezt szintn az oldals Toolbar-rl tehetjk meg.

4. Jelljk ki az ellipszist, s Properties ablakban a httrsznt lltsuk t valamilyen szntmenetre (Gradient brush)!

74 | O l d a l

5. Az alkalmazs fellete most kb. gy nz ki:

6. Nyomjuk meg az F6-ot! Ilyenkor az Expression Blend tvlt animcis mdba, ebben az elrendezsben knnyebb animcikat kszteni: nagyobb a Timeline stb. 7. Az Objects and Timeline-on kattintsunk a plusz (+) jelre, s hozzunk ltre egy j Storyboardot (a neve legyen sbAnim)!

8. Ezt kveten megjelenik a Timeline, s a tervezi nzet krl is lesz egy piros keret. Az Objects and Timeline-on jelljk ki az Ellipse-et!

9. A Timelin-on a srga vonalat mozgassuk el, s lltsuk be 1 msodpercre az rtkt, ekzben termszetesen az Ellipse maradjon kijellve!

10. Az ellipszist mozgassuk t jobb oldalra! 11. A Timeline srga vonalkjt most lltsuk 2 msodpercre, az ellipszist pedig mozgassuk lefel, a jobb als sarok fel! 12. Nyomjuk meg a play gombot, s ltni fogjuk, hogy az animci 2 msodperc alatt vgbemegy, s az ellipszis megrkezik a jobb als sarokba.

75 | O l d a l

13. Ha viszont most elindtjuk az alkalmazst, nem fog trtnni semmi, nem fut le az animci. Jelljk ki az Animci indtsa gombot, a Properties ablakban vltsunk t az esemnyekhez (Villm jel), s kattintsunk ktszer a Klikkbe! Ekkorra betltdik az Expression Blend kdszerkesztje. Itt is lehet C# kdot rni, igaz, ez kzel se olyan okos, mint a Visual Studio-, de egy animci elindtshoz, valamint kisebb mveletekhez tkletesen elg. Az esemny trzsbe rjuk a kvetkezt:
sbAnim.Begin();

14. Indtsuk el az alkalmazst: kattinsunk az Animci indtsa gombra! Ekkor az ellipszis 2 msodperc alatt a jobb als sarokba rkezik.

Lthat, hogy animcit nagyon egyszer ltrehozni Expression Blend segtsgvel. Termszetesen nemcsak mozgatst tudunk vgrehajtani, s nemcsak egyszer alakzatokon.

76 | O l d a l

Animci ltrehozsa XAML (ProgressBar)


Amikor elkezdnk fejleszteni Windows Phone 7 al, a kezd fejleszt gyakran belefut abba a hibba, hogy szeretne animcis gif-et hasznlni a felleten, ezt viszont a Windows Phone 7 nem tmogatja. Megjelenti ugyan a kpet, de csak az els kpkockjt. Sokszor a fejleszt a weben ajax s jQuery vilgban megismert folyamat jelzseket szeretn alkalmazni, de nem tudja.

Hogyan lehetne ezt a problmt megoldani? Itt bizony kreativitsra s kitartsra lesz szksgnk! Az albbi pldn egy krbe-krbe fut progressbar-t ksztnk el. Ezt egy Canvas-en fogjuk megrajzolni, majd ezt fogjuk elforgatni. Itt lthat a prg loading kszen, XMAL-ben (ezt clszer egy kln vezrlbe elhelyezni). Figyeljnk r, hogy most fekete szn krkbl pl fel, ezt az alkalmazsunknak megfelelen vltoztatni kell! <Canvas RenderTransformOrigin="0.5,0.5" Width="120" Height="120"> <Ellipse Width="21.835" Height="21.862" Canvas.Left="20.1696" Canvas.Top="9.76358" Stretch="Fill" Fill="#E6000000"/> <Ellipse Width="21.835" Height="21.862" Canvas.Left="2.86816" Canvas.Top="29.9581" Stretch="Fill" Fill="#CD000000"/> <Ellipse Width="21.835" Height="21.862" Canvas.Left="5.03758e-006" Canvas.Top="57.9341" Stretch="Fill" Fill="#B3000000"/> <Ellipse Width="21.835" Height="21.862" Canvas.Left="12.1203" Canvas.Top="83.3163" Stretch="Fill" Fill="#9A000000"/> <Ellipse Width="21.835" Height="21.862" Canvas.Left="36.5459" Canvas.Top="98.138" Stretch="Fill" Fill="#80000000"/> <Ellipse Width="21.835" Height="21.862" Canvas.Left="64.6723" Canvas.Top="96.8411" Stretch="Fill" Fill="#67000000"/> <Ellipse Width="21.835" Height="21.862" Canvas.Left="87.6176" Canvas.Top="81.2783" Stretch="Fill" Fill="#4D000000"/> <Ellipse Width="21.835" Height="21.862" Canvas.Left="98.165" Canvas.Top="54.414" Stretch="Fill" Fill="#34000000"/> <Ellipse Width="21.835" Height="21.862" 77 | O l d a l

Canvas.Left="92.9838" Canvas.Top="26.9938" Stretch="Fill" Fill="#1A000000"/> <Ellipse Width="21.835" Height="21.862" Canvas.Left="47.2783" Canvas.Top="0.5" Stretch="Fill" Fill="#FF000000"/> <Canvas.RenderTransform> <RotateTransform x:Name="SpinnerRotate" Angle="0" /> </Canvas.RenderTransform> <Canvas.Triggers> <EventTrigger RoutedEvent="ContentControl.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="SpinnerRotate" Storyboard.TargetProperty="(RotateTransform.Angle)" From="0" To="360" Duration="0:0:01" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Canvas.Triggers> </Canvas> Az eredmnye:

78 | O l d a l

Animci ltrehozsa Kdbl


Animcit nemcsak XAML-ben lehet kszteni, br fontos megemlteni, hogy legtbbszr XAML-ben tesszk. Kdbl leginkbb csak elindtunk egy-egy animcit, viszont olykor elfordulhat, hogy mgis kdbl kell animcit ltrehoznunk. Ez ugyan krlmnyesebb, mint a XAML, de olykor ez kifizetd. Az animci tulajdonkppen idegysg alatt bekvetkezett tulajdonsgvltozs. Annak, hogy mit vltoztatunk, nagyon fontos szerepe van: ha mretet, ttetszsget vagy olyan tulajdonsgot, ami double tpus, akkor a DoubleAnimation osztlyt fogjuk hasznlni. Ha pldul sznt szeretnnk animlni (azaz olyan tulajdonsgot, ami valamilyen sznnel kapcsolatos), akkor a ColorAnimation osztlyt fogjuk hasznlni erre a clra. Persze ezenkvl mg j nhny animcis osztly ll a rendelkezsnkre. A kvetkez pldban egy gombot fogunk animlni. 1. Ksztsnk egy j Windows Phone 7 alkalmazst! 2. A felhasznli felletre dobjunk fel egy gombot, a gomb neve legyen a btnAnim, a Content-je pedig az Animci szveg! Kattintsunk ktszer a gombra! 3. A klikk esemny trzsbe elszr pldnyostsunk egy DoubleAnimation pldnyt, ez az animci a btnAnim mrett (szlessgt) fogja befolysolni. Elszr megmondjuk, hogy 1-tl (From) megy 200-ig (To) (ebben az esetben pixelig) az animci. A Duration tulajdonsgnl megmondjuk, hogy ez az animci ebben az esetben hrom msodpercig fog tartani. DoubleAnimation dAnimation = new DoubleAnimation(); dAnimation.From = 1; dAnimation.To = 200; dAnimation.Duration = TimeSpan.FromSeconds(3); 4. Ezt kveten ksztsnk egy Storyboard pldnyt, aminek tadjuk az ltalunk ksztett animcit, valamint belltjuk, hogy az animcit melyik vezrln akarjuk elindtani (SetTarget) s a vezrlnek melyik tulajdonsgt akarjuk majd vltoztatni, (SetTargetProperty), vgl meghvjuk a Begin metdust, amivel az animci elindul. Storyboard sb = new Storyboard(); sb.Children.Add(dAnimation); Storyboard.SetTarget(dAnimation, btnAnim); Storyboard.SetTargetProperty(dAnimation, new PropertyPath("Width")); sb.Begin(); 5. Indtsuk el az alkalmazst, s prbljuk ki mkds kzben!

79 | O l d a l

Pivot s Panorma
A Pivot s a Panorma kt nagyon gyakran hasznlatos vezrl. Lehetsget biztost, hogy a tartalmakat kategorizlva horizontlisan elnyjtsuk.

A kt vezrl hasznlata nagyon hasonl, gy ezt egy panorma vezrln keresztl fogjuk megnzni. Ez a kt vezrl annyira npszer, hogy kln elrendezsi sablonja van. A kvetkez pldban egy egyszer panorma vezrln alapul alkalmazst fogunk ltrehozni, de annyival megspkeljk a dolgot, hogy egy animcit is elhelyeznk benne, mgpedig a panorma httert fogjuk mdostani, radsul most az animcit kdbl fogjuk ltrehozni! 1. Ksztsnk egy j Windows Phone Panorama Aplication-t!

2. Az alkalmazssablon mr eleve tartalmaz egy Panorma vezrlt. Mivel a httr kpt is szeretnnk mdostani, ksztsnk egy j mappt a solution explorer-ben! A mappa neve legyen Images (Add -> New Folder)! A mappba helyezznk el kt kpet! Az n esetemben ez most img1.jpg s img2.jpg. A kpek Build Action-jt lltsuk Content-re!

80 | O l d a l

3. Nyissuk meg a MainPage.xaml fjlt! A griden bell (LayoutRoot) lthat, hogy van egy panorma control. Ennek a vezrlnek adjuk a panorama nevet, a Title pedig legyen most a Windows Phone szveg! <controls:Panorama x:Name="panorama" Title="Windows Phone"> Ez a panorma vezrl legfels cmkjt cserli. Figyeljk meg, hogy a Panorma vezrl egy vagy tbb PanoramaItem-et tartalmazhat! Ezek a PanoramaItem-ek egy vezrlt tudnak magukba foglalni, ami persze lehet egy elrendezsvezrl is. 4. Vegyk szemgyre az els PanoramItem-et! A Header-jt rjuk t belltsokra, s a benne tallhat vezrlt trljk, majd helyezznk el benne egy gridet, amibe egy egyszer gombot dobjunk fel! A gomb content-je legyen a Httr mdostsa szveg! Kattintsunk ktszer a gombra, hogy betltsk a klikk esemnyt! A XAML valahogy gy fog kinzni: <controls:PanoramaItem Header="Bellttsok"> <Grid> <Button Content="Httr mdosts" Height="72" HorizontalAlignment="Left" Margin="20,215,0,0" Name="button1" VerticalAlignment="Top" Width="307" Click="button1_Click" /> </Grid> </controls:PanoramaItem> Az esemny trzst mg hagyjuk resen, s trjnk vissza a MainPage.xaml-jhez! 5. A Panorma vezrlnknek most vltoztassuk meg a httert, s az alaprtelmezett kk kp helyett lltsuk be a korbban hozzadott img1.jpg-t! <controls:Panorama.Background> <ImageBrush ImageSource="/Images/img1.jpg"/> </controls:Panorama.Background> 6. Most mr kiprblhatjuk az alkalmazst. Indtsuk el, s nzzk meg, mi lesz ennek az eredmnye! 7. Szp ez az alkalmazs, de szeretnnk kicsit ltvnyosabb varzsolni. Nyissuk meg a MainPage.xaml.cs fjlt! Els krben oldjuk fel a System.Windows.Media.Imaging nvteret: using System.Windows.Media.Imaging; 8. Ksztsnk egy Fade In / Out animcit! Ezt kdbl a kvetkezkppen fogjuk megtenni: private void FadeInOut(DependencyObject target, Storyboard sb, bool isFadeIn) { Duration d = new Duration(TimeSpan.FromSeconds(1)); DoubleAnimation daFade = new DoubleAnimation(); 81 | O l d a l

daFade.Duration = d; if (isFadeIn) { daFade.From = 1.00; daFade.To = 0.00; } else { daFade.From = 0.00; daFade.To = 1.00; } sb.Duration = d; sb.Children.Add(daFade); Storyboard.SetTarget(daFade, target); Storyboard.SetTargetProperty(daFade, new PropertyPath("Opacity")); sb.Begin(); } 9. A gomb klikk esemny trzsbe pldnyostsunk egy Storyboard-ot! Iratkozzunk fel annak a Completed esemnyre, majd hvjuk meg a FadeInOut metdust (els paramtere egy DependencyObject, ami ebben az esetben a panorma httere, msodik paramtere a storyboard, harmadik pedig egy bool, amivel az animci tpust hatrozzuk meg (FadeIn true vagy FadeOut false)). Storyboard sbFadeIn = new Storyboard(); sbFadeIn.Completed += new EventHandler(sbFadeIn_Completed); FadeInOut(panorama.Background, sbFadeIn, true); 10. Most mr csak a storyboard Completed esemnynek a trzst kell megrnunk. Itt ltrehozunk egy BitmapImag-et, amit tadunk egy ImageBrush-nak. Ezt kveten megint ksztnk egy Storyboard-ot, s meghvjuk a FadeInOut metdust, csak most FadeOut rsz fog lefutni. void sbFadeIn_Completed(object sender, EventArgs e) { BitmapImage bmp = new BitmapImage( new Uri("/Images/img2.jpg", UriKind.Relative)); ImageBrush imgBrush = new ImageBrush(); imgBrush.ImageSource = bmp; this.panorama.Background = imgBrush; Storyboard sbFadeOut = new Storyboard(); FadeInOut(this.panorama.Background, sbFadeOut, false); } 11. Indtsuk el az alkalmazst, s nzzk meg mkds kzben!

82 | O l d a l

83 | O l d a l

I/O mveletek
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. De sok szbeszd helyett, nzznk egy pldt: Minden I/O mveletet hasznl alkalmazsnl szksgnk lesz a System.IO s a System.IO.IsoltedStorage nvtrre. using System.IO.IsolatedStorage; using System.IO; Fjl rsa: 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 kell tadnunk egy Stream-et, ez ebben az esetben egy IsolatedStorageFileStream, majd a StreamWriter pldny WriteLine metdusval rhatunk egy sort a fjlba.

84 | O l d a l

A fjlbl val 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); } Nzznk tovbbi gyakori I/O mveleteket: 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");

85 | O l d a l

Alkalmazs belltsok
Amikor csak egyszer alkalmazsbelltsokat 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. Nzzk meg pldkon keresztl: Elszr is szksgnk lesz a System.IO.IsolatedStorage nvtrre: using System.IO.IsolatedStorage; 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 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: 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 86 | O l d a l

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"].ToSt ring()); } 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; // 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. 87 | O l d a l

IsolatedStorageSettings.ApplicationSettings.Save(); A mentett adatokat persze el is tvolthatjuk az ApplicationSettings-bl. Eltvolthatunk pldul 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 }

88 | O l d a l

Jegyzetfzet alkalmazs ksztse


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

A gyakorlatban csak az adattrolssal kapcsolatos kdokat fogjuk kzsen megrni, az albbi lpsekben: 1. 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. 2. Fordtsuk le, s indtsuk el az alkalmazst! Egyszer jegyzetelfelletet kapunk, de jelenleg mg nem tudjuk sem elmenteni, sem betlteni jegyzeteinket. 3. 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"); }

89 | O l d a l

4. 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; 5. 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, gy a s .dat lesz pldny a kiterjesztsk. WriteLine Ezt kveten ltrehozunk tadjuk egy a IsolatedStorageFileStream-et. Ezt legegyszerbben a StreamWriter-rel tudjuk rni, mySw metdus paramternek 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); 6. 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"); A GetFileNames visszatrsi rtke egy String tmb, ezt adjuk t az lstMyNotes listnak. 7. 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 az

90 | O l d a l

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. 8. Termszetesen, ha tadtuk ezt a paramtert, akkor azt le is kell krdeznnk, s az tadott rtknek megfelelen egy megnyitni az adott fjlt. Trjnk vissza a A MainPage.xaml.cs hez, s navigljunk el az OnNavigatedTo esemnyhez, s itt ltrehozunk fileName nev string vltozt. 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(); } } } 9. 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), s az megjelenik kezdkpernyjn a jegyzeteink listjval.

91 | O l d a l

10. 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! 11. 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)); Itt az IsolatedStorageSettings.ApplicationSettings Foreground kulcshoz hozzadjuk a kivlasztott szn kulcsnak rtkt, majd visszanaviglunk a MainPage oldalra. 12. 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); 13. 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).

92 | O l d a l

IsolatedStorageSettings.ApplicationSettings.TryGetValue<int>("Foreground", out foregroundColorIndex); Csakgy, mint a Settings page-nl, itt is kiolvassuk a foreground tulajdonsgot, majd alkalmazzuk a szvegdobozon. 14. 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)! 15. Ksztsnk egy jegyzetet, majd mentsk el! Vlasszuk ki a belltsok menpontot, s a megjelen ablakban vlasszunk ki egy neknk tetsz sznt! Ha kivlasztottunk egy j sznt, akkor az alkalmazs rgtn visszanavigl a MainPage oldalra, ahol lthatjuk, hogy a jegyzetnk betszne megegyezik az ltalunk kivlasztott sznnel.

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.

93 | O l d a l

Adatbzis ltrehozsa
Ahhoz, hogy ltrehozzunk egy adatbzist, egy DataContext tpust s legalbb egy entits osztlyt ltre kell hoznunk. Ezek az osztlyok lesznek felelsek a mapping-rt, 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)] 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;

94 | O l d a l

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. public CustomerDataContext(string connectionString) : base (connectionString) { customers = GetTable<Customer>(); } 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.

95 | O l d a l

Read-Only adatbzis ltrehozsa


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!

3. A Database file-nl vlasszuk a <New Database> menpontot, ekkor felugrik a Create New SQL Server Compact Database ablak. A fjl neve ebben az esetben a D meghajt TestDb mappjra mutat, ebben a mappban fogja a MyMusic.sdf adatbzist ltrehozni a Management Studio.

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,

96 | O l d a l

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! 6. A megjelen New Table ablakban definiljuk a Musics adattblt. 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

97 | O l d a l

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

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 egrgombbal, 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! Kattintsunk jobb egrgombbal 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(); } 98 | O l d a l

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 az albbihoz hasonl hibt kapnnk: MyMusic db = new MyMusic("isostore:/MyMusic.sdf");

16. Ezt a hibt azrt kapjuk, mert az IsolatedStorage-ban nem szerepel ez az adatbzis. Br Content-re 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 string-et 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. (Az adatok mdostsrl s hozzadsrl a kvetkez alfejezetben olvashatunk)

18. Ahhoz, hogy ezt elkerljk, az adatbzist t kell msolnunk az Isolated Storage-ba. Ehhez hasznlhatjuk pldul az albbi segdmetdust: 99 | O l d a l

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; 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 string-et a hagyomnyos 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 adatbzis mozgatshoz. Az adatbzisunk mg res, ezt kveten tltsk fel adatokkal!

100 | O l d a l

Webszolgltatsok elrse
Gyakori eset, hogy a telefonrl egy kls webszolgltatst akarunk elrni. A kvetkez pldban egy olyan alkalmazst ksztnk, amely egy webszolgltatson keresztl megmondja a felhasznlnak, hogy az ltala megadott IP cm melyik orszgban van. Kezdjk is el! 1. Ksztsnk egy Windows Phone 7 alkalmazst! 2. Dobjunk fel a felhasznli felletre egy txtbox-ot, melynek a neve legyen a txtIpAddress, a Text tulajdonsga pedig res legyen! 3. A Textbox al helyezznk egy gombot, a gomb neve legyen btnGetInfo, a contentje pedig legyen az IP meghatrozsa! 4. Ksz a felhasznli felletnk, adjuk hozz a szolgltats referencijt: menpontot! 5. A megjelen ablakban adjuk meg a webszolgltatsunk cmt (ez most a http://www.webservicex.net/geoipservice.asmx cmen rhet el), majd kattintsunk a Go gombra! Az elindul folyamat nhny msodpercet ignybe vehet. Oldjuk fel az IpService nvteret, majd kattintsunk az OK gombra! a solution Explorer-ben kattintsunk a Refrences-re jobb egrgombbal, s vlasszuk ki az Add Service Reference

6. Trjnk vissza a MainPage dizjn nzethez, s kattintsunk ktszer a btnGetInfo gombra! A klikk esemny trzsben pldnyostsuk a GeoIpServiceSoapClient osztlyt! Gyakorlatilag webszolgltats elrsnl azt a ltsztatot keltjk, hogy ez az osztly helyben szerepel s a metdusai is olyanok, mintha helyi metdusok lennnek, mikzben ez egy csontvz. Amikor meghvjuk pldul a GetGeoIpAsync metdust, akkor egy tvoli szolgltatshvs keletkezik, s ez a metdus egy tvoli szerveren fog 101 | O l d a l

lefutni. Mivel minden hvs aszinkron, ezrt rtesteni kell a felhasznlt, hogy az eredmny megrkezett, ezrt iratkozunk fel a GetGeoIpCompleted esemnyre: private void btnGet_Click(object sender, RoutedEventArgs e) { IpService.GeoIPServiceSoapClient ipClient = new IpService.GeoIPServiceSoapClient(); ipClient.GetGeoIPCompleted += new EventHandler<IpService.GetGeoIPCompletedEventArgs>(ipClient_GetGeoIPComplet ed); ipClient.GetGeoIPAsync(txtIpAddress.Text); } 7. A Completed esemny trzst most egy egyszer MessageBox-szal ltjuk el, ami megjelenti az IP cm orszgt (GeoIP osztllyal tr vissza a hvs. Tovbbi informcik is kinyerhetk a visszatrsi rtkbl.). void ipClient_GetGeoIPCompleted(object sender, IpService.GetGeoIPCompletedEventArgs e) { MessageBox.Show(e.Result.CountryName); } 8. Indtsuk el az alkalmazst, adjunk meg egy vals IP cmet, s nzzk meg, hogy valban sikerl-e megmondani a szolgltatsnak, hogy melyik orszgban tallhat az IP cm!

nnll feladat: rjunk egy olyan alkalmazst, ami a napi eur, dollr rfolyamokat megmondja. Ehhez hasznljuk fel a Magyar Nemzeti Bank rfolyam szolgltatst! Ez a kvetkez cmrl rhet el: http://www.mnb.hu/arfolyamok.asmx .

102 | O l d a l

Vous aimerez peut-être aussi