február, 2009 havi archívum

Silverlight-os okosságok #001

Posted: 2009. február 26. in Silverlight
1 hónap kihagyás után, folytatom tovább a blogolást a tőlem megszokott tempóban és stílusban! Az egy hónapos szünet oka egyrészt a vizsgaidőszak utáni jól megérdemelt pihenés, másrészt pedig egy Silverlight-os Webáruház! Az elkövetkezendő néhány hétben az alkalmazás lefejlesztése során összegyűjtött tapasztalataimat szeretném Veletek megosztani. A mai bejegyzésben két ilyen kis szösszenettel „ajándékozlak meg” benneteket.
A legfontosabb tapasztalat, hogy az Silverlight NEM üzleti alkalmazások fejlesztésére lett kitalálva! Ez mondjuk nem túl nagy újdonság, hiszen aki már látott Silverlight-os alkalmazást az tudja, hogy csillog-villog-pörög-zúg meg mindent tud, amit egy interaktív médiaalkalmazásnak tudnia kell, de sajnos pont emiatt néhány olyan dolog nincs benne, ami egy üzleti alkalmazásnál nélkülözhetetlen lenne. Például: navigáció, validálás, globális config fájl, rich text támogatás, stb..
Ma a globálisan elérhető beállítások, illetve a globálisan elérhető adatok problémájára szeretnénk egy-egy lehetséges megoldást mutatni.
 
 
 
Tegyük fel, hogy szeretnénk egyedi betűtípust használni az alkalmazásunkban. Ha egyedi betűtípust használunk, akkor azt minden egyes vezérlőnél (vagy hozzájuk tartozó stílusnál) meg kell adnunk. Ez nem túl jó dolog, mert egyrészt sokat kell gépelnünk (ez rendkívüli módon növeli az elgépelés esélyét, amit persze majd csak futásidőben veszünk észre), másrészt pedig módosítás esetén eléggé sok munkával jár az átírás. (A Ctrl+H ismerete nem túl sokat segít a problémán!)
Amikor hivatkozunk egy egyedi betűtípusra, akkor az azt tartalmazó fájl elérési útját + ’#’-ot + a betűtípus nevét, vagyis egy stringet kell megadunk.
(pl.: Fonts/times.tff#Times New Roman) Mi lenne, ha ezt a string-et az App.xaml-ben tárolnánk? Jó, jó, de mégis hogyan!?
Ahhoz, hogy az App.xaml-ben el tudjunk tárolni string-eket, ahhoz egy jól ismert dll-re van csak szükségünk, konkrétan az mscorlib-re. El kell helyeznünk egy névtér hivatkozást a benne lévő névtérre, pl.:
xmlns:clr="clr-namespace:System;assembly=mscorlib"
, majd az Application.Resources tageken belül valahova pedig be kell pötyögnünk az alábbi sort:
<clr:String></clr:String>
Adjunk ennek az objektumnak egy nevet az x:Key segítségével és a content részében helyezzük el az eltárolni kívánt string-et, pl.:
<clr:String x:Key="MyFontFamily">Fonts/times.tff#Times New Roman</clr:String>
Ezek után már bárhonnan egyszerűen hivatkozhatunk erre a stringre:
 
FontFamily="{StaticResource MyFontFamily}"
 
 
Szuper, most már el tudunk tárolni szövegeket globálisan, de ennyivel mi nem elégszünk meg, hiszen mi nem csak elérni szeretnénk őket, hanem mondjuk módosítani is, vagy például string-eknél komplexebb dologokra lenne szükségünk globálisan. Nos, ilyenkor az a teendő, hogy létrehozunk az alábbi módon egy új osztályt:
public class Global
{
    private static Global _instance;
    public static Global GetInstance()
    {
        if (_instance == null) return _instance = new Global();
        else return _instance;
    }
}
A GetInstance() függvény (az osztályunk lelek), úgy működik, hogy vagy létrehoz egy új Global példányt, ha még nem nincs belőle egy se, vagy pedig visszaadja az éppen „aktuális” (egyetlen) Global osztály példányunkat. Tehát a Global rendkívül egyszerűen használható: a GetInstance függvényen keresztül tudjuk majd elérni az osztályon belül tárolt információkat. Nézzünk egy egyszerű példát! Adjunk az osztályunkhoz egy bool típusú tulajdonságot és legyen az a neve, hogy IsAuthenticated:
[DefaultValue(false)]
public bool IsAuthenticated { get; set; }
 
A „globális változónknak” a beállítása vagy a lekérdezése ilyen egyszerű:
Global. GetInstance().IsAuthenticeted = true;
if(Global. GetInstance().IsAuthenticeted) lbl_welcome.Text = "Üdv néked blog olvasó!";
Nem tudom közületek hányan ismerték ezt a két apró kis trükköt, de remélem, azért van olyan köztetek, akinek sikerült újat mutatnom.  Jövő héten a navigációs problémákkal fogunk foglalkozni.