október, 2007 havi archívum

AJAX Control Toolkit –
CascadingDropDown
 
Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:

http://cid-8dcaf3b0da4fb828.skydrive.live.com/embedrowdetail.aspx/ACTsorozat/ACT|_VII|_CascadingDropDown.zip

Ma a CascadingDropDown Extender-rel ismerkedünk meg, aminek ha magyar nevet szeretnénk adni, akkor a sorba kapcsolt legördülő-listát adhatnánk.
 
CascadingDropDown alapok
Ezzel az extender-rel olyan DropDownList-eket egészíthetünk ki AJAX-os funkcionalitással, melyek értékei függenek egy másik legördülő-listától. Magyarul egy DDL-t úgy töltjük fel kódból elemekkel, hogy az előző DDL-ben kiválasztott elemet vesszük alapul.
Ezzel az egyetlen nagy baj az volt, hogy mindegyik DDL AutoPostBack-re volt állítva, így gyakran ugrált/vibrált az oldalt. Jött az AJAX-szal a megoldás, mindegyiket beszórtuk egy UpdatePanel-be, és felvettük a SelectedIndexChanged eseményeket az aszinkronkioldóhoz (AsyncPostBackTrigger). Ettől a felhasználó már valamivel jobban érezte magát, de még mindig ott volt az esetleges hosszú várakozás, amelyet valamilyen chili-vili animációval próbáltunk elfedni. Na és itt jön képbe a CDD, ami mindent megváltoztat, mert gyorsabb, szebb és egyszerűbb is. (most kéne jönnie a „de” résznek… de nincs ).
A gyorsasága abban mutatkozik meg, hogy mindig csak az éppen szükséges adatért fog a szerverhez fordulni az objektum, így csökken az adatforgalom.
A szépsége a villódzás megszüntetésén kívül még abban is megnyilvánul, hogy pl.: addig nem enged választani a második DDL-ből míg az elsőből nem választottunk.
Az egyszerűségét két dolog példázza igazán. Az egyik például az, hogy egyetlen webmetódus segítségével is akár feltölthetjük az összes ddl-t, ha egy hierarchikus tárolóból (például XML) olvassuk ki az adatokat. A másik pedig, hogy lehetőségünk van arra is, hogy akár az adott oldalon írt webmetódust hívjuk meg.
 
CascadingDropDown – WebService
Mint ahogy a fentebbi bevezetőből kitalálható ennek az Extender-nek is a lelkét egy webszolgáltatás adja, mint az AutoCompleteExtender-nek.
Most egy olyan ws-t fogunk elkészíteni, amelyet három olyan DDL-hez kapcsolunk majd, melyek a naptárvezérlőt hivatottak helyesíteni. A webszolgáltatásunk legnehezebb része a szökőév ellenőrzés lesz. Sokan úgy gondolják, hogy minden néggyel osztható év szökőév, pedig nem! A százzal osztható évek nem szökőévek, kivéve a 400-szal is oszthatóak. Tehát ezek alapján 1500 nem, de 1600 már szökőév lesz, (mármint volt…).
Nézzük a webszolgáltatásunkat! Adjunk a projektünkhöz egy WebService-t, aminek legyen a neve Get_Date.asmx. Az alábbi névtereket ajánlott using-olni:
System.Collections.Generic, AjaxControlToolkit, System.Collections.Specialized
Adjuk az osztálynak egy [System.Web.Script.Services.ScriptService] attribútumot. Törüljük ki az osztályon belül automatikusan létrehozott dolgokat! Most azt a webmetódust fogjuk megírni, amely az éveket fogja visszaadni. Először nézzük a kódot, majd utána jöhet a magyarázat:
 
[WebMethod()]
public CascadingDropDownNameValue[] Get_Years(string knownCategoryValues, string category)
{
    List<CascadingDropDownNameValue> result = new List<CascadingDropDownNameValue>();
    for (int i = 1500; i <= Convert.ToInt32(DateTime.Now.Year); i++)
    {
       result.Add(new CascadingDropDownNameValue(i.ToString(),i.ToString()));
    }
    return result.ToArray();
}
 
Itt is, mint az ACE-nél kötött a webmetódus struktúrája (még a paraméterek is!). Kötelezően egy CascadingDropDownNameValue gyűjteménnyel kell visszatérnünk, amely tartalmazni fogja a DDL-be feltöltendő elemek neveit és értékeit. Ehhez segítségül hívjuk a generikus osztályokat, konkrétan egy listát, amelyet a végén gyűjteménnyé avanzsálunk. Közben természetesen feltöltjük adatokkal a listánkat. Érdekességként jegyzem meg, hogy ha a for ciklusban a kezdeti évet például 1000-re állítanánk, akkor exceptiont generálna a webszolgáltatás, és a ddl-be az elemek helyett egy ilyen elem kerülne: [Method error 500].
A két kötelező paraméter közül az első (knowCategoryValues), egy olyan szöveges változó, amely felfogható egy naplóként. Vagyis ebben tárolódik el az, hogy melyik kategóriából (dropdownlist-ből), melyik értéket választottuk ki. Például, ha az első ddl-ünkhöz a Year kategóriát rendeljük, akkor a hónap webmetódus hívásánál a paraméter ezt fogja pl. tartalmazni: Year:1908; . További webmetódus hívások esetén a kategóriákat és a választott értékeket önmagához fogja hozzákonkatenálni.
A második paraméter az éppen aktuális kategória nevét tartalmazza. Tehát pl.: az év kiválasztása után ez a paraméter a Month értéket fogja felvenni.
 
A második legördülő-listánk feltöltéséhez szükséges webmetódust nem a webszolgáltatáson belül fogjuk megírni, hanem a naptárvezérlőt helyettesítő ddl-eket tartalmazó oldalon. Így most a harmadik DDL-t feltöltő webmetódust írjuk meg:
 
[WebMethod()]
public CascadingDropDownNameValue[] Get_Days(string knownCategoryValues, string category)
{
    List<CascadingDropDownNameValue> result = new List<CascadingDropDownNameValue>();
    StringDictionary sd = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
    int y = Convert.ToInt32(sd["Year"]);
    bool szokoev = false;
    if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) szokoev = true;
    string month = sd["Month"];
    int daynumber = 0;
    switch (month)
    {
        case "Január": case "Március":
        case "Május": case "Július":
        case "Augusztus": case "Október":
        case "December":
            daynumber = 31;   
            break;
        case "Április": case "Június":
        case "Szeptember": case "November":
            daynumber = 30;
            break;
    }
    if (month == "Február" && szokoev) daynumber = 29;
    else if (month == "Február" && !szokoev) daynumber = 28;
    for (int i = 1; i <= daynumber; i++)
    {
        result.Add(new CascadingDropDownNameValue(i.ToString(), i.ToString()));
    }
    return result.ToArray();
}
 
