Silverlight Trigger oder nicht Trigger

Ich hab in einem anderen Blog Posting gelesen, wie toll der Einsatz von Triggern unter Silverlight 2 doch ist. Leider sind Trigger in Silverlight 2 eigentlich gar nicht vorhanden. Und das was vorhanden ist, wurde nur aus komptibilitätsgründen zu WPF implementiert. Aber der Reihe nach

Was ist ein Trigger?

Ein Trigger löst ein Event aus. In WPF werden Trigger als Unterelement eines Controls definiert. In Silverlight gibt es nur einen möglichen Trigger, nämlich loaded.

Was kann ich mit einem Trigger tun?

In der Regel startet man damit eine Animation. Z.B. wenn man die Maus über einen Button bewegt ändert sich das Design. Leider müssen wir uns in Silverlight mit Loaded begnügen, also kein MouseOver.

<TextBox Height="24" Width="113.007" Canvas.Left="8" Canvas.Top="8" Text="TextBox" 
         x:Name="text3"
          KeyDown="TextBox_KeyDown"
         TextWrapping="Wrap" Background="yellow" RenderTransformOrigin="0.5,0.5">
            <TextBox.Triggers>
                <EventTrigger RoutedEvent="Canvas.Loaded">
                    <BeginStoryboard>
                        <Storyboard AutoReverse="True" RepeatBehavior="Forever">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="text3" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
                                <SplineDoubleKeyFrame KeyTime="00:00:01.1000000" Value="0.425"/>
                            </DoubleAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="text3" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                                <SplineDoubleKeyFrame KeyTime="00:00:01.1000000" Value="-32.504"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </TextBox.Triggers>
            <TextBox.RenderTransform>
        <TransformGroup>
            <ScaleTransform/>
            <SkewTransform/>
            <RotateTransform/>
            <TranslateTransform/>
        </TransformGroup>
    </TextBox.RenderTransform>
</TextBox>

Welche Alternativen gibt es zu Triggern?

Man kann natürlich auch das Loaded Event eines jeden Controls nehmen und dort mit einer Zeile Code die Animation starten. Das geht eine wenig am Sinne des Erfinders vorbei. Silverlight soll ja Designer und Coder zusammen führen bzw den Workflow trennen. Wann eine Animation startet ist eigentlich Job des Designers. Microsoft sieht das auch so und hat den Visual State Manager spendiert. Dort wird pro Status oder Statusübergang eine Animation definiert. Anbei ein  Ausschnitt des VSM eines Buttons.

<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name="CommonStates">
<vsm:VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="BackgroundAnimation" Storyboard.TargetProperty="Opacity">
<SplineDoubleKeyFrame KeyTime="0" Value="1"/>
</DoubleAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="0" Value="#F2FFFFFF"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="0" Value="#CCFFFFFF"/>                    </ColorAnimationUsingKeyFrames>                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="0" Value="#7FFFFFFF"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
                

Gibts es nun Trigger oder nicht?

Weil das vorige Beispiel kein Mensch runtertippt, hat Microsoft dem Produkt Expression Blend eine entsprechende visuelle Unterstützung beigelegt.

image

Kann ich eine Antwort haben?

Genau an dieser Stelle war früher der Dialog von Triggern zu finden, die sind nun weg. Also ich behaupte Visual State Manager ersetzt die Trigger in Silverlight 2. Ich bin auch nicht traurig darüber, da Trigger ohnehin kein MouseOver konnten. Zitat aus der Hilfe

TriggerAction exists in Silverlight 2 solely for WPF compatibility. TriggerAction is not intended to be derived from as a base for other trigger implementations; the entire Triggers syntax is a discouraged technique in Silverlight 2.

Und wie sieht es in der Zukunft aus?

Auf der MIX Konferenz wird es die erste Beta von Silverlight 3 geben. Da werden viele schöne Sachen drin sein die echt cool sind ( zb 3 D Support oder property Binding). Trigger laufen da unter weniger wichtig. Sogar im Gegenteil, Microsoft wird WPF den Visual State Manager spendieren, weil der um Ecken einfacher ist.

Die Moral?

Finger weg von Triggern.

Kommentare sind geschlossen