ESEMÉNYVEZÉRELT PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 4. ELŐADÁS - WPF BEVEZETÉS 2015 Bánsághi Anna 1 of 39
TEMATIKA I. C# áttekintés II. WPF 2015 Bánsághi Anna 2 of 39
II. WPF BEVEZETŐ 1. Eseménykezelés 2. WPF alrendszer 3. WPF lényegi elemek 2015 Bánsághi Anna 3 of 39
1. ESEMÉNYEK a C# nyelvi szinten valósítja meg az eseménykezelést, amelyhez eseményeket (event) és delegáltakat (delegate) használ az eseménykezelő egy szabványos metódus, de mindig két paramétere van, a küldő objektum, illetve az eseménytulajdonságok, amelyek leszármazottai hordozhatnak speciális értéket a delegált szabja meg az eseménytulajdonságok (EventArgs) típusát 2015 Bánsághi Anna 4 of 39
2015 Bánsághi Anna 5 of 39
az összetett események úgy valósulnak meg, hogy a program egy egyszerű eseményre kivált egy másikat az egérrel kattintunk, és az egér a gombon van, akkor kiváltódik a gomb kattintása esemény tehát az eseménykezelés egy több lépcsős, ciklikus folyamat ÖSSZETETT ESEMÉNYEK 2015 Bánsághi Anna 6 of 39
HIRDETŐ - FELIRATKOZÓ egyik osztály vagy objektum értesít egy másik osztályt vagy objektumot, hogy valami (annak érdeklődésére számottartó dolog) történt hirdető (publisher) az az osztály vagy objektum, mely az eseményt küldi (kiváltja) feliratkozó (subscriber) eseményt fogadja (kezeli) az az osztály vagy objektum, mely az grafikus alkalmazásokban az események kiváltói általában a vezérlők, azaz gombok, listaelemek, választók a vezérlők számos beépített eseménye közül (kattintás, húzás, kipipálás) választjuk ki azokat, melyeket kezelni fogunk 2015 Bánsághi Anna 7 of 39
ESEMÉNYEK TULAJDONSÁGAI a hirdető felelőssége, hogy egy esemény mikor váltódik ki, a feliratkozó felelőssége, hogy az eseményre válaszul milyen tevékenység hajtódik végre egy eseménynek több feliratkozója is lehet, egy feliratkozó különféle hirdetőktől érkező különféle eseményt is tud kezelni egyszerre azok az események, melyekre nincs feliratkozó, sosem váltódnak ki egy több feliratkozóval rendelkező esemény kiváltása esetén az eseménykezelők szinkronizáltan hívódnak meg, de lehetőség van aszinkron eseménykezelésre is 2015 Bánsághi Anna 8 of 39
ESEMÉNYEK TULAJDONSÁGAI minden esemény a System.EventHandler delegált típuson alapul public delegate void EventHandler( object sender, EventArgs e ); az eseménynek van: küldője (sender) kiváltja az eseményt, pl. gomb, lista tulajdonságai (arguments) meghatározzák az esemény paramétereit, pl. egér pozíciója a húzáskor, kiválasztott listaelem indexe lehet delegáltakat létrehozni, vagy sablont használni más tulajdonságokhoz 2015 Bánsághi Anna 9 of 39
ESEMÉNYEK A HIRDETŐBEN a hirdető osztályban az esemény a tagok között class Hirdeto { // mezők // tulajdonságok // események public event EventHandler EseménytKivált; // konstruktorok // metódusok 2015 Bánsághi Anna 10 of 39
FELIRATKOZÁS ESEMÉNYEKRE az eseménykezelő hozzárendelésekor az eseménykezelő nevét kell megadnunk a += operátor lehetővé teszi, hogy egy eseményhez több eseménykezelőt is hozzárendeljünk a társításban bármely objektum eseményét rendelhetjük bármely, azonos szignatúrájú eseménykezelőhöz a -= operátor segítségével tudjuk bontatni a kapcsolatot <objektumnév>.<eseménynév> += new EventHandler(<metódusnév>); <objektumnév>.<eseménynév> -= <metódusnév>; 2015 Bánsághi Anna 11 of 39
FELIRATKOZÁS ESEMÉNYEKRE a feliratkozó osztályt vagy objektumot az eseménykezelőjével feliratjuk az imént létrehozott eseményre class Program { static void Main() { Hirdeto.EseménytKivált += Feliratkozo.EseménytKezel; a feliratkozó osztályban definiáljuk az eseménykezelőt class Feliratkozo { // mezők // tulajdonságok // konstruktorok // metódusok public void EseménytKezel( object sender, EventArgs args ) { // eseménykezelő logika 2015 Bánsághi Anna 12 of 39
ESEMÉNYEK KIVÁLTÁSA események kiváltása az esemény meghívásával történik, ahol átadjuk a megfelelő paramétereket esemény csak akkor váltható ki, ha van hozzárendelve eseménykezelő, különben az esemény null értéknek felel meg (és így kivételt kapunk) általában a kiváltást külön metódusban végezzük 2015 Bánsághi Anna 13 of 39
ESEMÉNYKEZELŐK HÍVÁSA - ELVBEN class Hirdeto { // mezők // tulajdonságok // események public event EventHandler EseménytKivált; // konstruktorok // metódusok public void ÉrdeklődésreSzámottartóMetódus( formális paraméterek ) { // metódus logika // EventHandler típusú delegált példány hívása // küldő és argumentumok paraméterekkel this.eseménytkivált( this, EventArgs.Empty ); // metódus logika 2015 Bánsághi Anna 14 of 39
ESEMÉNYKEZELŐK HÍVÁSA - GYAKORLATBAN class Hirdeto {... public event EventHandler EseménytKivált; public void ÉrdeklődésreSzámottartóMetódus( formális paraméterek ) { // metódus logika // temporális változó, hogy a fel- és leiratkozók ne keveredjenek EventHandler handler = this.eseménytkivált; if( handler!= null ) { // ha van feliratkozó, akkor handler( this, EventArgs.Empty ); // eseménykezelők futtatása // metódus logika 2015 Bánsághi Anna 15 of 39
ESEMÉNYKEZELŐK HÍVÁSA - MÉG SZEBBEN class Hirdeto {... public event EventHandler EseménytKivált; public void ÉrdeklődésreSzámottartóMetódus( formális paraméterek ) { // metódus logika OnEsemenytKivalt( EventArgs.Empty ); // metódus logika protected virtual void OnEsemenytKivalt( EventArgs e ) { EventHandler handler = this.eseménytkivált; if( handler!= null ) { handler( this, e ); 2015 Bánsághi Anna 16 of 39
ARGUMENTUMOK SZÁRMAZTATÁSA public class SajatEsemenyArgumentumok : EventArgs { public SajatEsemenyArgumentumok( string s ) { uzenet = s; private string Uzenet; public string Uzenet { get { return uzenet; set { uzenet = value; // privát mező // nyilvános tulajdonság a mezőre class Hirdeto {... public event EventHandler<SajatEsemenyArgumentumok> EseménytKivált;... 2015 Bánsághi Anna 17 of 39
2. WPF ALRENDSZER Windows operációs rendszeren futó.net környezet alrendszere, mellyel kliens alkalmazások fejleszthetők mind desktop, mind böngésző-alapú webes alkalmazások a magja a képfelbontás független, vektor alapú renderelő motor (Direct3D) a 3D grafikus kártyák kihasználására lehetőséget ad a felület deklaratív leírására, Extensible Application Markup Language (XAML) jóval nagyobb testre szabhatóságot biztosít (megjelenítés és stílusok átdefiniálási lehetősége, megjelenítési tulajdonságok erőforrás-alapú tárolása) a WPF típusai nagyrészt a System.Windows névtérben találhatók 2015 Bánsághi Anna 18 of 39
FELÜLET ÉS VISELKEDÉS az alkalmazásfejlesztés során használható mind a deklaratív markup nyelv, mind az imperatív - objektumorientált nyelv markup code-behind alkalmazás megjelenése, felülete (XAML) A SZÉTVÁLASZTÁS ELŐNYEI alkalmazás logikája, viselkedése (C#) a függetlenített megjelenés és vezérlés jelentősen javít az alkalmazás architektúrán, a minőségen specializált fejlesztőkörnyezetek a két nyelvhez Expession Blend a felülettervezők számára Visual Studio a programozók számára 2015 Bánsághi Anna 19 of 39
MARKUP a XAML egy XML alapú deklaratív nyelv, ablakok, dialógus dobozok, oldalak, felhasználói vezérlők létrehozására, és ezeket további vezérlőkkel, alakzatokkal, grafikákkal való feltöltésére használjuk ablakokban vagy oldalakon elhelyezhető és viselkedéssel bíró grafikus elemeket hívjuk vezérlőknek (Controls) minden XAML vezérlő megfeleltethető egy System.Windows.Controls névtérbeli osztálynak, a deklaratív leírás pedig egy imperatív kódnak így minden, amit XAML-ben leírunk, leírható kóddal is, és dinamikusan (kódból) is létrehozhatunk vezérlőket megadjuk tulajdonságaikat (Properties) (pozíció, méret, tartalom) és viselkedésüket (Events) (eseményekkel vagy parancsokkal) 2015 Bánsághi Anna 20 of 39
VEZÉRLŐK LÉTREHOZÁSA XAML KÓDDAL.xaml <Canvas Name="myCanvas"> <Button Name="myButton" Content="Kattints" Width="45" /> </Canvas> C# KÓDDAL.xaml.cs Canvas mycanvas = new Canvas(); Button mybutton = new Button(); mybutton.content = "Kattints"; mybutton.width = 45; mycanvas.addchild( mybutton ); 2015 Bánsághi Anna 21 of 39
VISELKEDÉS DEFINIÁLÁSA FELÜLETI ELEMEK.xaml <Canvas Name="myCanvas"> <Button Name="myButton" Content="Kattints" Width="45" Click="myButton_Click" /> </Canvas> VISELKEDÉS.xaml.cs private void mybutton_click( object sender, RoutedEventArgs e ) { MessageBox.Show( "Hello World!" ); 2015 Bánsághi Anna 22 of 39
VISUAL STUDIO a Visual Studio biztosít egy egyszerű felülettervező eszközt, mellyel grafikusan készíthetjük el a GUI-t, a hozzá tartozó.xaml kód pedig legenerálódik, így nem szükséges a teljes kódot megírnunk egy eszköztárból (ToolBox) válogathatunk a vezérlők közül, melyeket grafikusan (drag-and-drop módszerrel) helyezhetjük el a felületre a felületi elemek tulajdonságait és eseményeit külön menüben állíthatjuk bármikor válthatunk a felületi kód és a tervező nézet között, és felváltva szerkeszthetjük a felületet 2015 Bánsághi Anna 23 of 39
FELÜLETI ELEMEK OSZTÁLYHIERARCHIÁJA 2015 Bánsághi Anna 24 of 39
3. WPF LÉNYEGI ELEMEI konzol felületű alkalmazások csak billentyűzetről fogadnak bemenetet a programfutás meghatározott pontjain, a vezérlés módját mi szabályozzuk (pl. főprogram, menü) grafikus felületű alkalmazások billentyűzetről és egértől (érintőképernyőtől, stb.) fogadnak bemenetet a programfutás szinte bármely pillanatában, a vezérlés módja előre definiált a vezérlést az alkalmazás osztály (Application) látja el, kezeli a felhasználói bevitelt, a felület elemeit, beállítja az alkalmazástulajdonságokat (megjelenés, elérési útvonal,...) 2015 Bánsághi Anna 25 of 39
WPF ALKALMAZÁS FORDÍTÁSA 2015 Bánsághi Anna 26 of 39
RÉSZLEGES OSZTÁLYOK lehetőség van arra, hogy egy osztály (class), interfész (interface) vagy rekord (struct) definícióját részletekben, akár több különböző fájlban adjuk meg a részek fordításkor kerülnek összefésülésre public partial class Pont { public int Kerulet() {... // keruletek.cs public partial class Pont { public void Terulet() {... // teruletek.cs 2015 Bánsághi Anna 27 of 39
Foablak.xaml ABLAK DEFINIÁLÁSA <Window x:class ="Nevter.Foablak" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" Title ="Főablak">... <!-- csak egy elem helyezhető az ablakba, pl. Grid --> </Window> Foablak.xaml.cs namespace Nevter { public partial class Foablak : Window { public Foablak { // konstruktor InitializeComponent(); // a felületi kód futtatása 2015 Bánsághi Anna 28 of 39
MARKUP ÉS CODE-BEHIND ÖSSZEKAPCSOLÁSA ahhoz, hogy a felületi és a háttérkód együtt tudjon működni, két dolog szükséges 1. 2. a felületi kódban a gyökér elemnek rendelkeznie kell az x:class attribútummal. A felületi kódból generálódik egy gyökér elem osztályból származó részleges osztály, az x:class attribútumban adott néven a háttérkódban az osztály részleges kell hogy legyen, neve a felületi kódban az x:class attribútumban megadott név, és a gyökér elem osztályából származik fordításkor a felületi kódból generált és az általunk karbantartott részleges osztály összerendelődik 2015 Bánsághi Anna 29 of 39
Alkalmazas.xaml ALKALMAZÁS DEFINIÁLÁSA <Application x:class ="Nevter.Alkalmazas" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri ="Foablak.xaml"> <!-- indításkor automatikusan megnyíló ablak -->... </Application> Alkalmazas.xaml.cs namespace Nevter { public partial class Alkalmazas : Application {... 2015 Bánsághi Anna 30 of 39
3. WPF ÁTTEKINTÉS a WPF különféle bemenet típusokat támogat, úgymint szöveg, érintőképernyő, egér, parancsok, fókusz, drag-and-drop, digitális tinta ezen bemeneteket a bemenetkezelő kapja el, majd a felületi elemeken kiváltódnak az események kétféle mechanizmus áll rendelkezésre az események hatására bekövetkező alkalmazás logika hívására: eseménykezelés Nicsak, valami történt! parancskiadás Csináld ezt! 2015 Bánsághi Anna 31 of 39
ESEMÉNYEK KÉT FAJTÁJA egy ablakon vagy oldalon elhelyezett vezérlő példányok hierarchikus szerkezetbe (Logical Tree) szervezettek a felületi kód szerkezetének megfelelően direct events csak a kiváltó vezérlőn belül hívhatók az eseménykezelők routed events az eseményt kiváltó vezérlő ősein vagy leszármazottain belül is hívhatók az eseménykezelők 2015 Bánsághi Anna 32 of 39
PARANCSOK - COMMANDS szétválasztható a felhasználói tevékenységet figyelő és az ezen tevékenységre reagáló kód, ez utóbbit hívjuk parancsnak ráadásul ha több vezérlő hasonló reakciót igényel, akkor a parancs bármelyiken meghívható gyakori alkalmazási területe vezérlők IsEnabled tulajdonságának egyetlen paranccsal történő beállítása léteznek előre definiált parancsok, de mi magunk is létrehozhatunk 2015 Bánsághi Anna 33 of 39
ELRENDEZÉS - LAYOUT a vezérlők relatív pozícionálása lehetővé teszi, hogy az ablakon elhelyezett vezérlők elrendezése alkalmazkodjon az ablak méretének változásához ez egy kétlépéses folyamat 1. a vezérlő közli a szülő elemmel, hogy hol és milyen méretű helyre van szüksége 2. a szülő elem közli, hogy mennyi helyet tud biztosítani elrendezés típusok: Canvas, DockPanel, Grid, StackPanel, VirtualizingStackPanel, WrapPanel 2015 Bánsághi Anna 34 of 39
ADATKÖTÉS - DATA BINDING a legtöbb alkalmazás lehetővé teszi, hogy felhasználói különféle adatokat nézegessenek, szerkesszenek az adattárolás és az adatelérés történhet pl. távoli hívással, adatbáziskezelőrendszerrel miután az adatbázisból betöltődtek az adatok a program objektumaiba, két dolgot kell biztosítani az alkalmazásban: 1. az adatok megjelenítéséhez, szerkesztéséhez az objektumokból a vezérlőkbe kell másolni az adatokat 2. a vezérlőkben módosított adatokat vissza kell másolni az objektumokba 2015 Bánsághi Anna 35 of 39
ADATKÖTÉS ELVEI szinte az összes felületi elem a FrameworkElement osztály leszármazottja, és így örökli a DataContext tulajdonságot egy felületi elem DataContext tulajdonságában adjuk meg a kötendő objektumot a DataContext specifikálja, hogy az adatkötésben melyik felületi elem melyik objektummal áll kapcsolatban amint a DataContext beállításra került, a felületi elem eléri az adott objektum tulajdonságait a DataContext értéke elérhető az összes gyerek vezérlőben 2015 Bánsághi Anna 36 of 39
ADATKÖTÉS ELEMEI 2015 Bánsághi Anna 37 of 39
SABLONOK - TEMPLATING a megjelenés és a logika szétválasztásának elve nemcsak az alkalmazásarchitektúrára (XAML és C# részleges osztályok), hanem alacsonyabb szinten, a vezérlőkön is érvényes a vezérlőknek két teljesen szétválasztható része van: logika az eseménykezeléssel, parancsokkal, adatkötéssel megjelenés a látvány, a stílusok a ContentControl osztályban definiálva, mely tovább bontható: ControlTemplate a vezérlő kinézete DataTemplate a vezérlőben tárolt adat kinézete 2015 Bánsághi Anna 38 of 39
ERŐFORRÁSOK - RESOURCES az erőforrás egy olyan objektum, mely az alkalmazás tetszőleges pontjáról elérhető a megjelenéshez kapcsolódó sablonokat megadhatjuk erőforrásokként a saját magunk által definiált parancsokat szintén definiálhatjuk erőforrásokként 2015 Bánsághi Anna 39 of 39