ESEMÉNYVEZÉRELT PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 5. ELŐADÁS - ABLAKOK, ERŐFORRÁSOK 2015 Bánsághi Anna 1 of 31
TEMATIKA I. C# áttekintés II. WPF 2015 Bánsághi Anna 2 of 31
II. WPF 1. WPF alkalmazás fejlesztés 2. Ablakok 3. Erőforrások 2015 Bánsághi Anna 3 of 31
1. ALKALMAZÁS a WPF keretrendszer lehetővé teszi a következő fajta alkalmazások és könyvtárak fejlesztését: több ablakból álló desktop kliens alkalmazások több oldalból álló böngésző alapú alkalmazások egyéni fejlesztésű vezérlő könyvtárak (újrafelhasználható, nem futtatható assembly-k) egyéni fejlesztésű osztálykönyvtárak (újrafelhasználható, nem futtatható assembly-k) 2015 Bánsághi Anna 4 of 31
WPF SZOLGÁLTATÁSOK a fejlesztést számos WPF szolgáltatás teszi lehetővé alkalmazás menedzsment erőforrások, tartalom és adatfájlok kezelése ablakok és dialógus dobozok navigáció 2015 Bánsághi Anna 5 of 31
ALKALMAZÁS MENEDZSMENT az Application osztály számos feladatot lát el: az alkalmazás infrastruktúra létrehozása és kezelése (belépési pont, rendszer és bemenő üzenetek kezelése) az alkalmazás életciklus nyomonkövetése parancssori paraméterek feldolgozása alkalmazás szintű tulajdonságok és erőforrások megosztása kezeletlen kivételek detektálása és feldolgozása ablakok / oldalak és az azok közötti navigáció kezelése kilépési kód visszaadása 2015 Bánsághi Anna 6 of 31
DESKTOP ALKALMAZÁS ÉLETCIKLUSA 2015 Bánsághi Anna 7 of 31
BÖNGÉSZŐ ALKALMAZÁS ÉLETCIKLUSA 2015 Bánsághi Anna 8 of 31
2. ABLAKOK, DIALÓGUS DOBOZOK a felhasználó ablakokon keresztül kommunikál az alkalmazással az alkalmazás tartalma az ablakokban jelenik meg, az alkalmazás funkcionalitása az ablakokon keresztül érhető el a Windows osztály feladatai: ablakok létrehozása és láthatóvá tétele az ablakok közötti tulajdonos / tulajdon reláció kiépítése az ablakok megjelenésének konfigurációja az ablak életciklus nyomonkövetése 2015 Bánsághi Anna 9 of 31
DIALÓGUS DOBOZOK a Window osztály lehetővé teszi speciális ablakok, ún. dialógus dobozok származtatását modal dialógus dobozok felhasználói beavatkozás után engedik a programot tovább futni, általában OK és Cancel gombokkal modeless dialógus dobozok nem állítják meg a program futását, hanem megengedik más ablakokon a felhasználói tevékenységek végrehajtását 2015 Bánsághi Anna 10 of 31
ABLAKOK JELLEMZŐI - WINDOW CLASS az ablakokban megjelenő tartalom függ az alkalmazás által kezelt adatoktól, ami lehet például média, XAML oldal, web oldal, dokumentum, adatbázis elem, rendszer információ 2015 Bánsághi Anna 11 of 31
nem-kliens terület részek ABLAK TERÜLETEK a WPF által implementált általános ablak kliens terület a fejlesztő által használható terület az alkalmazás specifikus tartalom megjelenítésére 2015 Bánsághi Anna 12 of 31
MARKUP ELEMEK INICIALIZÁLÁSA az InitializeComponent metódust a markup-beli részleges osztály implementálja, és a markup-ban definiált tulajdonságok beállítása és események regisztrálása történik namespace Nevter { public partial class Ablak : Window { public Ablak { InitializeComponent(); } } } 2015 Bánsághi Anna 13 of 31
ABLAK ÉLETCIKLUSA megnyitás aktiválás bezárás 2015 Bánsághi Anna 14 of 31
ABLAKOK MEGNYITÁSA <Application x:class ="Nevter.Alkalmazas" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" Startup ="app_startup"> <!-- az alkalmazás Startup eseménye bekövetkezésekor nyílik meg az ablak -->... </Application> namespace Nevter { public partial class Alkalmazas : Application { void app_startup( object sender, StartupEventArgs e ) { // az első példányosított ablak lesz az alkalmazás főablaka (MainWindow) var foablak = new Ablak(); } } } // ablak megnyitása modeless módban foablak.show(); 2015 Bánsághi Anna 15 of 31
AUTOMATIKUS FŐABLAK SPECIFIKÁLÁS <Application x:class ="Nevter.Alkalmazas" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri ="Ablak.xaml"> <!-- az alkalmazás StartupUri tulajdonsága tartalmazza a modeless módban megnyitandó főablak markup-ját -->... </Application> namespace Nevter { public partial class Alkalmazas : Application {} } 2015 Bánsághi Anna 16 of 31
ABLAKOK TULAJDONJOGAI két ablak között nincs kapcsolat, hacsak azt külön meg nem adjuk az egymással összehangoltan működő ablakok között beállítható egy tulajdonjogi viszony namespace Nevter { public partial class Ablak : Window { public Ablak { InitializeComponent(); } } } var tulajdonbanlevoablak = new Window(); tulajdonbanlevoablak.owner = this; // ezen ablak objektum a tulajdonos tulajdonbanlevoablak.show(); 2015 Bánsághi Anna 17 of 31
ABLAKOK AKTIVÁLÁSA egy alkalmazásban egyszerre egy ablak lehet aktív aktiválás az ablak első megnyitásakor aktív ablakká válik, felfogja a felhasználói bemeneteket, kiváltja az Activated eseményt deaktiválás egy másik ablak aktiválásakor az addig aktív ablak deaktívvá válik, és kiváltja a Deactivated eseményt, miközben az új aktív ablak az Activated eseményt egy deaktivált ablak is futtathat kódot, sőt, néha kifejezetten erre van szükség 2015 Bánsághi Anna 18 of 31
ABLAK BEZÁRÁSA egy ablak bezárását a nem-kliens terület különféle elemein hívott Close metódus teszi lehetővé, mely két eseményt vált ki: Closing ezen esemény alatt az ablak bezárás még megakadályozható, pl. nem mentett adatok esetén Closed ha a Closing esemény kezeletlen maradt, vagy nem lett megszakítva a bezárás, akkor váltódik ki a Closed esemény 2015 Bánsághi Anna 19 of 31
ABLAKOK TULAJDONSÁGAI a képernyőn az ablak elhelyezkedése a Left és Top koordinátákkal szabályozható a Topmost tulajdonsággal szabályozható, hogy melyik legyen a legfelső ablak az ablak mérete a SizeToContent, Widht, Height, MinWidht, MinHeight tulajdonságokkal szabályozható az ablak háromféle Minimized állapotban lehet: Normal, Maximized, a nem-kliens terület megjelenés ét elsősorban a WindowStyle tulajdonság beállításával szabályozhatjuk 2015 Bánsághi Anna 20 of 31
DIALÓGUS DOBOZOK egy desktop alkalmazás általában egy főablakból áll, amely egyrészt megjeleníti az alkalmazásban kezelt adatokat, másrészt felhasználói felületet (menük, eszköztárak, státuszsor) biztosít ezen adatok feldolgozásához a főablak mellett dialógus dobozok használhatók speciális információ megjelenítésére vagy információ gyűjtésére a WPF különféle dialógus dobozok létrehozását teszi lehetővé, továbbá saját osztályokat is definiálhatunk 2015 Bánsághi Anna 21 of 31
BEÉPÍTETT DIALÓGUS DOBOZOK szöveges információ megjelenítésére, és gombokkal vezérelhető döntés meghozatalára szolgál a speciális üzenet doboz: MessageBox az újrafelhasználhatóság és a konzisztens felhasználói élmény támogatására szolgálnak az általános dialógus dobozok: OpenFileDialog SaveFileDialog PrintDialog 2015 Bánsághi Anna 22 of 31
MESSAGEBOX var eredmeny = MessageBox.Show( "üzenet szövege", "ablak címe", MessageBoxButton gombok, // a megjelenítendő gombok, pl. YesNoCancel MessageBoxImage ikon // a szöveg melletti ikon típusa, pl. Warning ); //... switch( eredmeny ) { case MessageBoxResult.Yes: // a felhasználó a Yes gombot nyomta meg, a teendő kódja... break; case MessageBoxResult.No: // a felhasználó a No gombot nyomta meg, a teendő kódja... break; case MessageBoxResult.Cancel: // a felhasználó a Cancel gombot nyomta meg, a teendő kódja... break; } 2015 Bánsághi Anna 23 of 31
3. ERŐFORRÁSOK az alkalmazás tetszőleges pontjáról elérhető objektumok XAML erőforrások adat fájlok stílusok, sablonok, adatok nem futtatható tartalom, erőforrás vagy adat fájlok 2015 Bánsághi Anna 24 of 31
XAML ERŐFORRÁSOK létrehozhatók mind a markup, mind a code-behind fájlban minden FrameworkElement típusú elemnek van egy Resources attribútuma, az ún. ResourceDictionary, melyben kulcs - érték párokként definiálhatók az erőforrás objektumok valamely elemen definiált erőforrás az elemből és annak részfájából érhető el az alkalmazásra globális erőforrásokat az Application elemben, valamely ablakra vagy vezérlőre lokális erőforrásokat az adott ablakban vagy vezérlőben definiáljuk 2015 Bánsághi Anna 25 of 31
ERŐFORRÁSOK HIVATKOZÁSA minden erőforrásnak rendelkeznie kell egyedi kulccsal, melyet az x:key direktívában explicite rögzíthetünk a definiált erőforrásra az egyedi kulcsán keresztül hivatkozunk <Window.Resources> <sys:string x:key="gombfelirat">hello, world!</sys:string> </Window.Resources> <Button Content="{StaticResource gombfelirat}" /> this.resources["gombfelirat"] = "Valami más szöveg"; // this = Window 2015 Bánsághi Anna 26 of 31
STÍLUS ERŐFORRÁS PÉLDA <Window.Resources> <Style TargetType="Button" x:key="pirosgomb"> <Setter Property="Background" Value="Red" /> <Setter Property="Foreground" Value="White" /> </Style> </Window.Resources> <Button Style="{StaticResource pirosgomb}" Content="Hello" /> 2015 Bánsághi Anna 27 of 31
ERŐFORRÁSOK KERESÉSE a XAML betöltő a vezérlők logikai fáján először a legközelebbi csomóponthoz rendelt erőforrásokat keresi és tölti be ha nem talált, akkor megy tovább felfelé a fán, és ha talál a kiinduló vezérlőn tartozó erőforrást, akkor betölti ha nem talált sehol betölthető erőforrást, akkor végül eljut az Application gyökérhez, és az ahhoz rendelt (alapértelmezett) erőforrásokat tölti be 2015 Bánsághi Anna 28 of 31
ERŐFORRÁS FAJTÁK statikus egyszer, a XAML betöltésekor kerülnek feloldásra a referenciák <Button Background="{StaticResource hatterszin}" Content="Hello" /> dinamikus csak akkor kerülnek feloldásra a referenciák, amikor azokra szükség van, illetve amikor az erőforrás megváltozik <Button Background="{DynamicResource hatterszin}" Content="Hello" /> 2015 Bánsághi Anna 29 of 31
explicit ERŐFORRÁS KULCSOK a programozó által megadott kulcs implicit a kulcs egy másik tulajdonság értékéből automatikusan áll elő (pl. stílusok) <!-- a TargetType tulajdonság értéke a kulcs --> <!-- a stílus az ablakban található összes gombra automatikusan érvényes lesz --> <Window.Resources> <Style TargetType="Button"> <Setter Property="Background" Value="Red" /> <Setter Property="Foreground" Value="White" /> </Style> </Window.Resources> <!-- nincs olyan, hogy Style={StaticResource Button} --> <Button Content="Hello" /> 2015 Bánsághi Anna 30 of 31
ERŐFORRÁS FÁJLOK az erőforrásokat kiemelhetjük egy vagy több önálló XAML fájlba, majd a kívánt alkalmazásokaban hivatkozhatunk a fájlokra <Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Stilusok.xaml"/> <ResourceDictionary Source="Sablonok.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources> 2015 Bánsághi Anna 31 of 31