ExtendedVisualStateManager.GoToElementState возвращает false в Silverlight

У меня есть настраиваемый элемент управления, анимацию которого я хочу контролировать. Я пытаюсь обновить это с помощью VisualStateManager.GoToState, но он всегда возвращает false в Silverlight, и анимация никогда не запускается. Это отлично работает в WPF, хотя и с тем же XAML.

Код Silverlight

//to start
retval = ExtendedVisualStateManager.GoToElementState(this.canvasParent, "WorkingState", true);

Код WPF

retval = VisualStateManager.GoToElementState(this.canvasParent, "WorkingState", true);

XAML (общий):

<Style TargetType="local:WaitSpinner">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:WaitSpinner">
                <Viewbox Visibility="{TemplateBinding Visibility}">
                    <Canvas RenderTransformOrigin="0.5,0.5" x:Name="CanvasParent" Width="120" Height="120">
                        <!-- other awesomeness -->

                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="Working">
                                <VisualState x:Name="WorkingState">
                                    <Storyboard>
                                        <DoubleAnimation
                                        Storyboard.TargetName="SpinnerRotate"
                                        Storyboard.TargetProperty="Angle"
                                        From="0" To="360" Duration="0:0:01.3"
                                        RepeatBehavior="Forever" />
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Stop"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Canvas>
                </Viewbox>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

person Chris    schedule 19.07.2013    source источник


Ответы (1)


Поместите <VisualStateManager.VisualStateGroups> на первый ControlTemplate дочерний элемент:

<Style TargetType="local:WaitSpinner">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:WaitSpinner">
                <Viewbox Visibility="{TemplateBinding Visibility}">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="Working">
                            <VisualState x:Name="WorkingState">
                                <Storyboard>
                                    <DoubleAnimation
                                    Storyboard.TargetName="SpinnerRotate"
                                    Storyboard.TargetProperty="Angle"
                                    From="0" To="360" Duration="0:0:01.3"
                                    RepeatBehavior="Forever" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Stop"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <!-- ................. -->

Изменить: (полный ответ с вашим комментарием) Используйте метод VisualStateManager GotoState с this :

VisualStateManager.GoToState(this, "WorkingState", true);
person Tonio    schedule 19.07.2013
comment
Это, к сожалению, не имело значения - person Chris; 19.07.2013
comment
Исправление: при использовании VisualStateManager.GotoState с this это работает! Я использовал только расширенный, потому что этот оригинал не работал, спасибо - person Chris; 19.07.2013
comment
Да, я не видел this.canvasParent и GoToElementState, извините... Я добавил это в свой ответ... - person Tonio; 19.07.2013