11 Comments

image Silverlight po defaultu dolazi sa loader splash ekranom, koji je sve samo ne lijep. Neznam za čitatelje ovog teksta, ali ja čim vidim gradijente, odnosno prijelaze, još u kružnom obliku, dobijem iznenadnu želju za skakanjem sa vrha zgrade. Srećom, da ne bi slučajno došlo do realizacije tih želja gledajući brojna učitavanja Silverlight aplikacija, zamjena ekrana učitavanja je vrlo jednostavna.

Iz sljedećeg prikaza može se vidjeti slijed učitavanja aplikacije:

image

Splash screen i događaji koji ispisuju postotak učitavanja su u biti jedna XAML datoteka i Javascript metoda koja se poziva na promjenu postotka učitavanja i vrši interakciju sa elementima prikazanom XAML ekranu.

Postupak izrade izgleda ovako:

1. U jednoj XAML datoteci je potrebno pripremiti izgled ekrana. Ovdje se nalazi primjer takve datoteke,

2. Javascript metoda služi za prikaz i animiranje tog ekrana (potrebno dodati u posebnu JS datoteku i referencirati ju iz Head elementa od web stranice):

function SourceDownloadProgressChanged(s, e) {
    var bartext = s.findname("bartext");
    var bar = s.findname("bar");
    if (bartext != null || bar != null) {
        var value = Math.round(e.progress * 100)
        bartext.Text = value + "%";
        var newWidth = 3.3 * value;
        bar.Width = Math.round(newWidth)
    }
}

3. Dodatni parametri unutar poziva Silverlight aplkacije (u html/aspx, <object> element):

<param value="preloader.xaml" name="splashscreensource" />
<param value="SourceDownloadProgressChanged" name="onSourceDownloadProgressChanged" />

1 Comments

Ovo je prvi u nizu, nadam se, brojnih kratkih pregleda open source .NET alata, frameworka, toolkitova, i svega što može poslužiti, korisno ili beskorisno!

Prvi prezentirani alat je Automapper. Radi se jako korisnom frameworku za kopiranje vrijednosti iz jednog objekta u drugi. Osim osnovnog kopiranja propertya po propertya, postoje brojni načini konfiguracije koji omogućuju složene manipulacije nad podacima, a fluent interface DSL način konfiguriranja je intuitivan i relativno jednostavan za podesiti.

Najčešći scenarij u kojemu ja upotrebljavam AutoMapper je kopiranje vrijednosti iz domenskih entiteta (sa učitanim podacima iz baze) u DTO objekte koji reprezentiraju prikaz podataka na web stranici ili windows/Silverlight formi.

Najjednostavniji primjer je kopiranje prema konvenciji, što znači da će Automapper tražiti propertye sa istim imenima:

Public class Article
{
	public int ID { get; set; }
	public string Name { get; set; }
}

Public class ArticleDTO
{
	public int ID { get; set; }
	public string Name { get; set; }
}

AutoMapper.Mapper.CreateMap<Article , ArticleDTO>();

var article = new Article() {ID = 1, Name = "some name"};

var dto = new ArticleDTO();

AutoMapper.Mapper.Map(article, dto);

Malo složenija i češća upotreba je flattening, ili pretvaranje grafa objekata u jedan objekt, uz primjenu ValueResolvera za konverziju tipa podataka:

public class Person
{
	public string Name { get; set;}
	public Address Address { get; set; }
	public bool IsMale { get; set; }
}

public class Address
{
	public string StreetName { get; set;}
	public int Number { get; set;}
}

public class PersonDTO
{
	public string Name { get; set;}
	public string LivingAddress { get; set;}
	public string Gender { get; set; }
}

public class GenderConverter : ValueResolver<bool,string>
{
	protected override string ResolveCore(bool source)
	{
		return source ? "Male" : "Female";
	}
}

var person = new Person() 
	{ Name = "Hudo", Address = new Address() {StreetName = "Sezam", Number = 1, IsMale=true}  };

AutoMapper.Mapper.CreateMap<Person , PersonDTO>()
	// kopiranje ulice i broja iz objekta Address u jedan property
	.ForMember(
	d => d.LivingAddress, 
	s => s.MapFrom(x => x.Address.StreetName + " " + x.Address.Number))
	// konverzija iz bool u string
	.ForMember(
	d=>d.Gender,
	s=>s.ResolveUsing<GenderConverter>().FromMember(x=>x.IsMale));

var dto = new PersonDTO();

AutoMapper.Mapper.Map(person, dto);

Ostali primjeri se mogu pronaći na Codeplexu (http://automapper.codeplex.com/) i naravno, Googlu.