Rajouter un événement sur le changement d’une DependencyProperty avec Silverlight pour Windows Phone 7

16. août 2010

La problématique est la suivante : J’ai une DependencyProperty dans une application Silverlight et cette dernière n’a pas d’événement lorsque sa valeur change.

Or, il faut que dans mon application je sois notifié sinon ca ne marchera pas.

Quel cruel dilemne! D’autant plus qu’en WPF je n’aurai aucun mal à faire cela puisque je pourrai directement me brancher dessus en tant qu’owner ou bien encore récupérer ses métadatas et rajouter un événement.

Mais sous Windows Phone 7, point de tout cela. Heureusement il existe (au moins) une solution (je dis au moins, car au bureau on veut me faire croire qu’il existerait d’autres solutions mais plus élégantes. Comme pour le moment ils n’ont rien trouvé, je publie la mienne:))

 

Nous allons tout simplement faire un binding entre la propriété que je veux surveiller et une DependencyProperty que je vais créer et ou je pourrais sans problème indiquer un événement. Ainsi quand ma propriété d’origine va changer, le binding va automatiquement changer ma propriété de surveillance qui me lèvera gentiment un événement.

En code cela donne donc ceci:

using System;
using System.Windows;
using System.Windows.Data;
using Microsoft.Phone.Controls;

namespace WindowsPhoneApplication1
{
    public class DependencyProperyWatcher<T> : DependencyObject
    {
        public event EventHandler ValueChanged;
        public static readonly DependencyProperty property = 
DependencyProperty.Register("Value", typeof(T),
typeof(DependencyProperyWatcher<T>), new PropertyMetadata(OnvalueChanged)); static void OnvalueChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e) { ((DependencyProperyWatcher<T>) d).RaiseValueChanged(); } public DependencyProperyWatcher(DependencyObject d, string propName) { var bnd = new Binding(propName) { Source = d, Mode = BindingMode.OneWay }; BindingOperations.SetBinding(this, property, bnd); } void RaiseValueChanged() { if (ValueChanged != null) ValueChanged(this, EventArgs.Empty); } } public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); } public void test() { DependencyProperyWatcher<double> toto =
new DependencyProperyWatcher<double>(this, "Width"); } } }

 

Via ma variable toto, je peux avoir accès à un événement qui sera levé à chaque fois que la propriété Width de ma page changera !

Bookmark and Share

Windows Phone, Silverlight, .Net ,

SilverCollecto

24. mars 2010

Mon célèbre gestionnaire de collections (mondialement reconnu dans mon bureau et sur le tapis de la salle de bain) sort dans une nouvelle version en Silverlight 4.0.

Au menu des animations, des projections, des jolies couleurs, des projections, de l’entity framework, des projections, du WCF RIA Services et des projections.

Quelques captures de la bête:

image image

image image

SilverCollecto gère:

  • Liste des collections sous forme de TreeView
  • PictureFlow pour les images associées aux items
  • WCF RIA Services pour la synchro avec SQL Server
  • Drag’n’Drop

Je mettrai bientôt en ligne les sources mais on peut déjà tester le tout ici : http://collecto.catuhe.com (je crée des comptes utilisateurs sur simple demande).

Reste encore des bugs et surtout rien n’est sécurisé mais ca ne devrait plus tarder…

Bookmark and Share

Silverlight

BDC 2010 – C’est reparti!

4. mars 2010

A la demande générale, la Bewise Day Conference est de retour pour une 4ème édition ! Encore une fois, venez découvrir ce qui se fait de mieux dans les technologies Microsoft.

Cette année, beaucoup de nouveautés, puisque Microsoft lance la gamme 2010 de ses produits, notamment Visual Studio, Sharepoint, mais aussi la version 4.0 de son framework .Net, MVC 2, Azure, Silverlight 4 et bien d’autres choses bien croustillantes.

J’animerai les plénières cette année et je vous conseille d’y participer car vous y découvrirez le grand secret de Bewise :).

Pour les inscriptions, rendez-vous sur le site officiel de la BDC 2010.

Bookmark and Share

Bewise, .Net, 3D, Silverlight, Visual Studio, Windows Forms, Windows Mobile, WPF

Preview de Nova 2009

14. janvier 2009

Pour le plaisir des yeux, je viens d’ouvrir une nouvelle section sur mon blog. Cette section nommée “Previews Nova” permettra d’avoir des previews de réalisations autour de Nova.

Cela se passe par ici.

Vous y trouverez une petite application silverlight (utilisant Deep Zoom) pour bien visualiser les images de previews (amusez vous à zoomer avec la molette de la souris).

On commence la série par une image issue d’une démo réalisée par mon ami mais néanmoins artiste Mitch. La démo en question utilise notre shader de métal et une nouvelle technique de représentation du verre (notamment sur les phares).

Bookmark and Share

Silverlight, Nova

NovaLight - Silverlight 2

29. octobre 2008

Juste une petite news pour indiquer que j'ai recompilé NovaLight avec la version définitive de Silverlight 2.

Au final, l'update du projet n'ayant pas marché j'ai du reconstruire un nouveau projet et basculer vers le VisualStateManager. Rien de bien méchant donc.

La suite par ici.

Bookmark and Share

.Net, Silverlight

Silverlight 2.0 beta 2

11. juin 2008

Comme vous devez déjà le savoir, la béta 2 de Silverlight 2.0 est sortie la semaine dernière.

J'en ai donc profité pour recompiler NovaLight et le Philosophe du Chaos.

Excellente nouvelle : le portage s'est fait en a peu près 20 secondes. L'installation se fait très facilement avec un plugin qui s'installe sous Visual Studio 2008.

 

En ce qui concerne mon besoin de génération d'images dynamiques je n'ai encore rien vu de nouveau mais l'espoir fait vivre...

Bookmark and Share

.Net, Silverlight

Silverlight 2 3D - Part 6

1. mai 2008

Au programme aujourd'hui : lissage de Gouraud. Les faces des objets ne sont désormais plus uniformément colorées mais subissent correctement l'éclairage (calculé au niveau des vertices).

Il reste un soucis sur le depth buffer qui me fait passer parfois certains pixels par-dessus d'autres. Je travaille à augmenter la précision de tout ça.

Prochaine étape : les textures.

Pour jeter un coup d'oeil, c'est ici.

Bookmark and Share

.Net, Silverlight

Silverlight 2 3D - Part 5

25. avril 2008

CA Y EST!!!! J'ai enfin pu faire un simili pixel shader. En gros grâce à un encoder PNG, je peux générer une image en mémoire, la compresser en PNG et la donner à un contrôle image via un BitmapImage:

scene.Render();
BitmapImage image = new BitmapImage();

image.SetSource(scene.BackBuffer.GetStream());
renderImage.Source = image;

A partir de ça, j'ai pu simuler un Depth Buffer. Résultat : les objets s'affichent bien, les faces ne se passent plus les unes sur les autres.

De plus j'ai mis en place un interpolateur qui va me permettre de gérer des textures.

Finalement, je vais rajouter une gestion multi-threads pour supporter les multi-cores.

Pour la petite histoire, sans la génération PNG (qui n'est utile que parce que le contrôle Image ne sait pas manger du bmp), le moteur irai deux fois plus vite.

Par contre, grâce à tout ça, les objets complexes sont carrément plus rapide. J'en veux pour preuve le nain qui tourne à 20fps chez moi là ou il tournait à 9fps précédemment.

Tout ce passe ici.

Bookmark and Share

.Net, Silverlight

Back From the BDC 2008

18. avril 2008

Partage de storyboards en Silverlight

26. mars 2008

Plusieurs personnes m'ont demandé le code des barres qui apparaissent sur mouse over dans Nova Light.

Je m'exécute donc avec plaisir :). Cela va me permettre de parler un peu du partage d'animations via les storyboards.

Pour la partie contrôle j'ai défini une grille toute simple:

<Grid HorizontalAlignment="Left" Margin="-134,0,0,0" Width="210" VerticalAlignment="Stretch" RenderTransformOrigin="0.5,0.5" x:Name="grid" MouseEnter="grid_MouseEnter" MouseLeave="grid_MouseLeave">
    <Grid.RenderTransform>
        <TransformGroup>
            <ScaleTransform/>
            <SkewTransform/>
            <RotateTransform/>
            <TranslateTransform/>
        </TransformGroup>
    </Grid.RenderTransform>
    <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" Width="Auto" Stroke="#C1C1C1" VerticalAlignment="Stretch" RadiusX="10" RadiusY="10">
        <Rectangle.Fill>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                <GradientStop Offset="0" Color="#FBFBFB"></GradientStop>
                <GradientStop Offset="0.5" Color="#F3F3F3"></GradientStop>
                <GradientStop Offset="0.5" Color="#E8EAEA"></GradientStop>
                <GradientStop Offset="1.0" Color="#ECECEC"></GradientStop>
            </LinearGradientBrush>
        </Rectangle.Fill>
    </Rectangle>
    <CheckBox x:Name="ckFPS" HorizontalAlignment="Left" Foreground="#888888" Content="FPS" Checked="ckFPS_Checked" Unchecked="ckFPS_Unchecked" Margin="14,0,0,0"/>
    <TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Text="Options" TextWrapping="Wrap" d:LayoutOverrides="Width, Height" Margin="0,0,15,0" Foreground="#888888"/>
    <Image Source="Grip.png" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0, 15, 4, 15"/>
</Grid>

J'ai également déclaré dans les resources du contrôle les storyboards suivants:

<Storyboard x:Name="ShowScenes">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="gridScene" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" BeginTime="00:00:00">
        <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="322"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name="HideScenes">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="gridScene" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" BeginTime="00:00:00">
        <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

On pourra noter que les storyboards ciblent une autre grille que la mienne. En effet, je me sers de ces storyboards de manière générique pour toutes les barres du contrôle.

Toute la magie se fait donc au niveau des événements "grid_MouseEnter" et "grid_MouseLeave":

private void grid_MouseEnter(object sender, MouseEventArgs e)
{
    Storyboard.SetTarget(ShowScenes, grid);
    ShowScenes.Begin();
}

private void grid_MouseLeave(object sender, MouseEventArgs e)
{
    Storyboard.SetTarget(HideScenes, grid);
    HideScenes.Begin();
}

On en revient donc toujours à ces propriétés attachées :). En effet, il me suffit ici de venir changer la cible de mon storyboard via la méthode statique Storyboard.SetTarget.

Et le tour est joué!

Bookmark and Share

.Net, Silverlight