Windows Presentation Foundation
A .NET 3.0-s keretrendszer egyik grafikus alrendszere, amelyben a XAML (Extensible
Application Markup Language, ejtsd: ”zeml”, kb.: kiterjeszthető alkalmazás-leíró
nyelv) nyelv segítségével grafikus felhasználói felületet építhetünk. Windows XP
SP2 alá telepíthető, vagy későbbi Microsoft operációs rendszereknek alapból része.
Következetes programozási modellt ad az alkalmazásfejlesztőknek szétválasztva a
megjelenítést az üzleti logikától. A kimenete egyaránt lehet futtatható állomány
vagy webes szerveren futó alkalmazás – XBAP (XAML Browser Application). A célja
egységesíteni a webes és Windows Formos programok megjelenítési formáit, mint UI
elemek, dokumentumok, tipográfia, vektoros vagy raszteres grafikai elemek, animációk,
hang és videó fájlok. A WPF menedzselt kóddal érhető el, de az tulajdonképpen egy
MIL (Media Integration Layer)-nek nevezett rétegen keresztül DirectX-es hívásokkal
operál, lerendereli térben a WPF által nyújtott látványt. Különböző komponensei
felelősek az objektumok értékeinek értelmezéséről, beállításáról, eseménykezelésről,
megjelenés (layout) vezérléséről, az adatkötésről. A WPF-es objektumok tulajdonságainak
megváltozása a rájuk kötött eseménykezelőkön keresztül „magától” végzi el a felhasználói
felület frissítését. Ez lehetővé teszi a deklaratív XAML leíró nyelv használatát,
attribútumok közvetlen kötését WPF-es osztályokhoz, tulajdonságokhoz. Az UI részei
a Visual osztály elemei, ezek csúcsokként kerülnek be egy felépítő fának (composition
tree) nevezett hierarchiába, a megjelenítési attribútumaikkal, pl. a megjelenítéskor
rajtuk alkalmazandó grafikus transzformációkkal. Így az egész felhasználói felület
a felépítő fa csúcsaiként ábrázolható. A MIL ezt a fát bejárva rajzol akár hardveres
gyorsítással a képernyőn megjelenő felületre, térben hátulról előre haladva, értelmezve
az átlátszóságot. Az animációk effektek (pl. dropshadows – árnyék vetés, blurring
– elhomályosítás) tulajdonságokra alkalmazásával jönnek létre, megadott időtartammal,
kezdő és befejezési időponttal. Az animálást a MIL végzi a fa köztes időpontokban
történő módosításával. A WPF alkalmazások két szálon futnak, egyikük kezeli a felhasználói
felület elemeit, a másik a rajzolással foglalkozik. A UI szál Dispatcher-e végrehajtási
sort kezel a változtatásokról, ezeket prioritásuk alapján időbeli sorrendben hajtja
végre. A megjelenítésért felelős szál két fő folyamata a Measure és az Arrange.
A Measure (mérés) fázisban rekurzívan lekérdezésre kerülnek az objektumok helyfoglalásának
méretei, az Arrange fázisban a gyerek elemek rekurzívan elrendeződnek a szülőktől
átvett layout modell alapján. A WPF vektor alapú megjelenítésének köszönhetően veszteségmentesen
történhet az átméretezés, nagyítás, kétdimenziós felületek 3D-s vetítése natív módon.
WPF-es kódban futtatható Windows API kód és fordítva, valamint korábbi Windows Forms-os
elemek is az ElementHost és WindowsFormsHost osztályokon keresztül. Adatkötést lehet
létrehozni megfelelő tulajdonságokra, a frissítés szempontjából egy vagy kétirányú,
akár LINQ-es adatforrásból is. A Windows Formsból ismert Controlok sablonok alapján
teljesen felüldefiniálhatók megjelenésükben, akár további controlokat is tartalmazhatnak.
Szélsőséges esetben egy szövegbeviteli mezőben futtatható egy videófájl. A DocumentReader
osztállyal lapozható, változtatható megjelenésű dokumentum-olvasót lehet betölteni
az alkalmazásunkba. A Microsoft Silverlight a WPF speciális, csak webes felületen
futó része, a Flash konkurenciájának szánta a Microsoft, így az platformfüggetlen,
XAML-t használ, de a 3D-s megjelenítést nem támogatja.
WPF a gyakorlatban
A WPF a Visual Studio 2008 fejlesztőkörnyezetben jelent meg, sima vagy webes alkalmazásként.
A létrehozható új projektek között Visual C#?Windows?WPF Application vagy WPF Browser
Application pontnál lehet ilyen programot létrehozni.
Ugyanúgy húzd és ejtsd módszerrel helyezhetők a grafikus felületre controlok, mint
egy sima Windows Forms alkalmazásnál. Az újdonság a CIDER, a WPF-es szerkesztő rész,
ezen a generált kód a megjelenített felület alatt található.
A grafikus felület, azaz a XAML kód a példánkban Window1.xaml fájlban generálódik,
a hozzá kapcsolt C# kód a Window1.xaml.cs-be kerülhet. Ilyen lehet például egy gomb
lenyomásának eseménykezelő függvénye. A toolbox-ról egy gombot helyezve a felületünkre,
azon kettőt kattintva létrehozhatunk egy üres kattintás-eseménykezelőt, amibe elhelyezhetjük
a C# kódunkat.
A következő kódrészlet például egy RichTextBox típusú RTB szövegdoboz tartalmát
menti ki a megadott elérési útvonalon található fájlba:
private void button1_Click(object sender, RoutedEventArgs e) { CommonSaveFileDialog
saveFile = new CommonSaveFileDialog(); FileStream xamlFile = null; saveFile.EnableMiniMode
= true; try { saveFile.ShowDialog(); if (saveFile.FileName == String.Empty) return;
xamlFile = new FileStream(saveFile.FileName, FileMode.Create); } catch (Exception
exc) { System.Windows.MessageBox.Show(exc.Message); return; } FlowDocument doc =
RTB.Document; XamlWriter.Save(doc, xamlFile); xamlFile.Close(); }
Annak érzékeltetésére, hogy „kód” nélkül is lehet XAML-ben programozni álljon itt
egy kódrészlet, ami egy stílust határoz meg a TreeViewItem típusú objektumokra.
Ezen a stíluson belül található egy trigger, ami egy kvázi eseménykezelő, az egér
elem fölé kerülése esetén sötétkék színnel fogja „beragyogni” annak tartalmát.
Windows Communication Foundation
A WCF egy programozói keretrendszer egymással kommunikáló alkalmazások kivitelezésére,
amely egyesíti a .NET 2.0-s keretrendszer kommunikációs modelljeit, úgyis mint a
webszolgáltatásokat (Web Service), a Remotingot (távoli alkalmazások, azok objektumainak
hálózaton történő összekapcsolása a kód újraírása nélkül), az elosztott tranzakciókat
és az aszinkron kommunikációt (Message Queues). A WCF kezeli a SOAP üzeneteket,
így kompatibilis minden SOAP XML bemenetet kezelni képes folyamattal. A 3.5-ös frameworktől
kezdve a WCF-ben megjelent a JSON sorosítás lehetősége, így AJAX-os weboldalak is
kiszolgálhatók WCF-es alkalmazásokból. A szolgáltatás-orientált architektúra elveit
követve támogatja az elosztott számításokat, ahol is szolgáltatásokat biztosít a
fogyasztók részére. Egy kliens fogyaszthat több szolgáltatást, de több kliens is
fogyaszthatja ugyanazt a szolgáltatást. Egy WCF szolgáltatás három részből áll:
egy Service osztályból – ez implementálja a nyújtott szolgáltatást, a szolgáltatás
környezetéből és egy vagy több végpontból (endpoint), amihez kapcsolódhatnak a kliens
alkalmazások. A Service-el kommunikálni a végpontokon át lehet, amik az ún. szerződésükben
meghatározott Service függvényeket teszik elérhetővé a kliensek felé. A végpontok
meghatároznak egy kötést (binding), azaz a kommunikáció módját a Service és a kliens
között. WCF szolgáltatást a Windows Activation Services-szel, a Microsoft IIS webszerver
alatt futtatva vagy a ServiceHost osztályt használva parancssoros vagy Windows Forms
programból lehet nyújtani. A WCF Service megvalósítása egy osztály, ami implementál
egy szerződést – ez egy speciális jelölésű interfész, aminek függvényeivel rögzítettük
a Service által nyújtott funkciókat. Ezek a függvények jellemzően ki és bemeneti
üzeneteket fogadnak az adatszerződésnek megfelelően. Az adat és szolgáltatási szerződést
.NET-es attribútumokkal adhatjuk meg az osztályban. WCF szolgáltatást a ServiceContract
attribútummal jelölhetünk, illetve ilyen jelölésű interfészt valósíthatunk meg.
Minden olyan függvényt, amit a kliens SOAP üzenetekkel hívhat meg OperationContract
attribútummal látunk el. A szolgáltatás funkciói által kezelt adatokat meghatározó
osztályokat vagy struktúrákat a DataContract attribútummal jelöljük. Egy Service
több szolgáltatási szerződést is használhat, ha több így jelölt interfészt is megvalósít,
valamint egy Oparation vagy ServiceContract attribútumú interfész hivatkozhat már
létező szerződésre is. Minden szolgáltatási szerződéshez tartozik adatszerződés,
akár implicit, akár explicit módon meghatározva. Implicit, ha primitív típusú paraméterekkel
kommunikálnak Service függvényei. Ha bonyolultabb, struct vagy class típusú adatok
a bemenő vagy visszatérési paraméterek, azokat jelölni kell a megfelelő attribútumokkal.
A bonyolultabb struktúrájú adatok tagjait a DataMember attribútummal kell ellátni,
csak ezek kerülnek átvitelre a Service és a kliens között. Az adatszerződés határozza
meg az adatok sorosítását, visszaalakítását. Azonos adatszerződést implementálva
akár más nyelven (VB, Java) írt osztályok is képesek ugyanazon adatok sorosítására,
visszaalakítására. A ServiceBehavior és OperationBehavior attribútumok beállításával
a szolgáltatás és azok funkcióinak viselkedései állíthatók. A ConcurrencyMode attribútummal
jelölhetjük, hogy párhuzamosan engedünk-e több csatlakozást vagy sem. Az InstanceMode-dal
megadhatjuk, hogy egy példány szolgáljon ki minden kérést, vagy minden kérésre új
szolgáltatás példány induljon. Egy WCF kliens a Service-hez egy meghatározott szerződésű
végponton keresztül csatlakozhat. A végpontnak van egy címe (URL), amin elérhető,
valamint kötési tulajdonságai, amik meghatározzák az adatátvitel módját (kommunikációs
protokollok, titkosítási módok). A kommunikáció a kliens és a Service között bármely,
a szolgáltatás függvényei által biztosított RPC (távoli eljáráshívás) hívással történhet.
A kapcsolódás egy proxy objektumon át valósul meg, ez kapcsolódik a végponthoz és
láttatja egy objektumnak a szolgáltatást. A kapcsolat lehet szinkron, ilyenkor a
kliens blokkolódik a kérés feldolgozásáig vagy aszinkron, nem blokkoló. Ilyenkor
vagy üzenetsort (Message Queue) használunk, vagy a többszálú feldolgozást választhatjuk
a proxy objektum megvalósításánál.
WCF a gyakorlatban
A következő C# kód egy példa a szerződés megadására.
[DataContract] public class Adatok { private string adat1; [DataMember] public string
Adat1 { get { return adat1; } set { adat1 = value; } } }
Az Adat1 property elérhető lesz a kliens oldalon, mivel meg van jelölve a DataMember
attribútummal. Új WCF szolgáltatás felvételéhez egy létező projektben válasszuk
ki a Solution explorer ablakból a projektet, majd jobb egérkattintás után az Add?New
item… ablakból a WCF Service-t.
Ha felvettük, az app.config fájlban meg fog jelenni egy új rész, a System.serviceModel,
azon belül is a ServiceBehaviors és a Services, ez utóbbi már alap végpont bejegyzéseket
is tartalmaz. A következő C# kód példa szolgáltatás szerződés megadására.
[ServiceContract] public interface IprobaService { [OperationContract] bool ProbaFuggveny(Adatok
probadat); }
Az ilyen interfészt implementáló végpont osztályt hívhatjuk meg a kliens programunkból.
A felkínált végpontokat a Tools menü WCF Configuration editor menüpontjából állíthatjuk
be. Itt a solutionünkből kiválaszthatjuk az implementált végpont lefordított .dll
fájlját. Ezután beállíthatjuk a kötési tulajdonságokat (HTTP, TCP, stb…) majd a
végpont URL címét, viselkedését is. A WCF használatához futtatni kell párhuzamosan
a szolgáltatást hosztoló programot és az azt hívó klienst.