(silverlight) Un ptit helper, ou le pourquoi des SetValue

Quand on fait beaucoup de Silverlight, on se retrouve sans arrêt à taper des superbes lignes comme:
Sprite.SetValue(Canvas.TopProperty,25);

C'est assez surprenant pour un environnement vectoriel, les objets n'ont pas de propriétés x et y directement accessibles!

Alors, vous me direz, quelle idée bizarre !
Mais bon, les gens de microsoft ont une bonne raison à cela. En fait le "pattern" utilisé est le même que sur les événements pour les winform pour gérer les événements. Ca permet d'optimiser beaucoup de place sur les vtables, l'occupation mémoire, et d'optimiser certaine propriétés, j'y reviendrai plus longuement un jour...

Donc, pour vous simplifier la vie, j'ai créé quelques méthodes, grâce aux méthodes d'extension de 3.0:



public static class Helper
{

public static void SetTop(this FrameworkElement c, double v)
{
c.SetValue(Canvas.TopProperty, v);
}

public static double GetTop(this FrameworkElement c)
{
return (double)c.GetValue(Canvas.TopProperty);
}

public static void SetLeft(this FrameworkElement c, double v)
{
c.SetValue(Canvas.LeftProperty, v);
}

public static double GetLeft(this FrameworkElement c)
{
return (double)c.GetValue(Canvas.LeftProperty);
}

public static double GetBottom(this FrameworkElement c)
{
return (double)c.GetValue(Canvas.TopProperty) + c.Height;
}

public static double GetRight(this FrameworkElement c)
{
return (double)c.GetValue(Canvas.LeftProperty) + c.Width;
}

public static bool NotNull(this string c)
{
return !string.IsNullOrEmpty(c);
}

public static void SetName(this FrameworkElement c, string name)
{
c.SetValue(Canvas.NameProperty, name);
}

public static string GetName(this FrameworkElement c)
{
return c.GetValue(Canvas.NameProperty) as string;
}

public static double GetAlpha(this FrameworkElement c)
{
return (double)c.GetValue(Canvas.OpacityProperty);
}

public static void SetAlpha(this FrameworkElement c, double alpha)
{
c.SetValue(Canvas.OpacityProperty, alpha);
}
}

J'aurais préféré des propriétés bien sur, mais ce n'est pas faisable en C# 3.0 :(

Donc maintenant, pour déplacer votre control de 15 pixels :
sprite.SetTop(sprite.GetTop()+15);

A la place de :

sprite.SetValue(Canvas.TopProperty,(double)sprite.GetValue(Canvas.TopProperty)+15);

C'est quand même plus lisible !

Aucun commentaire: