Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Window Runtime specifikus alkalmazások megvalósítása. Giachetta Roberto

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Cserép Máté

Eseményvezérelt alkalmazások fejlesztése II 8. előadás. Összetett WPF alkalmazások. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek. Windows Runtime alapismeretek A Windows Runtime

2. Beadandó feladat dokumentáció

3. Beadandó feladat dokumentáció

2. Beadandó feladat dokumentáció

3. Beadandó feladat dokumentáció

1. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II 9. előadás. WPF erőforrások kezelése. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek, Modern UI alapú alkalmazások.

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Platformspecifikus Xamarin alkalmazások. Platformspecifikus Xamarin alkalmazások

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Programozási technológia

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Választó lekérdezés létrehozása

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Vizuális programozás gyakorlat

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Programozási technológia

Swing GUI készítése NetBeans IDE segítségével

Java Programozás 11. Ea: MVC modell

DKÜ ZRT. A Portál rendszer felületének általános bemutatása. Felhasználói útmutató. Támogatott böngészők. Felületek felépítése. Információs kártyák

Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Platformspecifikus Xamarin alkalmazások. Giachetta Roberto

A Canvas LMS új és régi felülete közti különbségek

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Molnár Mátyás. Bevezetés a PowerPoint 2010 használatába. Csak a lényeg érthetően!

Eseményvezérelt alkalmazások fejlesztése II 3. előadás. Windows Forms dinamikus felhasználói felület, elemi grafika

Johanyák Zsolt Csaba: Grafikus felület programozása. Copyright 2008 Johanyák Zsolt Csaba

Szoftvertechnolo gia gyakorlat

Mobil Partner telepítési és használati útmutató

Webshop készítése ASP.NET 3.5 ben I.

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

A TERC VIP költségvetés-készítő program telepítése, Interneten keresztül, manuálisan

Eseményvezérelt és objektumorientált programozás

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Technikai információk fejlesztőknek

Elemi Alkalmazások Fejlesztése Beadandó Feladat Juhász Ádám

2. Beadandó feladat dokumentáció

Hiteles Elektronikus Postafiók

Internetkonfigurációs követelmények. A számítógép konfigurálása. Beállítások Windows XP alatt

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Importálás. más típusú (pl:.imp,.xml,.xkr,.xcz) állomány beimportálása a nyomtatványkitöltő programba

Bánsághi Anna 2015 Bánsághi Anna 1 of 31

Sú gó az ASIR/PA IR Públikús felú lethez

Operációs rendszerek. Tanmenet

Access adatbázis elérése OLE DB-n keresztül

TERC V.I.P. hardverkulcs regisztráció

Ugráló gomb oktatási segédlet Ugráló gomb

A szerzõrõl... xi Bevezetés... xiii

A WORDPRESS TESTRESZABÁSA (MEGJELENÉS MENÜ ELEMEI)

C#---Access adatbáziskezelési gyakorlat

Windows mappaműveletek

Programozás BMEKOKAA146. Dr. Bécsi Tamás 10. Előadás

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Webes alkalmazások fejlesztése 10. előadás. Szolgáltatás alapú rendszerek megvalósítása (ASP.NET WebAPI) Cserép Máté

ivms-4200 kliensszoftver

libgdx alapok, első alkalmazás

VARIO Face 2.0 Felhasználói kézikönyv

Eseményvezérelt alkalmazások fejlesztése II 9. előadás. Window Runtime alapismeretek, Modern UI alapú alkalmazások

Komponens alapú szoftverfejlesztés 8. előadás. Szoftver architektúrák alapvetései. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Adatintegritás ellenőrzés Felhasználói dokumentáció verzió 2.0 Budapest, 2008.

Win 8 változatok. 2. sz. melléklet felnottkepzes@gmail.com. Töltse ki az előzetes tudásszint felmérő dolgozatot!

Előszó A Windows alkalmazásfejlesztés rövid története A Windows életútja A Windows 8 paradigmaváltása... 16

Tartalom jegyzék 1 BEVEZETŐ SZOFTVER ÉS HARDVER KÖVETELMÉNYEK 2 2 TELEPÍTÉS 2 3 KEZELÉS 5

ContractTray program Leírás

*Ezen felületet kell kitölteni saját fiók létrehozásáho z

Concurrency in Swing

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

A program telepítése

Alap számológép alkalmazás

Beszámoló átadása az OBR * -nek a Hessyn Éves beszámoló nyomtatványkitöltő programból

3. Beadandó feladat dokumentáció

Hiteles elektronikus postafiók Perkapu

Programozási környezetek

Az importálás folyamata Felhasználói dokumentáció verzió 2.1.

Beszámoló átadása az OBR * -nek a Hessyn Éves beszámoló nyomtatványkitöltő programból

Java-s Nyomtatványkitöltő Program Súgó

13. Tárgymutató. Windows XP alapokon

SSL VPN KAPCSOLAT TELEPÍTÉSI ÚTMUTATÓ

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

DebitTray program Leírás

OOP és UML Áttekintés

Útmutató az OKM 2007 FIT-jelentés telepítéséhez

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése II 11. előadás Window Runtime specifikus alkalmazások megvalósítása Giachetta Roberto A jegyzet az ELTE Informatikai Karának 2014. évi Jegyzetpályázatának támogatásával készült

Alkalmazások megjelenése A Modern UI alapú alkalmazások megjelenése több speciális elemmel is rendelkezik a felület stílusának (színek, betűk) célszerű az egységes sémához alkalmazkodnia (theme resource) a felületet jellemzően animálódik, a különböző átmenetekre szintén adott egy séma (theme animation) a nézetnek kezelnie kell a különböző méreteket, tájolásokat, ezt egységes formában vizuális állapotok (visual state) segítségével teheti meg az egyes eseményekre, adatváltozásokra viselkedések (behavior) segítségével tudunk reagálni ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:2

Vizuális állapotok A vizuális állapotok (VisualState) a vezérlők egyes állapotait tükrözik le, amelyek esemény hatására változnak céljuk a vezérlők állapotkezelésének egyszerűsítése állapotváltáskor lehetőségünk van animációk lejátszására pl.: Normal PointerOver IsEnabled = false IsEnabled = true MouseDown() MouseUp() Disabled Pressed ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:3

Vizuális állapotok A vizuális állapotokat a vezérlőben a VisualStateManager osztály segítségével követhetjük bármely vezérlőnek adhatunk állapotokat csoportokba foglalva (VisualStateGroups) minden csoportnak és állapotnak egyedi névvel (x:name) kell rendelkeznie, majd az állapotváltást a névre hivatkozva kezdeményezhetjük (GoToState) a vezérlők eleve rendelkeznek állapotokkal, amelyeket felhasználhatunk pl. a CommonStates csoport tartalmazza az általános állapotokat (Normal, Disabled, Pressed, ) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:4

Vizuális állapotok az állapotok felhasználhatóak méretváltás kezelésére pl.: <Grid > <VisualStateManager.VisualStateGroups> <!-- vizuális állapotkezelés --> <VisualStateGroup x:name="sizestates"> <VisualState x:name="normal" /> <VisualState x:name="narrow"> <Storyboard> </Storyboard> <! lefut egy animáció, amikor átváltunk az állapotba --> </VisualState> </Grid> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:5

Vizuális állapotok pl.: private void MainPage_SizeChanged(object sender, SizeChangedEventArgs e) { if (e.newsize.width < 600) { VisualStateManager.GoToState(this, "Narrow", false); // ha lecsökken az oldalszélesség, a szűk // állapotra váltunk } else { VisualStateManager.GoToState(this, "Normal", false); } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:6

Animációk Az alkalmazások megjelenését animációkkal gazdagíthatjuk lehetőségünk van egyedi animációk készítésére (ColorAnimation, DoubleAnimation, ) az animációkat forgatókönyvbe (Storyboard) helyezzük adott az animációknak egy kiinduló halmaza (theme animation), amely a Modern UI elvárásainak megfelelő animációkat biztosítja, pl. elemek megjelenése (FadeInThemeAnimation, PopInThemeAnimation, AddDeleteThemeAnimation) áthelyezés (RepositionThemeAnimation) húzás (SwipeHintThemeAnimation) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:7

Animációk pl.: <Storyboard Storyboard.TargetName="myButton" <FadeInThemeAnimation /> <!-- az animáció már tartalmazza a paramétereket --> </Storyboard> lehetőségünk animációkat automatikusan futtatni átmenetek (transition) formájában, ekkor csupán az átmenetet kell megadnunk a vezérlőben, pl.: <Button.Transitions> <FadeInTransition /> <!-- automatikus animálódik --> </Button.Transitions> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:8

Példa Feladat: Készítsünk egy vizsgatétel generáló alkalmazást, amely ügyel arra, hogy a vizsgázók közül ketten ne kapják ugyanazt a tételt. felhasználjuk a vizuális állapotokat arra, hogy az alkalmazás kis szélesség esetén is jól látszódjon, ehhez létrehozunk vizuális állapotokat mindkét ablakban (Normal, Narrow, VeryNarrow) az állapotokban a címke méretét és a rács margóját állítjuk animációk segítségével lekezeljük az oldalak méretváltozását (SizeChanged), és a változásnak megfelelően váltjuk az állapotot (GoToState) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:9

Példa Megvalósítás (MainPage.xaml): <Grid Name="mainGrid" Style="{StaticResource NormalGridStyle}"> <!-- vizuális állapotokat használunk, hogy alkalmazkodjunk a mérethez --> <VisualStateManager.VisualStateGroups> <VisualStateGroup Name="SizeStates"> <VisualState Name="Normal"> <!-- normál állapot --> <Storyboard> </Storyboard> </VisualState> <VisualState Name="Narrow"> </VisualStateManager.VisualStateGroups> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:10

Viselkedések A nézet viselkedését jobban egyedivé szabhatjuk a Behaviors SDK segítségével bármely elemhez hozzárendelhetünk viselkedéseket (Interaction.Behaviors) a viselkedések kezdeményezhetőek esemény (EventTriggerBehavior), vagy adatváltozás (DataTriggerBehavior) hatására a viselkedés lehet értékbeállítás (ChangePropertyAction), parancsfuttatás (InvokeCommandAction), állapotváltás (GoToStateAction), a használathoz két névtérre is szükségünk van ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:11

Viselkedések pl.: xmlns:i="using:microsoft.xaml.interactivity" xmlns:icore="using:microsoft.xaml.interactions.core" <Button > <! viselkedést adunk a gombnak --> <i:interaction.behaviors> <icore:eventtriggerbehavior EventName="DoubleTapped"> <icore:invokecommandaction Command=" " /> <!-- parancs futtatása dupla kattintásra --> </Button ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:12

Példa Feladat: Készítsünk egy dinamikus méretezhető táblát, amely három szín között (piros, fehér, zöld) állítja a kattintott gombot, valamint a vele egy sorban és oszlopban lévőket. a színt a nézet adja meg, így a nézetmodell nem adhat vissza konkrét színt, csak egy sorszámot (0 és 2 között), amely alapján a szín állítható (ColorNumber) a projektben meghivatkozzuk a Behaviors SDK-t (Windows/Extensions) a szín sorszámának változására egy DataTriggerBehavior reagál, amely egy ChangePropertyAction segítségével végzi el a módosítást ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:13

Példa Megvalósítás (MainPage.xaml): <Button Command="{Binding FieldChangeCommand}" > <interactivity:interaction.behaviors> <interactions:datatriggerbehavior Binding="{Binding ColorNumber}" Value="0"> <!-- ha 0-ra váltott a ColorNumber tulajdonság, akkor zöldre váltjuk a színt --> <interactions:changepropertyaction PropertyName="Background"> <interactions:changepropertyaction.value> <SolidColorBrush Color="Green" /> </interactions:changepropertyaction.value> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:14

Beállítások megjelenítése Az alkalmazások beállításait a Windows 8 egységes módon jeleníti meg, külön beállítások képernyővel minden beállítási lehetőséget célszerű áthelyezni oda, hogy egységesen kezelhetőek legyenek a felhasználók számára a beállítások lapjait a beállítás-kezelő (SettingsPane) segítségével helyezhetjük ki először fel kell vennünk a menüpontokat (SettingsCommand) a beállítások képernyőn (CommandsRequested) a parancshoz kötött tevékenységben lehetőségünk van beállítás lapot (SettingFlyout) megjeleníteni akár több lapot is használhatunk külön csoportoknak ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:15

Beállítások megjelenítése pl.: SettingsPane.GetForCurrentView(). CommandsRequested += ; e.request.applicationcommands.add( new SettingsCommand("Settings", "Alap beállítások", // megadjuk, hova helyezze a parancsot, és // milyen felirattal command => { settingsflyout.show(); // beállítások lap megjelenítése } )); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:16

Példa Feladat: Készítsünk egy vizsgatétel generáló alkalmazást, amely ügyel arra, hogy a vizsgázók közül ketten ne kapják ugyanazt a tételt. javítsunk a beállítások kezelésén, azáltal, hogy az alkalmazás beállításai közé helyezzük őket létrehozunk egy beállítás lapot (GeneralSettingsFlyout), amely tartalmazni fogja az összes beállítást az alkalmazásban (App) elvégezzük a megjelenítést, és az adattársítást a listának adunk egy új elemsablont annak érdekében, hogy ne változzon a háttérszín fókuszáláskor ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:17

Példa Tervezés: - _model :IExamGeneratorModel - _viewmodel :ExamGeneratorViewModel App Application {leaf} + App() # OnLaunched(LaunchActivatedEventArgs) :void - RootFrame_NavigationFailed(object, NavigationFailedEventArgs) :void - RootFrame_SizeChanged(object, SizeChangedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void - SettingsPane_CommandsRequested(SettingsPane, SettingsPaneCommandsRequestedEventArgs) :void «async» - ViewModel_ApplicationMessaged(object, ApplicationMessageEventArgs) :void Page View::MainPage {leaf} + MainPage() -_viewmodel ViewModelBase ViewModel::ExamGeneratorViewModel SettingsFlyout View::GeneralSettingsFlyout {leaf} + GeneralSettingsFlyout() ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:18

Példa Megvalósítás (App.xaml.cs): private void SettingsPane_CommandsRequested( ) { // felveszünk egy parancsot a beállításokhoz, // amely megjeleníti az ablakot e.request.applicationcommands.add( new SettingsCommand("Settings", "Általános", command => { GeneralSettingsFlyout settingsflyout = new GeneralSettingsFlyout(); settingsflyout.datacontext = _viewmodel; settingsflyout.show(); // beállítások megjelenítése })); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:19

Menü megvalósítása Az alkalmazások rendelkezhetnek alkalmazássávval két típusa adott, az általános (AppBar), amelyben bármilyen tartalmat elhelyezhetünk, és a parancssáv (CommandBar), amely szabványos utasításokat tud prezentálni automatikusan megjelenik gesztus hatására, de programozottan is megjeleníthető (IsOpen, IsSticky) elhelyezhető az ablak tetején, illetve alján (TopAppBar, BottomAppBar) a sávra elsősorban gombokat helyezünk (AppBarButton, AppBarToggleButton), amely speciális megjelenéssel (Icon) rendelkeznek ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:20

Menü megvalósítása pl.: <Page.BottomAppBar> <!-- alsó menü --> <CommandBar> <!-- gombok fogják alkotni --> <AppBarButton Label="Frissít" Icon="Refresh" Command=" " /> <AppBarButton Label="Segítség" Icon="Help" Command=" " /> </CommandBar> </Page.BottomAppBar> lehetőségünk van speciális módon tagolni az elemeket (AppBarSeparator, SecondaryCommands) a gombokhoz rendelhetünk menüket is (MenuFlyout), amelyekre menüpontokat helyezhetünk (MenuFlyoutItem) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:21

Adatkezelés Az alkalmazások adatait több formában is tárolhatjuk: lokálisan: a helyi fájlrendszerben és regisztrációs adatbázisban (ApplicationData.Current.LocalSettings, ApplicationData.Current.LocalFolder) központilag (roaming): a felhasználói fiókhoz társítva (ApplicationData.Current.RoamingSettings, ApplicationData.Current.RoamingFolder) átmenetileg: futás közben elérhető tárhelyen (ApplicationData.Current.TemporaryFolder) Alkalmazás törlésekor a hozzá tartozó adatok is törlődnek ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:22

Adatkezelés Az alkalmazás beállításait kulcs/érték párok formájában tárolhatjuk az ApplicationDataContainer típuson keresztül egyszerű adattípusok támogatottak, illetve több belső gyűjteményt is létrehozhatunk pl.: ApplicationDataContainer settings = ApplicationData.Current.LocalSettings; // helyi beállítások lekérdezése settings.values["myvalue"] = 1000; // beállítás mentése Int32 value = Convert.ToInt32(settings.Values["myValue"]); // beállítás lekérdezése ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:23

Adatkezelés Az alkalmazás fájljait a megadott könyvtáron keresztül (StorageFolder) kezelhetjük létrehozhatunk (CreateFileAsync( )), betölthetünk, törölhetünk fájlokat, illetve könyvtárakat a fájlokat (StorageFile) olvashatjuk, illetve írhatjuk a FileIO osztály segítségével szöveges, illetve bináris tartalmat tudunk kezelni (ReadTextAsync(), ReadLinesAsync(), ReadBufferAsync( ), WriteTextAsync( )) a megszokott adatfolyam kezelés is elérhető (StreamReader, StreamWriter), azonban funkcionalitása korlátozott ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:24

Adatkezelés alapesetben az alkalmazás csak a lokális könyvtárát, a telepítés helyét, illetve a felhasználó letöltések könyvtárát láthatja, minden más engedélyhez kötött pl.: StorageFolder folder = ApplicationData.Current.LocalFolder; // alkalmazás helyi könyvtárának lekérdezése StorageFile file = await Folder.GetFileAsync("data.txt"); // fájl (aszinkron) betöltése IList<String> lines = await FileIO.ReadLinesAsync(file); // összes sor kiolvasása a fájlból ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:25

Adatkezelés Az adatkezelés fontos szerephez jut az állapot megőrzésében mivel a felfüggesztett alkalmazást bármikor bezárhatja a rendszer, felfüggesztéskor (Suspending esemény) mentenünk kell az állapotot aktiválásnál, amennyiben terminált állapotból (ApplicationExecutionState.Terminated) térünk vissza, be kell töltenünk a korábbi állapotot ezt az OnLaunched( ) eseménykezelő argumentumában megkapjuk állapot visszatöltést akkor is alkalmazhatunk, ha a felhasználó zárja be az alkalmazást (ApplicationExecutionState.ClosedByUser) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:26

Adatkezelés Lehetőségünk van a teljes fájlrendszer elérésére is, amennyiben az alkalmazás erre kapott engedélyt (Capabilities) betölthetünk könyvtárakat (FolderPicker), illetve fájlokat (FileOpenPicker), továbbá menthetünk fájlokat (FileSavePicker) konfigurálható a megjelenítés módja (ViewMode), a kezdőkönyvtár (SuggestedStartLocation), illetve szűrhető a megjelenített tartalom (FileTypeFilter) az engedély mellett (helyett) meghatározhatjuk a támogatott funkcionalitást és fájltípusokat is (Declarations) nem minden könyvtár esetében szükséges ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:27

Adatkezelés pl.: FileOpenPicker openpicker = new FileOpenPicker(); // fájl megnyitó lap openpicker.suggestedstartlocation = PickerLocationId.DocumentsLibrary; // a dokumentumok könyvtárban kezd openpicker.filetypefilter.add(".txt"); // csak a txt kiterjesztésű fájlokat jeleníti // meg StorageFile file = await openpicker.picksinglefileasync(); // egy fájl megnyitása ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:28

Példa Feladat: Készítsünk egy Tic-Tac-Toe programot, amelyben két játékos küzdhet egymás ellen. az alkalmazás modellje, nézetmodellje és a perzisztencia felülete használható az asztali és a mobil alkalmazás esetén is, de Portable Class Library segítségével kell megvalósítanunk a perzisztencia megvalósítása különbözik a két alkalmazásban, ezért külön osztálykönyvtárként készítjük el mindkét esetre a nézetet szintén egy külön alkalmazásban valósítjuk meg, amelyben nem csak lehetőséget adunk fájlkezelésre, de automatikusan kezeljük az állapotot terminálás esetén ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:29

Példa Tervezés: «WPF Application» TicTacToeGame.View.Desktop «Windows Store Application» TicTacToeGame.View.Store «Portable Class Library» TicTacToeGame.ViewModel «Portable Class Library» TicTacToeGame.Model «Windows Class Library» TicTacToeGame.Persistence.Desktop «Portable Class Library» TicTactoeGame.Persistence «Windows Store Class Library» TicTacToeGame.Persistence.Store ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:30

Példa Tervezés: App - _model :ITicTacToeModel - _viewmodel :TicTacToeViewModel - _fileopenpicker :FileOpenPicker - _filesavepicker :FileSavePicker Application {leaf} Page View::TicTacToePage {leaf} + TicTacToePage() + App() # OnLaunched(LaunchActivatedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void - Model_GameWon(object, GameWonEventArgs) :void - Model_GameOver(object, EventArgs) :void «async» - LoadAppState() :void - SaveAppState() :void - ViewModel_LoadGame(object, System.EventArgs) :void - ViewModel_SaveGame(object, System.EventArgs) :void Persistence:: TicTacToeStorageFileDataAccess + Load(String) :Player[] + Save(String, Player[]) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:31

Példa Megvalósítás (App.xaml.cs): protected override void OnLaunched( ) { // amennyiben nem a felhasználó zárta be az // alkalmazást, be kell töltenünk a korábbi // állapotot if (args.previousexecutionstate == ApplicationExecutionState.Terminated) { LoadAppState(); } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:32

Példa Megvalósítás (App.xaml.cs): private async void LoadAppState() { // a betöltést az alkalmazás könyvtárából // végezzük StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("lastgame.txt"); try { _model.loadgame(file.path); } catch { } // a hibát nem kell jeleznünk, csak // elveszítjük a korábbi állapotot } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:33

Példa Megvalósítás (TicTacToeStorageFileDataAccess.cs): public Player[] Load(String path) StorageFile file = StorageFile.GetFileFromPathAsync(path).AsTask().Result; // betöltjük a fájlt a megadott útvonalból String[] numbers = FileIO.ReadTextAsync(file).AsTask().Result.Split(); // a fájl teljes tartalmát beolvassuk // egy szövegbe return numbers.select(number => (Player)Int32.Parse(number)).ToArray(); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:34

Aszinkron tevékenységek megvalósítása Az aszinkron tevékenységek hasznosak, mivel lehetővé teszik a felület állandó hozzáférését nem csupán szükségszerűen, de mind mobil, mind asztali környezetben célszerű az időigényes tevékenységeket (pl. adatkezelés) aszinkron módon megvalósítani az aszinkron műveletek alapja a taszk (Task), amely biztosítja a párhuzamos futtatást a művelet tulajdonképpen taszkkal tér vissza (void esetben is), amely tartalmazhat eredményt (Task<T>) célszerű visszatérési típusként mindenhol a taszkot jelölni (pl. interfészben nem is használható az async kulcsszó) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:35

Aszinkron tevékenységek megvalósítása pl.: interface IMyInterface { Task MyMethodAsync(); // aszinkron művelet } class MyType : IMyInterface { public async Task MyMethodAsync() { } // aszinkron művelet megvalósítása } IMyInterface mt = new MyType(); await mt.mymethodasync(); // megvárható a művelet ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:36

Példa Feladat: Készítsünk egy Tic-Tac-Toe programot, amelyben két játékos küzdhet egymás ellen. hatékonysági okokból valósítsuk meg aszinkron módon a teljes fájlkezelést, így az ITicTacToeDataAccess interfész Load és Save műveletei taszkkal térnek vissza az ITicTacToeModel interfésze LoadGame és SaveGame műveletei is taszkkal térnek vissza minden esetben a megvalósításban aszinkron műveleteket készítünk, és aszinkron műveleteket hívunk, ennek megfelelően minden felhasználáskor bevárjuk az eredményt ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:37

Példa Tervezés: «interface» Persistence::ITicTacToeDataAccess + LoadAsync(String) :Task<Player[]> + SaveAsync(String, Player[]) :Task Persistence:: TicTacToeStorageFileDataAccess «interface» Model::ITicTacToeModel + NewGame() :void + StepGameAsync(Int32, Int32) :Task + LoadGameAsync(String) :Task + SaveGame(String) :void «property» + CurrentPlayer() :Player + StepNumber() :Int32 «indexer» + this(int32, Int32) :Player «event» + GameStarted() :EventHandler + GameOver() :EventHandler + GameWon() :EventHandler<GameWonEventArgs> + FieldChanged() :EventHandler<FieldChangedEventArgs> «async» + LoadAsync(String) :Task<Player[]> + SaveAsync(String, Player[]) :Task ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:38

Példa Megvalósítás (TicTacToeStorageFileDataAccess.cs): public async Task<Player[]> Load(String path) StorageFile file = await StorageFile.GetFileFromPathAsync(path); // betöltjük a fájlt a megadott útvonalból String[] numbers = (await FileIO.ReadTextAsync(file)).Split(); // a fájl teljes tartalmát beolvassuk // egy szövegbe return numbers.select(number => (Player)Int32.Parse(number)).ToArray(); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:39