Daily-Hour 39: VisualStateManager VisualTransition
Ein Control-Element wie zB. ein Button können verschiedene Zustände ahben, die auch grafisch angzeigt werden sollten. Ein Standard-Button reagiert auf MouseOver, Normal oder Pressed. Genau jetzt kommt der VisualStateManager zu tragen, der sich im System.Windwos befindet und mit einem abkürzenden Präfix wie zB: vsm (xmlns:vsm=”clr-namespace:System.Windows;assembly=System.Windows”) eingebunden.
Jedes Control besitzt spezifische Zustände (VisualState), die wiederum Zustandsgruppen (VisualStateGroup) angehören. Wenn man diese VisualState kennt, könnnen diese via VisualStateManager definiert werden.
Ein Button enthält folgende Zustände und Gruppen:
| CommonStates | Normal | Mauszeiger befindet sich außerhalb des Controls |
| CommonStates | MouseOver | Mauszeiger ist über dem Control |
| CommonStats | Pressed | Linke Maustaste wurde gedrückt, während der Mauszeiger über dem Control ist |
| CommonStates | Disable | Das Control wurde disabled |
| FocusState | Unfocused | Control besitzt nicht den Fokus |
| FocusState | Focused | Control besitzt den Fokus |
Für den Button gibt es sechs VisualStates in zwei VisualStatesGroups. Mit dem VisualStateManager kann jedem dieser VisualStates ein StoryBoard zugewiesen werden, das eine oder mehrere Animationen enthalten können, so kann ein Zustand überblendet werden. Ein Storyboard kann wie üblich definiert werden.
Die Definition des VisualStateManager erfolgt innerhalb des Controls, wie folgt:
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroups>
<vsm:VisualState x:Name=”Normal”>
<Storyboard>
…
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name=”MouseOver”>
<Storyboard>
…
</Storyboard>
</vsm:VisualState>
…
</vsm:VisualStateGroups>
</vsm:VisualStateManager.VisualStateGroups>
Diese Deklaration ist nur beispielshaft für Normal und MouseOver und kann beliebig erweitert werden und man kann dementsprechenden die Animationen im Storyboard definieren.
VisualTransition
Man kann weitgehende Kontrolle über die ablaufenden Animationen mittels VisualTransition erlangen. Die VisualTransitions werden in der TransitionsCollection gesammelt, die ein Parameter der VisualStateGroup ist. Eine Transition ist nur innerhalb einer Gruppe möglich, da die Zustände zusammengehörig sind.
Man kann über VisualTransitions definieren:
- von welchen in welchen Zustand die Transition erfolgen soll (From, To)
- wie lange der Zustandsübergang dauern soll (GenerateDuration)
- ob ein Storybord gestartet wird, wenn die Zustandsänderung eintritt (Storyboard)
So kann man die Zustandsübergang von Einem zum Anderem Zustand definieren (zB Pressed nach MouseOver in 2 Sekunden)
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroups>
<vsm:VisualStateGroups.Transitions>
<vsm:VisualTransition From=”Pressed” To=”MouseOver” GeneratedDuration=”0:0:2″/>
</vsm:VisualStateGroups.Transitions>
….
</vsm:VisualStateGroups>
</vsm:VisualStateManager.VisualStateGroups>
Aber man kann auch ein Storyboard definieren, das während der angegebenen Dauer abgespielt wird.
<vsm:VisualTransition From=”Pressed” To=”MouseOver” GeneratedDuration=”0:0:2″>
<Storyboard>
<DoubleAnimation Storyboard.TargetName=”EinObjekt” Storyboard.TargetPorperty=”EineProperty”/>
</Storyboard>
</vsm:VisualTransition>
Die bekannten Parameter von Storyboards und Animationen können bei VisualTransitions sowie VisualStates zum Einsatz kommen, wie zB AutoReverse und RepeatBehavior.



