Je teste actuellement la nouvelle mouture de SilverLight 2 et je tenais à vous faire part d'un changement qui m'a pas mal agacé.

Le VisualStateManager est assez sympathique à utiliser. C'est très simple, par contre cela m'a obligé à reprendre tous mes styles précédemment créé en Beta 1 pour les convertir dans ce nouveau mode.

Nous sommes en beta, c'est donc normal qu'il y ait des changements.

Prenons le cas d'un template que j'avais défini pour mes boutons ronds dans le caroussel.

Le look and Feel précédemment défini via des StoryBoard portant des noms précis :

<Storyboard x:Key="Normal State" />
                                <Storyboard x:Key="MouseOver State">
                                    <DoubleAnimation Duration="0:0:0.3" Storyboard.TargetName="LinearBevelLightStart" Storyboard.TargetProperty="Offset" To=".5" />
                                    <DoubleAnimation Duration="0:0:0.3" Storyboard.TargetName="LinearBevelLightStart2" Storyboard.TargetProperty="Offset" To=".5" />
                                </Storyboard>
                                <Storyboard x:Key="Pressed State">
                                    <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="LinearBevelLightEnd" Storyboard.TargetProperty="Offset" To=".5" />
                                    <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="LinearBevelLightEnd2" Storyboard.TargetProperty="Offset" To=".5" />
                                </Storyboard>
                                <Storyboard x:Key="Disabled State">
                                    <DoubleAnimation Duration="0:0:0" Storyboard.TargetName="LinearBevelLightEnd" Storyboard.TargetProperty="Opacity" To="1" />
                                    <DoubleAnimation Duration="0:0:0" Storyboard.TargetName="LinearBevelLightEnd2" Storyboard.TargetProperty="Opacity" To="1" />
                                </Storyboard>

s'est changé en :
                            <vsm:VisualStateManager.VisualStateGroups>
                                <vsm:VisualStateGroup x:Name="FocusStates">
                                    <vsm:VisualState x:Name="Unfocused"/>
                                    <vsm:VisualState x:Name="Focused"/>
                                </vsm:VisualStateGroup>
                                <vsm:VisualStateGroup x:Name="CommonStates">
                                    <vsm:VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0.3" Storyboard.TargetName="LinearBevelLightStart" Storyboard.TargetProperty="Offset" To=".5" />
                                            <DoubleAnimation Duration="0:0:0.3" Storyboard.TargetName="LinearBevelLightStart2" Storyboard.TargetProperty="Offset" To=".5" />
                                        </Storyboard>
                                    </vsm:VisualState>
                                    <vsm:VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="LinearBevelLightEnd" Storyboard.TargetProperty="Offset" To=".5" />
                                            <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="LinearBevelLightEnd2" Storyboard.TargetProperty="Offset" To=".5" />
                                        </Storyboard>
                                    </vsm:VisualState>
                                    <vsm:VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0" Storyboard.TargetName="LinearBevelLightEnd" Storyboard.TargetProperty="Opacity" To="1" />
                                            <DoubleAnimation Duration="0:0:0" Storyboard.TargetName="LinearBevelLightEnd2" Storyboard.TargetProperty="Opacity" To="1" />
                                        </Storyboard>
                                    </vsm:VisualState>
                                    <vsm:VisualState x:Name="Normal"/>
                                </vsm:VisualStateGroup>
                            </vsm:VisualStateManager.VisualStateGroups>

Jusque là tout va bien. Les changements sont sympathiques.

Par contre là où le bas blesse, concerne la gestion des événements sur les contrôles type button et autre listbox.

Dans les "Breaking Changes Between Beta 1 and Beta 2" que je vous invite à lire, on peut remarquer des changements sur ButtonBase, par exemple :) .

Certains événements ne sont plus "routés" et il n'est donc plus possible de s'y abonner.

Parmis ceux-ci on retrouve 3 événements qui m'ont pas mal servi, notamment dans le carrousel et dans l'utilisation de drag and drop :

  • OnMouseLeftButtonDown

  • OnMouseLeftButtonUp

  • OnMouseMove

Sachez juste que ces événements sont "routés" parfaitement sur les éléments graphiques tels que les glyphes, les ellipses et autres rectangles.

La conclusion de cela est que je vais devoir créer mes propres contrôles si je veux utiliser ces événements.

Alexandre Equoy