A CascadingDropDown objektumnak van egy nagyon hasznos tagfüggvénye, még pedig a ParseKnownCategoryValuesString(). Ez arra képes, hogy a knowCategoryValues-ban eltárolt kulcs (kategória) – érték párokat kimentse egy StringDictionary objektumba. Például ha az első paraméter értéke: Year:1908;Month:Február; ,akkor ezen metódus meghívása után ilyen egyszerűen eltudjuk érni a kiválasztott évszámot: sd["Year"]. Mivel ez egy string, ezért át kell konvertálnunk integerbe, hogy dolgozni tudjunk vele.
Az utána jövő két sor felelős a szökőév vizsgálatáért. Alapban azt feltételezzük, hogy nem szökőévet választott a kliens.
Utána egy switch/case segítségével meghatározzuk, hogy egyes hónapokban hány nap legyen, majd a választott hónapnak megfelelően, feltöltjük a CascadingDropDownNameValue listánkat.
 
Készen is vagyunk a webszolgáltatásunkkal, most már csak a hónapokat feltöltő webmetódust kell megírnunk. A Default.aspx.cs fájlba akarjuk mindezt megvalósítani. Itt az alábbi három névtérre lesz szükségünk:
System.Collections.Generic, AjaxControlToolkit, System.Web.Services
Nézzünk is a kódot:
 
[WebMethod()]
[System.Web.Script.Services.ScriptMethod]
public CascadingDropDownNameValue[] Get_Months(string knownCategoryValues, string category)
{
    List<CascadingDropDownNameValue> result = new List<CascadingDropDownNameValue>();
    result.Add(new CascadingDropDownNameValue("Január", "Január"));
    result.Add(new CascadingDropDownNameValue("Február", "Február"));
    result.Add(new CascadingDropDownNameValue("Március", "Március"));
    result.Add(new CascadingDropDownNameValue("Április", "Április"));
    result.Add(new CascadingDropDownNameValue("Május", "Május"));
    result.Add(new CascadingDropDownNameValue("Június", "Június"));
    result.Add(new CascadingDropDownNameValue("Július", "Július"));
    result.Add(new CascadingDropDownNameValue("Augusztus", "Augusztus"));
    result.Add(new CascadingDropDownNameValue("Szeptember", "Szeptember"));
    result.Add(new CascadingDropDownNameValue("Október", "Október"));
    result.Add(new CascadingDropDownNameValue("November", "November"));
    result.Add(new CascadingDropDownNameValue("December", "December"));
    return result.ToArray();
}
 
Ehhez összesen annyi megjegyzésem van, hogy fontos a ScriptMethod attribútum kiírása (a webszolgáltatás osztályánál ScriptService attribútum volt, nem keverendő a kettő!!!).
 
CascadingDropDown Extender tulajdonságainak beállítása
Most már csak az aspx oldalt kell összedobnunk, és utána szólhat is rock&roll!
Húzzunk a formunkra, egymás alá 3 DropDownList-et és a nevek legyenek sorra: ddl_year, ddl_month, ddl_day. Szükségünk lesz egy UpdatePanel-re és benne egy Label-re. Húzzunk még az oldalra 3db CascadingDropDown Extender-t, majd váltsunk source nézetbe!
Az első CDD-t így állítsuk be:
 
<ajaxToolkit:CascadingDropDown ID="CDD_y" runat="server"
     TargetControlID="ddl_year"
     ServicePath="Get_Date.asmx"
     ServiceMethod="Get_Years"
     Category="Year"
     PromptText="Kérlek, válassz évet…"
     LoadingText="Adatok letöltése…">
</ajaxToolkit:CascadingDropDown>
 
Az első 5 attribútum egyértelmű mire való, ezért csak az utána jövőket részletezem. A Category, a már oly sokszor említett kategóriát szabja meg (ez alapján tudjuk azonosítani melyik DDL-ből melyik értéket választotta ki a kliens).
A PromptText szöveg, akkor jelenik meg, amikor egyetlen elem sincs kiválasztva még! A LoadingText pedig akkor fog látszani, amikor éppen lekéri a szervertől a javascript az új listát.
A második CDD kódja:
 
<ajaxToolkit:CascadingDropDown ID="CCD_m" runat="server"
    TargetControlID="ddl_month"
    ServiceMethod="Get_Months"
    Category="Month"
    ParentControlID="ddl_year"
    LoadingText="Adatok letöltése…"
    PromptText="Kérlek, válassz hónapot…">
</ajaxToolkit:CascadingDropDown>
 
3 különbség van az előző CDD és e között. Az első, hogy nincs megadva ServicePath, ilyenkor az oldalon keresi a webmetódust (ScriptManager EnablePageMethods attribútuma alapban true). A második, a kategória itt Month-ra van állítva. A harmadik, bejött egy új attribútum, a ParentControlID. Ennél a tulajdonságnál tudjuk megadni a DDL függőségét.
Végül a harmadik kódja a teljesség kedvéért, magyarázat nélkül:
 
<ajaxToolkit:CascadingDropDown ID="CCD_d" runat="server"
    TargetControlID="ddl_day"
    ServicePath="Get_Date.asmx"
    ServiceMethod="Get_Days"
    Category="Day"
    ParentControlID="ddl_month"
    PromptText="Kérlek, válassz napot…"
    LoadingText="Adat letöltése…">
</ajaxToolkit:CascadingDropDown>

 
Egy-két okosság
Ha feliratkozunk valamelyik DDL valamelyik eseményére, akkor a kódunk nem fog mindaddig végre hajtódni, amíg az oldal EnabledEventValidation tulajdonságát false-ra nem állítjuk. (állítólag már dolgoznak ezen hiba orvoslásán).
A CascadingDropDown objektumnak a ParseKnownCategoryValuesString() metóduson kívül van még egy hasznos metódusa, a QuerySimpleCascadingDropDownDocument(). Ez a metódus automatikusan képes generálni a webmetódusok eredményt, de csak hierarchikus felépítésű szerkezetekből! (erről írtam már az elején, hogy egyetlen metódus generálja az összes DDL elemeit). A metódus négy paramétert vár. Az első egy XmlDocument objektum, mely forrásként szolgál. A második egy string gyűjtemény, mely leírja a fájl hierarchiáját. A harmadik egy StringDictionary objektum, melyből nyeri a history-t. Az utolsó paraméter pedig értelemszerűen a category paramétere a webservice-nek.
Bővebb infó erről az SDK-ban!
Még egy dologra szeretném felhívni a figyelmeteket, ez pedig nem más, mint egy Walkthrough, amiben leírják, hogyan kell használni a CDD-t adatbázissal. Íme a linkje:
http://asp.net/AJAX/AjaxControlToolkit/Samples/Walkthrough/CCDWithDB.aspx
 

