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

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

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

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

2. Beadandó feladat dokumentáció

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

3. Beadandó feladat dokumentáció

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

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

Tartalomjegyzék. Előszó... 10

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).

Programozási technológia

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

2. Beadandó feladat dokumentáció

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

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

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

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Xamarin alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Java Programozás 11. Ea: MVC modell

2. Beadandó feladat dokumentáció

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

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

2. Beadandó feladat dokumentáció

Concurrency in Swing

Programozási környezetek

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

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

Operációs rendszerek. Tanmenet

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

Web-fejlesztés NGM_IN002_1

Tartalomjegyzék. Előszó... xiii Bevezetés... xv. 1. Ismerkedés a Windows 7-tel Integráció a Windows 7 tálcájával: az alapszolgáltatások...

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

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

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

Operációs rendszerek. Az X Window rendszer

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

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

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

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

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

1. Beadandó feladat dokumentáció

iphone és Android két jó barát...

Image Processor BarCode Service. Felhasználói és üzemeltetői kézikönyv

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

Eseményvezérelt alkalmazások

Számítógépes alapismeretek 2.

Java programozási nyelv 6. rész Java a gyakorlatban

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

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

Operációs rendszerek. Tanmenet

CAN alapú járműves adatokat megjelenítő szoftver fejlesztése

CareLink Personal telepítési útmutató. Első lépések a CareLink Personal adatfeltöltéshez

3. Beadandó feladat dokumentáció

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

libgdx alapok, első alkalmazás

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés modell/nézet architektúrában

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

Konkurens TCP Szerver

Mobil készülékek programozása

Programozási technológia

BME MOGI Gépészeti informatika 7.

Programozási nyelvek Java

Mobil Informatikai Rendszerek

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

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

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

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

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

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

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Mobil Informatikai Rendszerek

Vizuális, eseményvezérelt programozás XI.

Elemi alkalmazások fejlesztése I.

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

Alap számológép alkalmazás

BME MOGI Gépészeti informatika 13.

AWK programozás, minták, vezérlési szerkezetek

A Java nyelv. Dialógus ablakok. Elek Tibor

AWK programozás, minták, vezérlési szerkezetek

Webes alkalmazások fejlesztése. Bevezetés az ASP.NET MVC 5 keretrendszerbe

Operációs rendszerek. 4. gyakorlat. BASH bevezetés, script írása, futtatása UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Gyakran Ismételt Kérdések (GYIK) az Eee Pad TF201 modellhez

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Szoftvertechnológia alapjai Java előadások

Eseményvezérelt alkalmazások fejlesztése I 10. előadás. Adatbázis-kezelés modell/nézet architektúrában. Giachetta Roberto

VII. Appletek, grafika

Hozzávalók keresése és csatolása

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

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

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

Mobil Telefonon Keresztüli Felügyelet Felhasználói Kézikönyv

BME MOGI Gépészeti informatika 5.

Több platform egy kódbázis Tanulságok a Tresorittól. Budai Péter, vezető fejlesztő

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

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

Crossplatform mobil fejlesztőkörnyezet kiválasztását támogató kutatás

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

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

Átírás:

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 Giachetta Roberto A jegyzet az ELTE Informatikai Karának 2014. évi Jegyzetpályázatának támogatásával készült

Kialakulás A.NET keretrendszer felügyelt platformja több hátránnyal is rendelkezik (teljesítmény, együttműködés) sok esetben vegyes kódbázisú alkalmazásokat kell építeni a cél a felügyelet mentes és felügyelt technológiák egységesítése, ugyanakkor alkalmassá tétele több programozási nyelvvel/technológiával való kompatibilitásra (C/C++,.NET, JavaScript) A Windows Runtime (WinRT) a Windows 8 rendszerek fejlesztői platformja egységes, felügyeletmentes API, amely különböző technológiákon (.NET, JavaScript) keresztül is elérhető ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:2

Architektúra XAML HTML5, CSS3 C/C++ C#/Visual Basic.NET 4.5 JavaScript JavaScript motor Windows Runtime Windows szolgáltatások ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:3

Koncepciók Koncepciók: technológiákkal való együttműködés, összehangolás, metaadat-kezelés hatékonyságnövelés, aszinkron végrehajtási modell biztonságos működés, korlátozott rendszerhozzáférés célhardverek kezelése, hozzáférés szabályozás Mobiltelefonokra szánt változata a Windows Phone Runtime Az egyes platformok (WinRT,.NET, Silverlight, XBox) között megoszthatóak programegységek a Portable Class Library (PCL) segítségével ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:4

Alkalmazások mobil környezetben A mobil/táblagépes környezetben alkalmazásunknak számos olyan követelményt kell teljesíteni, amit az asztali alkalmazásnak nem fontos az adaptivitás: az alkalmazás különböző hardvereken, különböző méretű/felbontású képernyőkön, különböző tájolással (portré/tájkép), különböző üzemmódokban (teljes képernyő, oldalra zárt, ) futhat fontos a beviteli gesztusok kezelése elérhetőek speciális hardverek (GPS, gyorsulásmérő, ) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:5

Alkalmazások grafikus felülete Az alkalmazások grafikus felülete a Modern UI (korábban Metro UI) tervezési koncepció segítségével valósul meg infografikus, célja a minimalizmus, a letisztultság, a kezelhetőség növelése (kisebb méretű kijelzőkön is) az alkalmazás futtatása legyen gyors és folyamatos (aszinkron végrehajtása a tevékenységeknek) egy meghatározott tervezési vonalat, és annak sajátosságait (pl. Segoe UI betűtípus) kell követni nélkülözi a bonyolult grafikákat, animációkat az ikonokat felváltja csempékkel, amelyek tartalma dinamikus is lehet ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:6

Alkalmazások futtatása Az alkalmazások egy biztonságos környezetben futnak nem férhetnek hozzá más alkalmazások adataihoz csak korlátozott módon férhetnek hozzá a rendszer adataihoz (pl. fájlrendszer), és azt is csak engedéllyel szintén engedéllyel használhatják csak az eszközöket emiatt a fejlesztői eszközkészletük is korlátozott Az alkalmazás tulajdonságait, illetve engedélyeit az alkalmazás azonosító (Application Manifest) tartalmazza, amely része az alkalmazás csomagjának az engedélyeket a telepítéskor jóvá kell hagyni ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:7

Alkalmazások életciklusa A mobil alkalmazások más életciklusban futnak, mint az asztali alkalmazások a futás és a terminált állapotok mellett megjelenik a felfüggesztett állapot is, amely akkor lép életbe, ha az alkalmazás a háttérbe (vagy a gép alvó állapotba) kerül aktiválás leállítva futás alatt folytatás felfüggesztés felfüggesztve leállítás ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:8

Alkalmazások életciklusa a felfüggesztés célja az erőforrásokkal való takarékosság a terminálást kezdeményezheti a felhasználó (pl. gesztussal), illetve az operációs rendszer felfüggesztett alkalmazások esetén (pl. amennyiben kevés a memória) a program nem zárható be más módon (kódban) az alkalmazás nem kap figyelmezetést a bezárásról (célszerű felfüggesztéskor menteni az adatokat, illetve elengedni az erőforrásokat) a program elszállhat kivétellel, ekkor eltűnik, és a felhasználó visszakerül a Start képernyőre (Windows crash experience) ebben az esetben ne állítsuk vissza a mentett adatokat ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:9

Alkalmazások felépítése Az alkalmazások (projektek) elemei: szabványos kódfájlok, illetve grafikus felület (XAML és háttérkód) erőforrás gyűjtemények (Resource Dictionary), illetve más erőforrások (pl. csempe és nyitó képernyő grafikák) személyes azonosító fájl (Personal Information Exchange file) alkalmazás azonosító (Application Manifest) Az alkalmazás (és a hozzá tartozó tartalom) egy csomagot alkot (appx), amely publikálható a Windows Áruházban, amennyiben megfelel az elvárásoknak ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:10

