WPF bevezető
4. előadás
ESEMÉNYVEZÉRELT PROGRAMOZÁS © Bánsághi Anna
[email protected]
4. ELŐADÁS - WPF BEVEZETÉS
2015 © Bánsághi Anna
1 of 39
WPF bevezető
4. előadás
TEMATIKA I. C# áttekintés II. WPF
2015 © Bánsághi Anna
2 of 39
WPF bevezető
4. előadás
II. WPF BEVEZETŐ 1. Eseménykezelés 2. WPF alrendszer 3. WPF lényegi elemek
2015 © Bánsághi Anna
3 of 39
WPF bevezető
4. előadás
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
WPF bevezető
2015 © Bánsághi Anna
4. előadás
5 of 39
WPF bevezető
4. előadás
ÖSSZETETT ESEMÉNYEK 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
2015 © Bánsághi Anna
6 of 39
WPF bevezető
4. előadás
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) az az osztály vagy objektum, mely az eseményt fogadja (kezeli) 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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
.<eseménynév> += new EventHandler(<metódusnév>); .<eseménynév> -= <metódusnév>;
2015 © Bánsághi Anna
11 of 39
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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 ) { handler( this, EventArgs.Empty ); } // metódus logika
// ha van feliratkozó, akkor // eseménykezelők futtatása
} }
2015 © Bánsághi Anna
15 of 39
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
ARGUMENTUMOK SZÁRMAZTATÁSA public class SajatEsemenyArgumentumok : EventArgs { public SajatEsemenyArgumentumok( string s ) { uzenet = s; } private string Uzenet;
// privát mező
public string Uzenet { get { return uzenet; } set { uzenet = value; } }
// nyilvános tulajdonság a mezőre
}
class Hirdeto { ... public event EventHandler<SajatEsemenyArgumentumok> EseménytKivált; ... }
2015 © Bánsághi Anna
17 of 39
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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 alkalmazás megjelenése, felülete (XAML) code-behind alkalmazás logikája, viselkedése (C#) A SZÉTVÁLASZTÁS ELŐNYEI 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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
VEZÉRLŐK LÉTREHOZÁSA XAML KÓDDAL .xaml
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
WPF bevezető
4. előadás
VISELKEDÉS DEFINIÁLÁSA FELÜLETI ELEMEK .xaml
VISELKEDÉS .xaml.cs private void myButton_Click( object sender, RoutedEventArgs e ) { MessageBox.Show( "Hello World!" ); }
2015 © Bánsághi Anna
22 of 39
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
FELÜLETI ELEMEK OSZTÁLYHIERARCHIÁJA
2015 © Bánsághi Anna
24 of 39
WPF bevezető
4. előadás
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 bevezető
4. előadás
WPF ALKALMAZÁS FORDÍTÁSA
2015 © Bánsághi Anna
26 of 39
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
ABLAK DEFINIÁLÁSA Foablak.xaml <Window x:Class xmlns xmlns:x Title ...
="Nevter.Foablak" ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ="http://schemas.microsoft.com/winfx/2006/xaml" ="Főablak">
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
WPF bevezető
4. előadás
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. 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 2. 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
WPF bevezető
4. előadás
ALKALMAZÁS DEFINIÁLÁSA Alkalmazas.xaml <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"> ...
Alkalmazas.xaml.cs namespace Nevter { public partial class Alkalmazas : Application { ... } }
2015 © Bánsághi Anna
30 of 39
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
ADATKÖTÉS ELEMEI
2015 © Bánsághi Anna
37 of 39
WPF bevezető
4. előadás
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
WPF bevezető
4. előadás
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