WTW second release

Posted: 2007. október 29. in Rendezvény információk
Gondolom már mindenki hallott róla és már regisztrált is a legújabb WTW versenyre, de ha van olyan galád, aki mégse azoknak:

Nov. 10-11.-én lesz a 24 órás winforms-os alkalmazás fejlesztős ms-es, evosoft-os verseny. Aki volt az első wtw-n az tudja, hogy a jó hangulat az garantált, de most megpróbálják magukat überelni a szervezők és ha minden igaz akkor a jövőháza fog otthont adni a versenynek. Az eddig kiszívárgot információk alapján a nagy feladatban szükséges lesz a remoting használatára (erről próbálok én is majd egy rövid összefoglalt írni, azoknak akik még nem mélyedtek el ebben a "gyönyörű" témakörben) illetve a wpf/wpc ismeretek se hátrány ha vannak.
Az indulókészlet most az alábbi könyveket tartalmazza: 70-526; 70-529; 70-536! És egy pozitív csalódás, bekerült a staterkit-be egy-két példaalkalmazás a remoting-gal, grafikával kapcsolatban. Köszönet az MSDNKK-nak és Lippinek!
A versennyel kapcsolatban csomó hasznos és kevésbé hasznos infót itt találthattok:
http://msportal.hu/WTW/Default.aspx

http://ch9.hu/blogs/video/archive/2007/10/26/wtw-verseny-meghirdet-233-s.aspx

Még egy dolog a WTW-vel kapcsolatban: azok akik úgy érzik, hogy azért nem akarnak részt venni a versenyen, mert kőkemény ASP.NET beállítottságú fejlesztők (like me), azoknak mondom, azok egyik szervező szavaival élve: "ide nem kell winforms tudás, csak ész!".

Az elöző WTW-vel kapcsolatban annyit szeretnék még megosztani veletek, hogy én egy kicsit csalódtam. A verseny nyereménye, elméletben egy 1 millió forintos projekt fejlesztése volt, amely a végén éles weboldal lesz… Hát, ez valahogy úgy nagyon elmaradt.  A szomorú dolog az egészben, hpgy most is csak így említés szintén került elő a dolog az msportal fórumon. Éles projekt nincs, csak demo alkalmazás, demo adatbázissal. (én legalábbis erről tudok csak!) Az demo app kipróbálható az alábbi címen:
http://www.mswtw.com

Stílusosan ahogy a verseny kiírásában is volt, Coders4U az oldal tulajdonsa.

Ezzel senkit se akarok lebeszélni a versenyről, csak megemlítettem, hogy annyira MS-nél ezt nem verik nagy dobra…

 
Regeljen mindenki és érezze jól magát!

Trainer Portal Patch

Posted: 2007. október 22. in Egyéb
Tegnap feltöltöttem a codeplex-re egy patch csomagot, melyben néhány kód hibát kijavítottam, illetve egy-két oldal ajax-enabled lett.. Innen zúzhatjátok le:
http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=trainerportal&ReleaseId=7332

Amit ott külön nem emeltem ki, de újdonság, hogy ez már a legújabb ACT-s dll-t tartalmazza (szept. 10-ei)!

Enjoy!

MS beújít… II. rész

Posted: 2007. október 19. in Egyéb
Nem tudom ki mennyire követi nyomon az eseményeket MS-knél, ezért azoknak akik lusták utána nézni:
Termeléken október, NOVEMBER, december elé nézünk!
 
Kezdem először a legfontosabbal, az Orcas-os konferinciát elhaszlatották okt .25-ről nov. 15-re! Emögött szerintem nem csak az van, hogy mint ahogy az MSDN hírlevélben írták, hogy helyszínbiztosítási problémák miatt lesz később a konf., hanem valószínűleg az is benne van, hogy november közepén (13.-án vagy 17.-én) jelenik meg, nem hivatalos források szerint, a .NET Framework 3.5. A korábbi híresztelésekkel ellentétben a VS 2008 vele együtt fog debütálni, nem pedig jövő februárban.
(Ha a dátummal kapcsolatban tévednék, akkor azért ne kövezettek meg! Szinte napról-napra röppenek fel új hírek a VS08-ról, így sajnos már nem tudom melyik blogban olvastam ezt a dátumot…)
 
És akkor most rátérnék a bejegyzésem főtémájára: CH9! A CH9.HU a channel 9 magyar verziója, aki még nem járt volna az eredeti oldalon az szégyelje magát! A C9, egy olyan videókat sugárzó/tároló/megosztó oldal, ahol Microsoft fejlesztőket, illetve Microsoft-hoz közel álló szakértőket munkaközben interjúolnak meg az MS technológiákal kapcsolatban. Két dolgot kell látnunk:
– Ezek nem megrendezett interview-k, hanem mindenki rögtönöz (on the spot)…
– A vélemények nincsenek cenzúrázva, tehát a technológiákkal kapcsolatos negatívumokat és pozitívumokat is meghallgathatjuk.
Nos, a magyar verzióról annyit kell tudni, hogy Bátorfi Zsolt-nak köszönhető az egész! Ő a riporter, a rendszergazda, illetve az 5letgazda is (ha jól tudom). Mellesleg ez az első olyan hivatalos oldal Magyarországon mely SilverLight alapú (Community Server-re van ráültetve).  Az oldal szerintem nagyon design-os (a comming soon is 5letes), és ugyebár Silverlight alapú:D
Nekem is van egy kis közöm az oldalhoz, még pedig, hogy velem is készült egy interjú az ASP.NET vizsgázással kapcsolatban, így bekerültem én is az 5 starter videóba
(Interjúk:
Dr. Charaf Hassannal
– Novák Istvánnal
– Balássy Györggyel
– WPF fejlesztőkkel
– illetve Jómagammal)
Mivel amikor megbeszéltük Zsolttal a találkozót, akkor én még nem is sejtettem, hogy interjú lesz a vége, ezért sajnos kimaradt a videóból két fontos dolog, amit el akarok most mondani:
– A vizsga szerintem, nem teljesen azt méri fel, hogy mennyire értesz az ASP.NET-hez, mivel nagyon sok olyan lexikális tudás is kell, ami nem feltétlen tarozik a webes fejlesztők mindennapi munkájukhoz. Pl.: melyik ősosztályból kell származtatni a kivánt eseményfigyeléséhez a health monitoring custom Provider-ét, illetve WebEvent-jét
– A második okosság a sikeres vizsgázás utáni életre vonatkozik, akik PASSED THE EXAM minősítéssel rendelkeznek, nekik elméletben elérhetővé válik az MCP member site. A helyszínen kapott papíron az van írva, hogy 1 héten belül küldenek egy e-mailt a megfelelő adatokkal. Nos én ezt kb. 1,5 hónap után kaptam meg és a a sok marketing szövegből összesen az MCP Student ID, vagy mi a franc volt hasznos információ. Ettől függetlenül még mind a mai napig nem sikerült bejelentkeznem az oldalra (3szor próbáltam eddig), mert mindig talált valami hibát… rosszabb mint a vizsga