Alkalmazások architektúrája A szoftvereket.net for Windows Store keretrendszerben fejlesztjük, amely a WinRT felügyelt interfésze, illetve egy lehatárolt részhalmaza a.net keretrendszernek az osztályok sok esetben a Silverlight programozási modelljére támaszkodnak Az alkalmazásokat fejleszthetjük: modell/nézet/perzisztencia architektúrában az eszközkészlet jó része elérhető, az eseménykezelés a megszokott módon (kiegészülve pl. gesztúrákkal) modell/nézet/nézetmodell (MVVM) architektúrában több megszorítás található az eszközkészletre ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:11

A grafikus felület felépítése A grafikus felület oldalakból (Page) áll felépítése hasonló az ablakokéhoz, de mindig kitölti a rendelkezésére álló teret, a mérete előre nem meghatározható, ezért elrendezéseket (Grid, Canvas, StackPanel, ), transzformációkat (Viewbox) kell alkalmazni az oldal figyelhet az elhelyezésre is az elemek megjelenítéséhez adott egy stíluskészlet (amelyet a ThemeResource hivatkozással érhetünk el) lehet előugró üzenetek (MessageDialog), illetve speciális funkciójú oldalakat (FileOpenPicker, ) használni ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:12

Az alkalmazás vezérlése A programot az alkalmazás (App) vezérli, amely egyesíti az erőforrásokat az alkalmazás aktiválásakor (OnLaunched) végezzük az inicializálást adatmentést végezhetünk felfüggesztéskor (Suspending), megjelenítés frissítést aktiváláskor (Resuming) az oldalakat keretbe helyezzük (Frame), amely szabályozza az oldalak közötti átmenetet (Navigate( ), GoBack(), GoForward()), ehhez tárolja az eddig megnyitott ablakokat a keretet helyezzük az aktuális ablakba (Window.Current), majd ezt aktiváljuk (Activate()) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:13

Példa Feladat: Készítsünk egy egyszerű számológépet, amellyel a négy alapműveletet végezhetjük el, illetve láthatjuk korábbi műveleteinket is. az alkalmazást modell/nézet architektúrában valósítjuk meg, a korábban készített modell (CalculatorModel) újra felhasználjuk a képernyőn (MainPage) felvesszük a megfelelő vezérlőket, amelyek stílusok segítségével egyedire szabunk eseménykezelővel végrehajtjuk a tevékenységeket, előugró dialógussal (MessageDialog) figyelmeztetünk a hibás bemenetre ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:14

Példa Tervezés: App Application {leaf} EventArgs Model::CalculatorEventArgs + App() # OnLaunched(LaunchActivatedEventArgs) :void - RootFrame_NavigationFailed(object, NavigationFailedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void Model::CalculatorModel -_model - _model :CalculatorModel View::MainPage Page {leaf} -_operation «enumeration» Model::Operation + MainPage() - MainPage_Loaded(object, RoutedEventArgs) :void - Model_CalculationPerformed(object, CalculatorEventArgs) :void - Button_Click(object, RoutedEventArgs) :void - PerformCalculation(Operation) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:15

Példa Megvalósítás (MainPage.xaml): <Page > <Page.Resources> <!-- új stílusokat adunk meg a vezérlőkre --> <Style x:key="functionbuttonstyle" TargetType="Button"> </Style> </Page.Resources> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <!-- felhelyezzük a vezérlőket a rácsra --> </Grid> </Page> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:16

