A InfoWiki wikiből
(→BAML használata kódból) |
Aktuális változat (2009. június 24., 18:25) (lapforrás) (uploaded) |
||
1. sor: | 1. sor: | ||
- | <cim | + | <cim cim2="Windows Presentation Foundation" cim3="Windows Forms Reloaded" prev="" back="Kezdolap" next="" kep="hz_csik.png" szerzo="hz|Hernyák Zoltán"/> |
+ | |||
= XAML és a KÓD kapcsolata = | = XAML és a KÓD kapcsolata = |
Aktuális változat
Tartalomjegyzék |
XAML és a KÓD kapcsolata
A XAML file-unkat akár egy jegyzettömb segítségével is leírhatjuk. Leírás után az alábbi formában lehet felhasználni:
XAML fordítása BAML-re
A BAML a bináris formája a XML file-nak. Az XML file alapjaiban text alapú, feldolgozása struktúrált felépítésének köszönhetően megoldható, de lassú. A BAML ellenben tokenizált XAML, bináris alapokon, így szerkesztése nehézkes (lehetetlen), viszont feldolgozása jelentősen gyorsabb.
A cél a text alapú XAML file BAML-re alakítása. Ehhez a XAML-nek természetesen szintaktikailag jól kell kinéznie (well-formed xml).
A fordítás menete az alábbi
- a XAML file BAML-re alakítása a xamlc.exe segítségével (xaml compiler)
- ennek során a részleges osztályok (partial class) forráskódját is generálja
- mezőket helyez el ezen részleges osztályban
- kódot generál, amely induláskor betölti majd a BAML-t
A generált BAML file-t, és a generált partial class kódot a Visual Studio továbbfordítja a csc.exe segítségével, és előállítja a megfelelő assembly-t, mely tartalmazza a baml file-t mint erőforrás.
XAML használata kódból
Amennyiben a XAML file-t nem szeretnénk fordítani és beágyazni az assembly file-ba, meghagyhatjuk eredeti formájában is. A kulcs a XamlReader.Load(...) metódus. Kódból az alábbi módon lehet ekkor működtetni:
FileStream s = new FileStream("Window1.xml", FileMode.Open); DependencyObject rootElement = (DependencyObject)XamlReader.Load(s);
A betöltött XAML file tartalma egy tetszőleges kontroll Content-je lehet (amennyiben a XAML root eleme ezt lehetővé teszi):
this.Content = rootElement;
Ha a root elem egy form, akkor azt a betöltés után akár azonnal meg is lehet jeleníteni:
(rootElement as Window).ShowDialog();
Mivel ekkor nem generálódtak le az x:Name jellegű mezők és nincsenek összekapcsolva a XAML-beli párjukkal, így ezeknek a kezelését is kódból kell ellátni:
button1 = (Button)LogicalTreeHelper.FindLogicalNode(rootElement, "button1");
Valamint az eseménykezelők sincsenek feliratkozva a megfelelő eseményekre, ezeket is kódból kell felírni:
button1.Click += button1_Click;
BAML használata kódból
Ez a tipikus eset, amit a már tárgyaltunk korábban. A Visual Studio a XAML file-t fordítja, beágyazza, és generálja a szükséges kódot annak futás közbeni betöltésére, és felhasználására.
Valószínű van mód az előzőekben leírt módon dinamikusan betölteni baml leírást is. Megkeresem... (hz)'