Nos mára ennyi okosságot terveztem, majd folyamatosan jönnek még az MS beújít sorozat újabb részei, melyekben megpróbálom majd folytatni ezt a kicsit behind the walls stílust!

Az ASP.NET-es MCP vizsgás interjúval kapcsolatos észrevételeket ide, illetve a ch9-re is várom!
 
AJAX Control Toolkit –
CalendarExtender
 
 
Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:

http://cid-8dcaf3b0da4fb828.skydrive.live.com/embedrowdetail.aspx/ACTsorozat/ACT|_VI|_CalendarExtender.zip

Ezen a héten a CalendarExtender bemutatása a soros, így ezzel a vezérlővel kerülünk ma közelebbi kapcsolatba.
 
CalendarExtender alapok
Amikor először kipróbáltam a CE vezérlőt őszintén szólva eléggé meglepődtem, mert a név alapján arra számítottam, hogy egy Naptár vezérlő viselkedését bővíti majd ki, de szerencsére tévedtem. Azért szerencsére, mert pozitív csalódás volt a számomra, hogy a vezérlő feladata teljesen más: egyszerűsíteni a dátum bevitelt. Ehhez csak egy beviteli mezőre van szükségünk a CE-n kívül, és már működik is. Magyarul egy textbox-ot egészít ki naptár funkcióval.
Mellesleg jegyzem meg, hogy hasonlót, akár mi is tudnánk alkotni, egy textbox, egy calendar, egy popupcontrolextender, egy updatepanel illetve egy animationextender segítségével. Azért csak hasonlót, mivel a CalendarExtender naptárrésze, egy továbbfejlesztése a Calendar vezérlőnek. 

    
normál Calendar vezérlő                  normál CalendarExtender

Ha a „sima” naptárvezérlőnél, tegyük fel decemberről ugyanazon év januárjára akarunk el navigálni, akkor 11-szer kell oldalra lapoznunk a hónapok között. Vagy ha ne agy isten mondjuk, születési dátumot akarunk bekérni, akkor elzsibbad a felhasználó ujja, amire eléri a kívánt évet, illetve hónapot. Nos ezt a „kis” kellemetlenséget úgy szünteti meg a CalendarExtender, hogy ha a naptárrész fejlécére egyszer kattintunk, akkor az adott év hónapjai közül tudunk válogatni. Ha pedig kétszer, akkor pedig egyszerre 12 évet láthatunk, vagyis az aktuális évtized +-1. Azért ez már eléggé kellemes, szerintem…

    
hónap nézet                                     év nézet         

Nekünk, webes fejlesztőknek, a naptárvezérlő soha se tartozott a kedvenc vezérlőink közé, hiszen figyelnünk kellett a beírt dátum formátumára is. (Ez az automatikus lokalizációnak köszönhető). A CE vezérlő is támogatja ezt a fajta automatikus lokalizációt, csak be kell kapcsolni . A lokalizációt kivételesen nem a CE vezérlőnél kell beállítani, hanem a ScriptManager-nél. Az alábbi két tulajdonságát állítsuk true-ra:
EnableScriptLocalization
EnableScriptGlobalization

Ha ezeket beállítottuk, akkor ahogy az a fenti képen is látszik, minden szöveg magyar lesz a CE vezérlőben, kivéve a Today. Ennek oka az, hogy a Today külön resource fájlban van eltárolva, mivel a Script nem tudja lekérdezni a kliens operációsrendszerétől a Today lokalizált nevét.
Ezért ezt úgy valósították meg, hogy a Bin mappába nyelv specifikus mappákat hoztak létre (pl.: ar, de, ja, stb..), melyek mindegyikébe egy AjaxControlToolkit.resources.dll nevű szerelvény került. Ezekben tárolnak egy-egy erőforrás fájlt, ami összesen a Calendar_Today névhez rendelt lokalizált Today stringet tartalmazza.
Sajnos a fejlesztők közül egy se volt magyar, így nem készült Today hu resource fájl, ezért marad nekünk a Today.  
Szerencsénkre a CE fejlesztői viszont arra gondoltak, hogy megszabhatóvá lehessen tenni a naptárból kiválasztott, majd onnan a beviteli mezőbe automatikusan beillesztett, dátum formátumát. Ilyen típusú megkötést a Format tulajdonságon keresztül állíthatunk majd be.

 
CalendarExtender a gyakorlatban
A CalendarExtender használata végtelenül egyszerű, összesen az alábbi két lépésre van szükségünk:
– Húzzunk a formunkra egy TextBox-ot (ID legyen txtbox_Date), és egy CalendarExtender-t
– Állítsuk be a TargetControlId tulajdonságát a CE-nek txtbox_Date-re, majd futtassuk
(Az alábbi kódot kapjuk:
<asp:TextBox runat="server" ID="txtbox_Date" /><br />
<ajaxToolkit:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="txtbox_Date" />
)
 
Ez mind szép és jó, de mi ennél többet szeretnénk. Nézzük meg, miként szabhatjuk testre a kinézetét, illetve hogyan állítsuk be a dátum formátumot!
 
CssClass
A kinézet testreszabása css stíluslap segítségével történik. Egyetlen egy előredefiniált CSS osztály gyűjteményről van szó, mely felüldefiniálható! Íme egy példa a CE kinézetének megváltoztatására:
 
StyleSheet.css
.CustomCalendar .ajax__calendar_container {
    border:1px solid #646464;
    background-color: lemonchiffon;
    color: red;
}
.CustomCalendar .ajax__calendar_other .ajax__calendar_day,
.CustomCalendar .ajax__calendar_other .ajax__calendar_year {
    color: black;
}
.CustomCalendar .ajax__calendar_hover .ajax__calendar_day,
.CustomCalendar .ajax__calendar_hover .ajax__calendar_month,
.CustomCalendar .ajax__calendar_hover .ajax__calendar_year {
    border-style:dashed;
    border-color:red ;
}
.CustomCalendar .ajax__calendar_active .ajax__calendar_day,
.CustomCalendar .ajax__calendar_active .ajax__calendar_month,
.CustomCalendar .ajax__calendar_active .ajax__calendar_year {
    color: black;
    font-weight:bold;
}
 