Példa Megvalósítás (MainPage.xaml.cs): private void MainPage_Loaded( ) { // akkor példányosítunk mindent, amikor az // oldal betöltött _model = new CalculatorModel(); _model.calculationperformed += // modell eseményének társítása _textnumber.text = _model.result.tostring(); } _textnumber.focus(focusstate.keyboard); _textnumber.selectall(); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:17

Az MVVM architektúra Alkalmazásainkat megvalósíthatjuk MVVM architektúrában is, a következő tényezők figyelembe vételével a nézetmodell és a modell a megszokott módon kezelhető a környezetben (pl. alkalmazás osztályban), a nézetmodellt a keret adatforrásaként kell megadni (Frame.DataContext) a parancsok (ICommand) kiválthatóságát manuálisan kell kezelni, mivel nem elérhető a parancskezelő (CommandManager) speciális parancsok (pl. billentyűzetkezelés) nem használhatóak (ugyanakkor használatok nem is célszerű a mobil környezetben) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:18

Példa Feladat: Készítsünk egy egyszerű számológépet, amellyel a négy alapműveletet végezhetjük el, illetve láthatjuk korábbi műveleteinket is. annak érdekében, hogy táblagépen is könnyen használható legyen a felületen gombokat helyezünk el a bevitelhez (számok, tizedespont és törlés), így nem kell billentyűzetet használnunk az alkalmazást MVVM architektúrában építjük fel, a korábban készített modellt (CalculatorModel) és a nézetmodellt (CalculatorViewModel) újra felhasználjuk a modellt kiegészítjük a törlés funkciójával, a nézetmodellt kiegészítjük az új gombok tevékenységeivel ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:19

Példa Tervezés: EventArgs ViewModel::ErrorMessageEventArgs Page View::MainPage {leaf} + ErrorMessageEventArgs(String) «property» + Message() :String App - _viewmodel :CalculatorViewModel Application {leaf} + App() # OnLaunched(LaunchActivatedEventArgs) :void - RootFrame_NavigationFailed(object, NavigationFailedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void - ViewModel_ErrorOccured(object, ErrorMessageEventArgs) :void -_viewmodel - _model :CalculatorModel - _numberfieldvalue :String INotifyPropertyChanged ViewModel::CalculatorViewModel + CalculatorViewModel() - Model_CalculationPerformed(object, CalculatorEventArgs) :void - Calculate(String) :void - OnPropertyChanged(String) :void - OnErrorOccured(String) :void «property» + NumberFieldValue() :String + DecimalSeparator() :String + Calculations() :ObservableCollection<String> + CalculateCommand() :DelegateCommand «event» + PropertyChanged() :PropertyChangedEventHandler + ErrorOccured() :EventHandler<ErrorMessageEventArgs> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:20

Példa Megvalósítás (CalculatorViewModel.cs): private void Calculate(String operatorstring){ switch (operatorstring) { // művelet végrehajtása, amely most már // számjegy, tizedesjel és törlés is lehet case "C": // törlés _model.clear(); NumberFieldValue = "0"; break; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:21

Példa Megvalósítás (CalculatorViewModel.cs): default: if (_numberfieldvalue == "0" && operatorstring!= DecimalSeparator) // 0 esetén lecseréljük a tartalmat // (kivéve, ha tizedesjel jön), // egyébként hozzáírjuk _numberfieldvalue = operatorstring; else // minden más esetben csak hozzáírjuk _numberfieldvalue += operatorstring; OnPropertyChanged("NumberFieldValue"); break; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:22

Példa Megvalósítás (App.xaml.cs): protected override void OnLaunched( LaunchActivatedEventArgs args) { _viewmodel.erroroccured += new EventHandler<ErrorMessageEventArgs>( ViewModel_ErrorOccured); private void ViewModel_ErrorOccured(object sender, ErrorMessageEventArgs e){ MessageDialog dialog = new MessageDialog(e.Message); dialog.showasync(); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:23

Példa Feladat: Készítsünk egy dinamikus méretezhető táblát, amely véletlenszerű színre állítja a kattintott gombot, valamint a vele egy sorban és oszlopban lévőket. MVVM architektúrát használunk, és a korábbi megoldásból felhasználjuk a nézetmodellt (ColorGridViewModel, ColorField) a nézetet ellátjuk oldalcímmel, és betartjuk az elhelyezési konvenciókat, továbbá csúszkákat (Slider) használunk az értékbeállításhoz (amelyet külön címkén is megjelenítünk) a rácsot ItemsControl segítségével helyezzük el, amelyben WrapGrid megjelenítőt használunk (mivel nincs UniformGrid vezérlő) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:24

Példa Tervezés: ViewModelBase ViewModel::ColorGridViewModel App - _viewmodel :ColorGridViewModel Application {leaf} + App() # OnLaunched(LaunchActivatedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void Page View::MainPage {leaf} -_viewmodel - _random :Random - _rowcount :Int32 - _columncount :Int32 + ColorGridViewModel() - GenerateFields() :void - FieldChange(ColorField) :void «property» + RowCount() :Int32 + ColumnCount() :Int32 + Fields() :ObservableCollection<ColorField> + ChangeSizeCommand() :DelegateCommand - _color :Color ViewModelBase ViewModel::ColorField «property» + Row() :Int32 + Column() :Int32 + Color() :Color + FieldChangeCommand() :DelegateCommand ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:25

Példa Megvalósítás (MainPage.xaml): <ItemsControl ItemsSource="{Binding Fields}"> <!-- elemek gyűjtő vezérlője --> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <!-- az elemek egy rácsban fognak elhelyezkedni, amelyet sorfolytonosan töltünk fel --> <WrapGrid Orientation="Horizontal" MaximumRowsOrColumns="{Binding ColumnCount}" /> </ItemsPanelTemplate> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:26

Szinkron és aszinkron programozás A tevékenységek végrehajtásának két megközelítése van: szinkron: a tevékenység kezdeményezője megvárja annak lefutását a hívó szál blokkolódik, amíg a tevékenység lefut ha sokáig tart a tevékenység, akkor az a program felületén is észrevehető aszinkron: a tevékenység kezdeményezője nem várja meg a lefutást, illetve az eredményt a tevékenység (metódus) külön szálon fut az eredményt később megkapjuk (pl. eseményen át) a hívó szál nem blokkolódik, folytathatja a végrehajtást ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:27

Aszinkron műveletek A Windows Runtime működési elveiben fontos, hogy gyorsan reagáljunk a felhasználói interakcióra, a felhasználói felület mindig aktív legyen amennyiben egy nagyobb műveletet hajtunk végre, azt aszinkron módon, háttérben végezzük A tevékenységek jelentős része (pl. ablaknyitás, fájlolvasás, hálózatkezelés) aszinkron műveletként van megvalósítva az a műveletek nevében jelzett (Async) pl.: MessageDialog dialog = ; dialog.showasync(); // aszinkron művelet ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:28

Aszinkron műveletek Aszinkron műveleteket az async kulcsszóval hozhatunk létre aszinkron műveletben lehetőségünk más aszinkron műveletet futtatni, és azt bevárni az await utasítással, pl.: private async void ReadStream(Stream str) { StreamReader reader = new StreamReader(str); String line = await reader.readlineasync(); // aszinkron módon olvasunk, és megvárjuk // a művelet lefutását MessageDialog dialog = new MessageDialog(line); await dialog.showasync(); // megvárjuk a dialógus bezárását } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:29

Aszinkron műveletek A.NET nyelvi könyvtárban több műveletnek adott szinkron/aszinkron megvalósítása is pl. ReadLine(), ReadLineAsync() a Windows Runtime nyelvi könyvtárában jórészt csak az aszinkron műveletek találhatóak meg Lehetőségünk van egy szinkron műveletben megvárni az aszinkron művelet eredményét ehhez blokkolnunk kell a műveletet, az AsTask().Result lekérdezés biztosítja a várakozást pl.: result = dialog.showasync().astask().result; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:30

Időzítés A felület szintű időzítő adott (DispatcherTimer), azonban a modell szintű időzítés (System.Timers.Timer) nem került be az osztálykönyvtárba a funkcionalitása kiváltható a ThreadPoolTimer típussal lehet periodikus, vagy egyszeri nem esemény alapú, konstruktorparaméterben megadható a futtatandó művelet a felhasználásával lehet készíteni saját időzítőt pl. timer = ThreadPoolTimer.CreatePeriodicTimer( Timeout, TimeSpan.FromMinutes(1)); // a Timeout függvényt hívja meg percenként ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:31

Szinkronizáció Amennyiben párhuzamosan végzünk tevékenységet, ügyelnünk kell a szinkronizációra (a felülettel) a felületi időzítő, illetve az aszinkron tevékenységek szinkronizáltak a szálbiztos végrehajtáshoz használnunk kell a Dispatcher.RunAsync(<tevékenység>) metódust, pl. CoreApplication.MainView.CoreWindow.Dispatcher. RunAsync(CoreDispatcherPriority.Normal, // a végrehajtás prioritását is megadjuk () => { // a tevékenység lambda-kifejezése textbox.text = "Hello World!"; })) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:32

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. használjunk MVVM architektúrát, és a korábbi megvalósítást a modellt (ExamGeneratorModel) nem kell módosítanunk, de ki kell egészítenünk egy időzítő (Timer) típussal a nézetmodellben (ExamGeneratorViewModel) szinkronizáltan kell lekezelnünk az időzítő párhuzamos eseményeit a nézet két lapot is tartalmaz (MainPage, SettingsPage), amelyek között navigálunk ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:33

Példa Tervezés: Page View::SettingsPage {leaf} App - _viewmodel :ExamGeneratorViewModel - _model :IExamGeneratorModel Application {leaf} + App() # OnLaunched(LaunchActivatedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void - ViewModel_ApplicationMessaged(object, ApplicationMessageEventArgs) :void - ViewModel_OpenSettings(object, EventArgs) :void - ViewModel_CloseSettingsExecuted(object, EventArgs) :void -_model -_viewmodel View::MainPage ViewModelBase ViewModel::ExamGeneratorViewModel -_model «interface» Model::IExamGeneratorModel Model::ExamGeneratorModel Page {leaf} Model::ElapsedEventArgs + ElapsedEventArgs() «property» + SignalTime() :DateTime IDisposable Model::Timer - _timer :ThreadPoolTimer - _interval :TimeSpan - _autoreset :Boolean - _enabled :Boolean + Elapsed :ElapsedEventHandler + Timer() + Timer(Double) - ~Timer() + Start() :void + Stop() :void + Close() :void + Dispose() :void - Timeout(ThreadPoolTimer) :void - Dispose(Boolean) :void «property» + AutoReset() :Boolean + Enabled() :Boolean + Interval() :Double -_timer ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:34

Példa Megvalósítás (App.xaml.cs): private void ViewModel_OpenSettings(object sender, EventArgs e) { Frame rootframe = Window.Current.Content as Frame; } if (rootframe.cangoforward) // ha már egyszer // átnavigáltunk a beállítások oldalra rootframe.goforward(); // akkor ismét elnavigálhatunk oda else rootframe.navigate(typeof(settingspage)); // különben felvesszük, mint új oldalt ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:35

Példa Megvalósítás (ExamGeneratorViewModel.cs): private async void Model_NumberGenerated( object sender, EventArgs e) { // szinkron műveletben megvárhatjuk az // szinkron végrehajtás végét await CoreApplication.MainView. CoreWindow.Dispatcher. RunAsync(CoreDispatcherPriority.Normal, () => OnPropertyChanged( "QuestionNumber")); // szinkronizált végrehajtás } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 10:36