(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 !

(Silverlight) Obtenir la taille du controle Silverligth

On a beau dire à silverlight qu'on veut du 640*400, monsieur est très capricieux!

Pour les besoins de mon prog, qui zoom grâce à la roulette, j'avais besoin de savoir où celle-ci etait déclenchée (voir le billet d'hier sur la mousewheel: on obtient des coordonnées du browser, à vous de vous débrouiller pour transformer ça en coordonnées silverligth, en tenant compte du scale etc).

Donc, après beaucoup de recherche, j'ai trouvé l'objet qu'il nous faut :
BrowserHost.ActualHeight
et BrowserHost.ActualWidth

A partir de là, vous pouvez déjà plus facilement calculer la position réel du curseur souris!

(oubliez pas d'inclure System.Windows.Interop !!)

(Silverlight) MouseWheel

Pour pouvoir utiliser la mousewheel (la roulette de la souris quoi !), en silverlight 1.1 :

http://vectorform.wordpress.com/2007/09/26/silverlight-scrollbar-component-updated-with-mousewheel-support/

Ou

http://www.RTLogicSystems.com

Les deux sont gratuits et basés sur le même système: on récupère (par un mécanisme multibrowser) la position de la roulette dans la page html, en javascript, puis on appelle une routine silverligth. Cela peut donc aussi servir d'exemple pour pouvoir communiquer entre html<->silverligth.
A noté, dans mes tests, la routine de RTL a un problème si la page dépasse la taille du browser, le comportement "par défaut" de la roulette s'active...Cela se corrige en renvoyant "1" si l'événement est pris en compte, 0 sinon.
Une autre remarque, sous windows, les valeurs renvoyées sont multiples de 160, et j'ai jamais vu une valeur autre que -160,160, donc vérifier le sens, plutôt que prendre la valeur, semble plus prudent.