Default.aspx
<ajaxToolkit:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="txtbox_Date" CssClass="CustomCalendar" />
 
Azoknak, akik kevésbé mozognak otthonosan a Stíluslapok világában:
Jelenesetben a CustomCalendar osztály konténerosztályként funkciónál. Az utána lévő (benne elhelyezkedő) osztályok nevei kötettek, mivel csak így képes felismerni az AJAX futtató rendszer őket. Az előredefiniált osztályok referenciája az alábbi címen érhető el:
http://asp.net/AJAX/AjaxControlToolkit/Samples/Calendar/Calendar.aspx
Természetesen, ha egy stílusbeállítás „csoportot” több osztályhoz is hozzá szeretnénk rendelni, akkor nem szükséges mindegyik osztálynál a stílusbeállítások felsorolása. Vagyis azon osztályokat, melyeknél szeretnénk azonos stílusbeállításokat, soroljuk fel egymás után, vesszővel elválasztva, és alattuk állítsuk be a stílusinformációkat!
 
Format
A Dátum formátumának leírására van egy eléggé egyszerű eszköztárunk, melyet szabadon agyon bonyolíthatunk. A fegyverarzenálunk egy lecsupaszított verziója így néz ki:
– Az évet y betűvel jelöljük. Ha yy-t adunk meg, akkor csak az utolsó két számjegye jelenik meg az évnek (pl.: 2007 >> 07). Amennyiben yyyy, akkor a teljes évszám látszik!
– A hónapokat az M betű jelöli. Az MM | M a hónap sorszámát adja vissza, az MMM a hónap rövid nevét (pl.: október >> okt.), és végül az MMMM pedig a teljes nevét!
– A napokat a d betűvel írhatjuk le. A d | dd azt mondja, hogy hányadika van, a ddd a nap kezdőbetűjét adja vissza (pl.: Péntek >> P), illetve a dddd a nap teljes nevét!
Elválasztójeleknek bármit adhatunk, de az alábbiak a megszokottak: /- .
Ezek alapján, ha a Magyarországon elfogadott dátumformátumot szeretnénk leírni, akkor azt az alábbiképpen kéne: yyyy.MMMM.dd. Az amerikai dátum formátum pedig valahogy így néz ki (asszem): MM/dd/yyyy .  
Akit érdekel a teljes sémarendszer leírása, nézze meg ezt az oldalt:
http://msdn2.microsoft.com/en-us/library/bb79761a-ca08-44ee-b142-b06b3e2fc22b.aspx
 
PopupButtonId
A CE vezérlő képes úgyis működni, hogy nem akkor jelenik meg automatikusan a naptárrésze a beviteli mező alatt, amikor abba belekattintunk, hanem például, amikor egy gombra kattintunk, akkor oldjon ki a trigger. Ezt a PopupButtonId tulajdonságnál megszabott button/imagebutton segítségével tehetjük. (a példaalkalmazás tartalmaz erre is példát!)
 
Egyéb tulajdonságok, események
Itt már csak igazándiból a PopupPosition tulajdonságra (beállíthatjuk vele hol jelenjen meg a naptárrész) és a számtalan Event-re hívnám fel a figyelmet. Olyan eseményekre is feliratkozhatunk, mint például OnClientDateSelectionChanged, ellenben pl.: nincs DayRender esemény!

MS beújít…

Posted: 2007. október 12. in Egyéb
A minapokban MS-éknél valami a feje tetejére állt. Újra tervezés, design-olási mánia jött rá mindenkire. Ami természetesen akár jó is lehet és én remélem, hogy az is lesz.

Hétfőn este vagy kedden reggel Lippi barátunk lecserélte az MsPortal engine-jét egy úgynevezett Community Server alapú engine-re. Ez egy asp.net 2.0-ban írt nyílt forráskódú portál rendszer, mely tartalmaz minden olyan szolgáltatást, amit egy mai portáltól el lehet várni (pl.: mindenkinek egyéni blog lehetőség, rss, fórum, feltöltés, avatár, stb..) Az eninge ismerős lehet sokak számára, akik már voltak Architektúra Fórum-on (http://architekturaforum.hu/).
Nos nem csak kis hazánkban vannak változások, hanem a nagy világban, Codeplex-éknél is design váltás történt. Ameddig nem jelentkezik be az ember azt mondja, hogy teljesen okés az oldal, leszámítva azt, hogy már lassabban jön be, mint az én portálom (fél perc várás minimum). Ez volt hét elején, most már lecsökkent ez 10 másodpercre. Ettől függetlenül még eléggé sok helyen bugos a rendszer, de ez van…
Ja jut eszembe, sikert megtalálnom, hogyan lehet tagelni. Van egy your tag, illetve user tag-nek nevezett dolog. A kettő annyiban tér el egymástól, hogy a your tag-nél Te adod a saját projektednek, míg user tag esetén mások osztályozzák a tiédet.
Ez annyira nem is lenne rossz elgondolás, hogy a közösség határozza meg a csoporton belüli népszerűséget, mivel keresésnél az adott csoportban az a projekt kerül előrébb, amelynek nagyobb a user+your tag összege. A baj ezzel az, hogy magamból kiindulva és a többi projektet nézve, nem igazán van kedvünk még mások projektjeit osztályozgatni. Miért ne lehetet volna látogatottság alapján rendezni.. hát ez örök rejtély marad azt hiszem.

Na most, hogy ki írtam magamból a codeplex iránti ellenszenvemet, kicsit visszatérek az MS magyarországi tevékenykedéseire. Múlt hét pénteken beszéltem Bátorfi Zsolt-tal, és amiket mesélt a közel jövővel kapcsolatban az nem lesz egyszerű. Lesz minden ami szem szájnak ingere (új oldalak, újra írt rendszerek, stb..) konkrétumot nem tudom mondhatok-e, ezért inkább ezt a dícsőséget meghagyom majd Zsoltnak.
Még egy dolog, ha minden igaz akkor valamikor majd le fogom tenni az ASP.NET-ből az advanced MCP vizsgát (tehát nem a 70-528-asat). Amennyiben ehhez is kapok training anyagot, akkor azzal kapcsolatban is meg fogom osztani a tapasztalataimat. 

Hát most így ennyi MS vidékéről, beszámolóként…

AJAX Control Toolkit –
AutoCompleteExtender

Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:
http://devportal.hu/Portal/Detailed.aspx?NewsId=a774c2d9-d3a8-4fb2-a8bc-d69b4d1d6bb9
vagy

http://cid-8dcaf3b0da4fb828.skydrive.live.com/embedrowdetail.aspx/ACTsorozat/ACT|_V|_AutoCompleteExtender.zip

Ebben a cikkben megismerkedünk az automatikus kiegészítővel.

AutoCompleteExtender alapok
Ez az extender, arra szolgál, hogy felhasználó által begépelt szövegrészletet kiegészítse, olyan szavakkal (mondatokkal), melyeknek a prefixe (előtagja) megegyezik az eddig begépelt szöveggel. Ilyen szolgáltatással már találkozhattunk a böngészőinkben, melyek megjegyzik az összes eddigi beviteli mezőbe beírt szöveget, és a későbbiekben egy legördülő lista segítségével tudunk ezek között válogatni.
Nos pontosan ezt a szolgáltatás tudjuk implementálni alkalmazásainkba, úgy hogy mi (fejlesztők) mondhatjuk meg, hogy mikor, milyen és hány darab lehetséges szó közül választhasson majd a kliens.
A „mikor” alatt azt értem, hogy megszabható, hogy hány leütött karakter után jelenjenek meg a lehetséges végződések, melyek prefixe illeszkedik ezekre a betűkre. Ezt a MinimumPrefixLength tulajdonság segítségével állíthatjuk be.
A „milyen”, itt arra utal, hogy mi fejlesztők szabjuk meg a lehetséges végződéseket. Ezt, stílusosan, egy Webszolgáltatás segítségével tehetjük meg. (ennek részleteiről a kövi. bekezdésben)
A „hány” pedig értelemszerűen azt szabja meg, hogy mennyi végződési lehetőséget engedünk meg egyszerre megjelenni a textbox alatt lévő legördülő listában. Ezt a CompletionSetCount tulajdonságon keresztül tudjuk szabályozni.
Még egy hasznos és fontos tulajdonságát érdemes megjegyezni az ACE vezérlőnek, ez pedig nem más, mint az EnabledCaching. Ez akkor igazán hasznos, ha a prefix-től független végződéseket generálunk, így a következő karakter bevitele után nem fog ismét lefutni a webszolgáltatás, hanem már a gyorsítótárból lesz kinyerve a lehetséges végződések gyűjteménye!

Most, hogy már tisztában vagyunk az ACE alapjaival, ideje megnéznünk ezt a többször is emlegetett webszolgáltatást.

WebService, mint az ACE lelke
Először hozzá kell adnunk a projektünkhöz egy webszolgáltatást, valamilyen hasonló módon: Solution Explorer-ben, Projecten jobb klikk >> Add new item.. >> WebService >> névnek adjuk meg, hogy AutoComplete.asmx.
Ilyenkor két fájl is létre fog jönni. Lesz AutoComplete.asmx fájlunk a projekt gyökér könyvtárában, ami igazándiból csak referenciaként szolgál az App_Code mappába kerülő AutoComplete.cs fájlból futásidőben generálódó szerelvényre. Ha most megnézzük az asmx fájl tartalmát, akkor egyetlen sornyi kóddal fogunk csak találkozni:

<%@ WebService Language="C#" CodeBehind="~/App_Code/AutoComplete.cs" Class="AutoComplete" %>

Ezt ne is piszkáljunk! Nekünk a másik fájlra van szükségünk, amire hivatkozik az asmx, vagyis az App_Code/ AutoComplete.cs. Ezt nyissuk meg, de a szerkesztés előtt három fontos dolgot még meg kell néznünk!
1. – A webszolgáltatások úgynevezett webmetódusokat tartalmaznak. Ezek annyiban térnek a sima metódusoktól, hogy van egy kötelező WebMethod attribútumok.
2. – Ahhoz, hogy az ACE el tudja, majd érni a webmetódusunkat, az őt tartalmazó osztálynak is kell adnunk egy attribútumot:
[System.Web.Script.Services.ScriptService]
Ez azért kell, hogy a kliens oldali java script kód is meg tudja hívni a webszolgáltatást.
3. – Az elkészítendő webservice-ünk szintaktikája kötött, olyannyira, hogy a bemenő paraméterek neve is fix! Vessünk is erre egy pillantást:
public string[] webmethod_name(string prefixText, int count)
{

A prefixText tartalmazza a felhasználó által eddig bevitt szövegrészletet. A count pedig az ACE CompletionSetCount tulajdonságnál megszabott érték. Fontos azt is észrevennünk, hogy string tömböt kell visszaadnia a webmetódusunknak.

Ezen három dolog figyelembe vételével készítsünk most egy olyan webszolgáltatást, mely e-mail címeket fog kiegészíteni kukaccal illetve az utána jövő domain résszel. Nézzük a kódot, majd utána a magyarázatot:

using System.Collections.Generic;

[System.Web.Script.Services.ScriptService]
public class AutoComplete : System.Web.Services.WebService {
 
    [WebMethod]
    public string[] GetDomainList(string prefixText, int count)
    {
        List<string> items = new List<string>(count);

        string[] suffix = new string[10];
        suffix[0] = "freemail.hu";
        suffix[1] = "citromail.hu";
        suffix[2] = "vipmail.hu";
        suffix[3] = "mailbox.hu";
        suffix[4] = "freestrat.hu";
        suffix[5] = "gmail.com";
        suffix[6] = "hotmail.com";
        suffix[7] = "yahoo.com";
        suffix[8] = "inbox.com";
        suffix[9] = "microsoft.com ;-)";

  if (!prefixText.Contains("@"))
            prefixText += "@";
        else
        {
            if (!prefixText.EndsWith("@"))
                return items.ToArray();
        }//end else
           
        for (int i = 0; i < count; i++)
        {
            items.Add(String.Format("{0}{1}", prefixText, suffix[i]));
        } //end for
      return items.ToArray();
    } //end webmethod
} //end class

A kódunk elején használunk generikus osztályt (List<T>), ezért szükségünk van a System.Collections.Generic névtérre! Utána egy 10 hosszú tömbben eltároljuk a leggyakoribb domain-eket. Majd megvizsgáljuk azt, hogy eddig mit írt be a felhasználó:
– ha nem jutott még el a kukacig, akkor a domain elé beszúrunk egy @ jelet.
– ha beírta a kukacot és ez az utolsó karakter, akkor kiírjuk egyszerűen a domain-okat (így nem lesz két @ egymás után).
– ha pedig tartalmaz kukacot, és ez nem az utcsó karakter, akkor nem jelenítünk meg semmit, hiszen ilyenkor már elkezdte írni a domain-t.
(Természetesen a kód szebb lenne, ha regexp-et használnánk, de most a funkcionalitáson van a hangsúly!)
Végül pedig meghívjuk a lista objektumunk ToArray() tagfüggvényét, amely segítségével a listából tömböt készítünk.

ACE használata
Most hogy már megvan a webszolgáltatásunk ideje kipróbálnunk az ACE képességeit. Az AutoCompleteExtender-t értelemszerűen csak és kizárólag TextBox-hoz lehet hozzá kötni! Ennek a fényében húzzunk a formunkra egy textbox-ot és egy ACE-t. Az ACE TargetControlID-ját állítsuk be Textbox1-re.
Menjünk a TextBox tulajdonságai közé, keressük meg az AutoCompleteExtender1… tulajdonság csoportot, és az alábbiakat állítsuk be:
ServicePath = AutoComplete.asmx (fontos, hogy a kiterjesztés is ott legyen!)
ServiceMethod = GetDomainList
A MinimumPrefixLength tulajdonság alapértéke 3, ami nekünk tökéletesen megfelel ugyanúgy, mint a CompletionSetCount alapértelmezett 10-es értéke, ezért ezeket külön nem kell beállítanunk. (Ha nagyobb értéket állítunk be, mint amekkora a service által generált tömb mérete, akkor nem fog jelenni egyetlen lehetséges végződés se)!

És most már működésre kész az alkalmazásunk, futassuk!

A Szeptember 9.-ei release újdonságai
Mint ahogy arról a devportálon már olvashattatok, nem régiben megjelent az AJAX CT egy új verziója, amely tartalmaz egy pár hibajavítást, és jó pár újdonságot (végre itt is beállították a ToolBoxBitmap attribútumait a vezérlőknek).
Eléggé nagy fejlődésen ment keresztül az ACE is! Nézzük, milyen újdonságokat nyújt most számunkra a szeptemberi kiadása az ACT-nek!
– Végre innen is elérhető az animációs keretrendszer. Két eseményhez tudunk animációkat rendelni az OnShow-hoz (HideAction használata kötelező), illetve az OnHide-hez!
– Támogatja most már a CSS stíluslapok használatát is az ACE. Az alábbi tulajdonságokon keresztül tudjuk megadni a különböző területek megjelenítést módosító CSS osztályokat:
CompletionListCssClass, CompletionListItemCssClass, CompletionListHighlightedItemCssClass
– Beállítható, hogy az első elem legyen az alapértelmezetten kiválasztott. Ezt a FirstRowSelected tulajdonságon keresztül állíthatjuk be. Az alapértelmezett értéke: false.
– Egyszerre több szót is beírhatunk úgy, hogy mindegyik külön-külön lesz értelmezve, vagyis az aktuális (utolsó) szónál mindig megjelenik az ACE. Ehhez be kell állítanunk egy határoló- jelet (vagy akár többet is), Ezt a DelimiterCharacters tulajdonság segítségével tehetjük meg.

Bár a ContextKey nem a szeptemberi release újdonságai közé tartozik, én mégis itt említeném meg, mert az előző verzióban még teljesen működött jól a dolog. Ezen tulajdonság segítségével egyedibbé (felhasználó/oldal specifikussá) tudjuk tenni az ACE-t. Ilyenkor a Webmetódusunkat is túlterheljük egy contextKey nevű string-gel (harmadik paraméter).

AJAX Control Toolkit –
Animation Extender

Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:
http://devportal.hu/Portal/Detailed.aspx?NewsId=597d2b78-c851-4619-9950-5f10c216e8f7 vagy

http://cid-8dcaf3b0da4fb828.skydrive.live.com/embedrowdetail.aspx/ACTsorozat/ACT|_IV|_AnimationExtender.zip

Ma annak járunk utána, hogyan tudjuk még gazdagabbá tenni a felhasználói felületet animációk, illetve az AnimationExtender segítségével. Az animációkhoz az alapot az Animation Framework szolgáltatja. Kezdjük is először ezzel!

Az Animation Framework
Alapok
Igen jól olvastátok ez is egy keretrendszer (JavaScript-ben implementált ASP.NET AJAX osztályokról van szó), ami egy csomó előredefiniált, de kibővíthető, kliens oldali osztállyal rendelkezik. Az összes animáció lelkét, direktbe vagy indirektbe, az Animation absztrakt osztály adja. Innen érdemes kiemelni a target tulajdonságot, illetve a play() metódust. A target tulajdonság arra szolgál, hogy meghatározzuk, mely vezérlőn hajtódjon végre az adott animáció. Ezt animációktól függően vagy a TargetControlID vagy az AnimationTarget valamelyikével tudjuk beállítani.
A play metódus azért fontos számunkra, mert ezt a function-t JavaScript-ből meg tudjuk hívni, melynek eredményéül elindul az animáció!

Alaposztályok
Mivel nem minden animáció egyenesen az Animation osztályból, ezért nézzük meg azt a pár alaposztályt, melyeken keresztül indirekt lehet elérni az ősosztályt: FadeAnimation, ParentAnimation, SequenceAnimation, ParallelAnimation, InterpolatedAnimation, SelectionAnimation.
FadeAnimaiton: Ez az alaposztály az elhalványodáshoz (fade out), illetve kivilágosodáshoz (fade in) szükséges. A minimum és a maximum láthatóság ennek segítségével állítható be (minimumOpacity, maximumOpacity).
ParentAnimation: Alaposztályul szolgál azon osztályoknak, melyek tartalmaznak gyerek objektumokat (animációs osztályokat). Ilyenek például a SequenceAnimation, illetve ParallelAnimation osztályok. Fontos azt megjegyezni, hogy nem a ParentAnimation osztály-on keresztül hívódik meg a play metódus, hanem a belőle származtatott osztályból kell végrehajtanunk az animációt!
SequenceAnimation: Eme osztály a ParentAnimation osztályból származik, így ebből következik, hogy lehetnek gyermekobjektumai (animations). Ezeket, az animációkat egymásután játssza le, akár többször is. Ha ismételtetni szeretnénk az animációs sort, akkor az iterations tulajdonságot kell 1-től különbözőre beállítani. 0, vagy ennél kisebb érték esetén az animáció soha nem áll meg! 
ParallelAnimation: A SequenceAnimation ellentéte és kiegészítése. Itt az animációk nem egymás után hajtódnak végre, hanem egy időben. Értelemszerűen egyik osztály sem tartalmaz olyan animációs osztályt, mely a másik típusú lejátszási módot reprezentáló alaposztályból van származtatva!
InterpolatedAnimation: Ez az osztály alapja, azon animációs osztályoknak, melyeknél van olyan tulajdonság, melynek terjedelme megszabható. A határokat a startValue, illetve az endValue tulajdonságokkal állíthatjuk be.
SelectionAnimation: Alaposztályul szolgál ConditionAnimation illetve a CaseAnimation osztályoknak. Valamilyen logika alapján, a többféle animáció közül, mindig csak egy fog végrehajtódni!
A ConditionAnimation egy if struktúrának felel meg, ahol a feltételt a conditionScript tulajdonság segítségével szabjuk meg. A visszatérési értéktől függően választhatunk egyet a végre hajtandó animációk közül.
A CaseAnimation a switch/case vezérlési szerkezetnek feleltethető meg. Itt a kiértékelendő kifejezést a selectScript tulajdonság segítségével állíthatjuk be.

Ezeken, az osztályokon kívül még van egy pár segédosztály is, melyek nélkül az egész nem működhetne, de ezekkel mi most nem foglalkozunk.

Animációk
Az animációkat négyféle típusba szokás sorolni: Move, Resize, Fade, Color.
Move: az ilyen típusú animációk a mozgatásokért felelősek: Move Animation
Resize: az átméretezéssel kapcsolatos animok: Resize Animation, Length Animation, Scale Animation
Fade: fadeeffect-es animációk: FadeIn Animation, FadeOut Animation, Pulse Animation
Color: két szín közti átmenetes animok: Color Animation

Vannak még az úgynevezett Action-ök, melyek nem animációk, de az Animation Framework részét képezik (Action alaposztályból származnak). Ezek képesek megváltoztatni, az adott vezérlő bizonyos UI-ra kiható tulajdonságait. Action típusú osztályok: Enable Action, Hide Action, Style Action, Opacity Action, illetve Script Action.

Bővebb infó az Animációs Keretrendszerről: http://www.asp.net/AJAX/AjaxControlToolkit/Samples/Walkthrough/AnimationReference.aspx

Animációs keretrendszer használata
Az animációkat két extender támogatja csak, de ezek lefedik szinte a teljes ASP.NET-es, illetve ASP.NET AJAX-os vezérlőarzenált. Az AnimationExtender-t főleg asp.net-es vezérlőkhöz szokás kötni, de azonosítóval ellátott html tag-ekkel (pl.: div) is összekapcsolhatjuk. A másik animációt támogató Extender vezérlőnk, az UpdatePanelAnimationExtender, amely kifejezetten az UpdatePanel-hez lett kitalálva.
Általánosságban elmondható az, hogy az animációkat úgy használhatjuk, hogy valamilyen (főleg kliens oldali) eseményhez kötjük őket. Az AnimationExendter esetén a köthető események az alábbiak: load, click, mouseover, illetve mouseout. Ezekhez deklaratív módon rendelhetünk animációkat, melyeknél megszabható, a ParallelAnimation illetve a SequenceAnimation osztályoknak köszönhetően, hogy egyidejűleg vagy sorfolytonosan hajtódjanak végre.
Sajnos egyelőre csak markup fájlból lehet összeállítani az animáció listát, és itt se áll még rendelkezésünkre IntelliSence (tiszta jegyzettömb feeling ).

AnimationExtender használata
Az AnimationExtender használata a fentebb említett ok miatt kicsit nehézkes.
– Ha szintaktikai hibát ejtünk, akkor jobb esetben is csak futásidőben fog jelezni a rendszer, rosszabb esetben értesítést se kapunk róla!
– Ha nem létező objektumra hivatkozunk, akkor egyszerűen nem fog végrehajtódni az animáció.
– Ha feliratkozunk egy eseményre, de nem rendelünk hozzá kódot, akkor is csak futásidőben kapunk róla figyelmeztetést!
– Elmaradt kötelező attribútumokról sem kapunk különösebb értesítést, azonkívül, hogy nem fog elindulni az animáció.
Tehát összesítve, az AJAX Animation Framework még nem tartalmaz debug módú támogatást! Ettől azért még lehet használni.  Nézzük is meg hogyan!
Húzzunk egy AnimationExtender-t a markup fájlunkba, illetve egy Panel-t.
A Panel Id-ját írjuk át pnl_anim-ra, illetve állítsuk be a méretét 100*100-ra, a hátteret pirosra!
Az AE TargetControlId tulajdonságának adjuk meg a panelünk azonosítóját (pnl_anim).
Az AE nyitó és záró tagjei között hozzunk létre egy Animtions tagpárost:

<ajaxToolkit:AnimationExtender ID="AnimationExtender1" runat="server" TargetControlID="pnl_anim">
  <Animations>
  </Animations>
</ajaxToolkit:AnimationExtender>

Ebben még kapunk segítséget az IntelliSence-től.. Ezek után el kell döntenünk, mely eseményekhez szeretnénk animációt rendeli. Mi most a load, mouseover illetve mouseout eseményre iratkozunk fel. Ezt úgy tudjuk megtenni, hogy létrehozunk egy olyan xml elemet, mely On-nal kezdődik, és az eseménynevére hasonlít a vége. Vagyis:
 
<ajaxToolkit:AnimationExtender ID="AnimationExtender1" runat="server" TargetControlID="pnl_anim">
  <Animations>
    <OnLoad></OnLoad>
   <OnHoverOver>
   </OnHoverOver>
   <OnHoverOut>
   </OnHoverOut>
  </Animations>
</ajaxToolkit:AnimationExtender>

(A click eseményre az OnClick segítségével lehet feliratkozni).
Ha csak egyetlen animációt akarunk végrehajtatni egy adott eseménynél, akkor egyszerűen csak írjuk be az adott animációt.

<OnLoad>
   <Pulse Duration=".1" />
</OnLoad>

Ha egymás után végrehajtódó animációkat szeretnénk, akkor létre kell hoznunk nekik egy Sequence konténert.
 
<OnHoverOver>
  <Sequence>
    <FadeIn Duration="1" Fps="25" />
    <OpacityAction AnimationTarget="pnl_anim" Opacity=".5" />
  </Sequence>
</OnHoverOver>

Ha párhuzamos végrehajtandó anim-okra van szükségünk, akkor a Parallel konténer-re van szükségünk.

<OnHoverOut>
  <Parallel Duration="1" Fps="25">
    <Resize Height="110" Width="110" />
    <OpacityAction AnimationTarget="pnl_anim" Opacity="1" />
  </Sequence>
</OnHoverOut >

És készen is vagyunk! Természetesen a Parallel illetve Sequence konténerek egymás ágyazhatóak (asszem 12 szint mélységig, de ebben nem vagyok biztos).

Design módú támogatás eléggé siralmas, ezért csak képben merem megmutatni:

Végül annyi megjegyezést tennék még, hogy a letölthető példaalkalmazásban megpróbáltam minden típusú, fajtájú animációkra példákat mutatni. Természetesen egyik se tökéletes, sőt inkább tovább fejlesztendőek!

Innentől már csak a kreativitásunk szabhat korlátot az animációnknak (meg a framework )!