Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Továbbított események További ablakok készítése
Programozás III. Továbbított események További ablakok készítése
2
Továbbított események (Routed Events)
Problémafelvetés: Tudjuk, hogy a WPF ablakokban sok felhasználóifelület-elem lehet – gombok, textboxok, egyebek Szeretnénk tudomást szerezni róla, ha a felhasználó bárhol a felhasználói felületen mozgatja az egeret! „Hagyományosan” csak egy megoldást tudunk: az összes felhasználóifelület-elem MouseMove-ját kezelni kell… Tudjuk, hogy a ContentControl-okban több elem is lehet Pl: Button, benne StackPanel és két Rectangle = pause gomb Mire kattintott a felhasználó? Akár a Button „látszó” részeire, akár a StackPanelre vagy a téglalapokra kattintott, nekünk a végén Click esemény kell! Sok esetben jó lenne, ha adott eseményekről nemcsak az adott elem, hanem a tartalmazói is tudomást szereznének Igazából a gombok akkor is több elemből állnak, ha nem rakunk beléjük semmit. Ezt meg lehet mutatni a vizuális fán.
3
Továbbított események (Routed Events)
A WPF felhasználóifelület-elemek eseményei ún. továbbított események Nem csak azon az elemen váltódik ki az esemény, amelyiken tényleg megtörtént Az elem szülőiben is kiváltódik (kiváltódhat) elképzelhető, hogy valamelyik szülő elem kezeli Az egymásba helyezett felhasználóifelület-elemek által alkotott faszerkezetet elemfának nevezzük ContentControl, ItemsControl elemeknél: Content, Items miatt Tartalommenedzserekben (Children) Felhasználóifelület-elemek belső szerkezete is bonyolult lehet! Nemcsak egyféle elemfát értelmezünk: logikai fa, vizuális fa
4
Felhasználóifelület-elemek fája
Az elemek logikai fája (logical tree) mutatja a felhasználói felület elemeinek kapcsolatait Az elemek vizuális fája (visual tree) az egyes elemek belső struktúráját is tartalmazza, a logikai fánál bővebb fogalom Logikai fa: document outline-ban. Vizuális fa: breakpointtal beleállsz bárhova, watchből elérsz egy grafikusfelület-elemet, a nagyító ikonnal előszedheted a visualizert, ez a vizuális fát mutatja.
5
Felhasználóifelület-elemek fája
MainWindow Border AdornerDecorator Logikai fa Pirossal Document Outline-ban ezt látjuk Vizuális fa Piros+cián Debugolás közben megjeleníthető AdornerLayer ContentPresenter Grid Label Button Border Border ContentPresenter ContentPresenter TextBlock TextBlock
6
Továbbított események
A továbbított események az elemfán közlekednek Logikai fán: dinamikus erőforrások, adatkötéskor elemnevek keresése… Vizuális fán: elemek kirajzolása, átlátszóság, transzformációk, IsEnabled, találattesztelés Hibrid: dependency propertyk, továbbított események Továbbítási stratégiák: Felfelé közlekedő („bubbling”) továbbított esemény: először a kiváltó felhasználóifelület-elemen, utána pedig sorra a szülőkön, a gyökérig. Lefelé közlekedő („tunneling”) továbbított esemény: először a gyökéren, majd a kiváltó elem felé vezető szülőkön, legvégül a kiváltó elemen hívódnak meg az eseménykezelők „Direct” továbbított esemény: csak a kiváltó elemen hívódnak meg az eseménykezelők. A dokumentációban (MSDN) minden eseménynél megtalálható, hogy milyen továbbítási stratégiát alkalmaz A továbbított eseményeknél ha minden igaz, kb úgy van, hogy a bubbling események a vizuális fán mennek felfelé, amíg meg nem találják az első logikai elemet. Utána a logikai fán mennek felfelé. Lefelé talán csak a logikai fán mennek.
7
Preview események Bizonyos események, pl.:
KeyDown KeyUp MouseDown MouseUp … … rendelkeznek egy Preview… nevű párral PreviewKeyDown PreviewKeyUp PreviewMouseDown PreviewMouseUp
8
Továbbított események
A PreviewXXX-XXX eseménypárok közül: A PreviewXXX „tunneling” stratégiát alkalmaz Az XXX „bubbling” stratégiát alkalmaz A Preview mindig előbb következik be PreviewMouseDown, MouseDown példa PreviewMouseDown a MainWindow-n. PreviewMouseDown a Griden. PreviewMouseDown a Labelen. MouseDown a Labelen. MouseDown a Griden. MouseDown a MainWindow-n. MainWindow Grid Label Button Vannak működési variációk: pl. a Grid a Labelre való kattintáskor mindig érintett, de ha rajta kattintunk, a MouseDown csak akkor váltódik ki rajta, ha látható (pl. Background nem null). Ha nem így van, akkor a Griden nem, csak a MainWindow-n váltódik ki az esemény - Ezért nehéz a WPF, mert egy rakás ilyen apró kis működési mechanizmust meg kell tanulni. Szinte mindennek vannak ilyen kicsi működési trükkjei Vannak működési variációk: pl. a Grid a Labelre való kattintáskor mindig érintett, de ha rajta kattintunk, a MouseDown csak akkor váltódik ki rajta, ha látható (pl. Background nem null). Ha nem így van, akkor a Griden nem, csak a MainWindow-n váltódik ki az esemény!
9
Preview események A Preview… pár az adott esemény „tényleges” megtörténte előtt fut le Használati módjai: Eseményt megelőző tevékenységek elvégzése „Tényleges” esemény blokkolása (e.Handled) Léteznek kivételek a Preview→tényleges sorrend alól, pl: Button eseményei A Button „feladata” egy Click esemény létrehozása, a PreviewMouseDown-t és …Up-ot konvertálja Click eseménnyé és blokkolja a további események egy részét (= nem fog lefutni a PreviewMouseDown után a MouseDown pár) private void textBoxText_PreviewKeyDown(object sender, KeyEventArgs e) { e.Handled = true; //eredmény: nem lehet gépelni a textboxba }
10
Továbbított események
Ha tudni kell, hogy honnan jött az esemény… sender: az az elem, amelyik éppen kezeli az eseményt. NEM a kiváltó elem! e.Source: az esemény kiváltója (logikai fán) e.OriginalSource: az esemény tényleges kiváltója (vizuális fán) Gyakorlati használat: Felhasználóifelület-elemek egymásba építése esetén a felhasználó felé egy elemnek kell tűnnie A „fő” tartalmazó kezeli az eseményeket Események lefutásának megakadályozása Akár az adott elem, akár a tartalmazók közül valamelyik kezelheti a PreviewXXX-t, és állíthatja az e.Handled-et Több felhasználóifelület-elem ugyanazt a tevékenységet végzi A közös tartalmazójuk kezelheti az eseményeket Pl. számológép! Számológép példánál a korrekt wpf-es megoldás az lenne, ha a buttonok közös tartalmazója – pl egy Panel utód – kezelné a buttonok clickjét. Ezt csak XAML-ban tudjuk megoldani!!!, mert egyik Panelnek sincs Clickje!!!, DE a MouseDown-nal már most is meg tudnánk oldani! A logikai fa-vizuális fa kavarás:
11
Feladat – Egyszerűsített Android jelszómegadó
A kép eredetije:
12
További ablakok készítése
Az ablakokat kétféle módon használhatjuk: Modális megjelenítés: amíg a felhasználó a modális ablakot be nem zárja, nem aktiválhat más ablakot Figyelmeztetés megjelenítése Hibaüzenetek közlése Megerősítések kérése Adatok bekérése Nem modális megjelenítés: más ablakokkal párhuzamosan használható Lehetőségek: MessageBox osztály előre elkészített dialógusablakai (csak modális) Microsoft.Win32 névtér dialógusablakai (csak modális) Saját készítésű ablakok Megmutathatod a powerpointon: ctrl+F nem modális, mentés ablak modális.
13
MessageBox osztály Funkció: olyan üzenetablak megjelenítése, amely tartalmazhat üzenetet, gombokat és ikonokat Nem hozunk létre példányt, hanem az osztály statikus Show tagfüggvényét hívjuk A függvény paraméterei határozzák meg, hogy milyen szöveg, gomb és ikon jelenik meg A visszatérési értéke a MessageBoxResult felsorolás egy eleme, és a bezárás módjáról ad információt Használata: MessageBox.Show("Egysoros üzenet"); MessageBox.Show("Többsoros\nüzenet\nfejléccel", "Üzenet fejléccel");
14
MessageBox paraméterek I.
Megjelenítendő gombok: A megjelenítendő gombokat a MessageBoxButton felsorolás egy elemével határozzuk meg: A Show visszatérési értéke többnyire a megnyomott gomb nevével egyező nevű MessageBoxResult felsoroláselem: MessageBoxResult.OK, MessageBoxResult.Cancel, MessageBoxResult.Yes… A piros X gombbal való bezárás többnyire MessageBoxResult.Cancel, kivéve, ha a MessageBox csak OK értéket tud visszaadni (csak ilyen gombot tartalmaz), mert akkor ez is OK-nak számít. MessageBox.Show("Többsoros\nüzenet\nfejléccel", "Fejléc", MessageBoxButton.YesNoCancel); Felsorolás eleme Leírás OK A dialógus OK gombot tartalmaz OKCancel A dialógus OK és Cancel gombokat tartalaz YesNo A dialógus Yes és No gombokat tartalmaz (a kötelező választás érdekében letiltja a piros X-et!) YesNoCancel A dialógus Yes, No és Cancel gombokat tartalmaz
15
MessageBox paraméterek II.
Megjelenítendő ikon: A megjeleníthető ikon a MessageBoxImage felsorolás egy eleme: MessageBox.Show("Többsoros\nüzenet\nfejléccel", "Fejléc", MessageBoxButton.YesNoCancel, MessageBoxImage.Error); A beállított ikonnak megfelelő hangot lehet hallani közben különben.
16
Microsoft.Win32 névtér dialógusablakai
OpenFileDialog: fájl megnyitásához SaveFileDialog: fájl mentéséhez A ShowDialog() visszatérési értéke: bool? típusú (nullable bool) true: a felhasználó elvégezte az interakciót (a dialógusablakban megadott információ felhasználható) false: „mégsem” jellegű kilépés (a dialógusablakban megadott információ nem felhasználható) null: az ablak még nem záródott be MINDIG ellenőrizni kell! OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == true) { string kivalasztottFajl = openFileDialog.FileName; //... fájl megnyitása, kezelése... }
17
Feladat
18
Feladat – előző kiegészítése
A TextBox TextChanged eseménye szükséges hozzá.
19
Saját ablakok készítése
Saját ablakok használata: .xaml + .xaml.cs fájlok létrehozása: Project -> Add -> Window... Helyezzük el rajta a vezérlőket, állítsuk be a tulajdonságokat, készítsük el a működést Hozzuk létre a példányt, jelenítsük meg a hívó ablakból modálisan/nem modálisan Megjelenítés window.Show(); megjelenít nem modálisan window.ShowDialog(); megjelenít modálisan, bool? visszatérési értéke jelzi, hogy milyen módon zártuk be az ablakot MyWindow window = new MyWindow(); window.Show(); Show: a kód azonnal fut tovább ShowDialog: blokkol MyWindow window = new MyWindow(); if (window.ShowDialog() == true) { //... }
20
Saját ablakok készítése
Ha a saját ablak bezárásának módjáról információt akarunk adni a ShowDialog() függvény visszatérési értékeként: this.DialogResult Ez be is zárja az ablakot Button példányok kapcsolódó tulajdonságai: IsCancel – ESC gomb lenyomására ez a gomb fog megnyomódni, és bezárja az ablakot (általában a Cancel) IsDefault – Enter gomb lenyomására ez a gomb fog megnyomódni (általában az OK) Nem zárja be az ablakot Általában az eseménykezelőben viszont DialogResult-ot állítunk private void Button_Click(object sender, RoutedEventArgs e) { this.DialogResult = true; }
21
Saját ablakok készítése
Saját tervezésű modális ablakokban bekért értékeket tulajdonságokon keresztül szokás visszaadni Minden értékhez készítsünk egy-egy tulajdonságot x:Name="myTextBox" x:FieldModifier="private" A párbeszédablakot aktivizáló ablakban előbb a visszatérési értéket vizsgáljuk meg, majd ennek megfelelően használjuk a tulajdonságokat string nev; string szuletesiHely; int eletkor; SzemelyesAdatWindow adatBekero = new SzemelyesAdatWindow(); if (adatBekero.ShowDialog() == true) { nev = adatBekero.Nev; szuletesiHely = adatBekero.SzuletesiHely; eletkor = adatBekero.Eletkor; }
22
Ablakok tulajdonságai, metódusai, eseményei
A Window ContentControl utód A ContentControl összes tulajdonságát és eseményét lehet használni (Width, Height, Foreground, Background… MouseDown, MouseUp, KeyDown, KeyUp, PreviewXXX… Loaded…) Főbb tulajdonságok: Title (címsor szövege) Topmost (felül marad) WindowStartupLocation (hova jelenjen meg) WindowState (állapot – maximalizált, minimalizált, normál)
23
Ablakok tulajdonságai, metódusai, eseményei
Főbb metódusok: Show() – megjelenítés nem modálisan ShowDialog() – megjelenítés modálisan Close() – bezárás Activate() – előtérbe hozás és aktiválás Hide() – láthatatlanná tétel Főbb események: Closed – bezáródott Closing – bezáródna A Closed előtt történik. Ablak becsukása előtt végrehajtandó eseményekhez használjuk, pl. mentés Activated – aktiválódott Deactivated – deaktiválódott
24
Feladat
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.