Изменения программного состояния не работают в Silverlight - PullRequest
4 голосов
/ 18 апреля 2011

Я пытаюсь изменить состояния с помощью визуального менеджера состояний с помощью кода.

Я использую:

Microsoft.Expression.Interactivity.Core.ExtendedVisualStateManager.GoToElementState(this.LayoutRoot, "stateRegistration", true);

Но, похоже, он не хочет работать, я создал обработчик событий, а также прослушиватель, но при использовании этого кода состояние не меняется.

Может ли кто-нибудь помочь мне.

КОД XAML (фрагмент кода):

<Grid x:Name="LayoutRoot" Width="897" Height="699">
<VisualStateManager.VisualStateGroups>
<VisualState x:Name="stateRegistration">
                    <Storyboard>
                        <DoubleAnimation Duration="0" To="870" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="RegisterContent" d:IsOptimized="True"/>
                        <DoubleAnimation Duration="0" To="880" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="HomeContent" d:IsOptimized="True"/>
                        <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="btnRegRegister" d:IsOptimized="True"/>
                        <DoubleAnimation Duration="0" To="-10" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="btnRegRegister" d:IsOptimized="True"/>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
</Grid>

Спасибо.

1 Ответ

6 голосов
/ 18 апреля 2011

С VisualStateManager происходит странное поведение: его состояния должны находиться не в элементе управления, а в дочернем элементе управления.

Это означает, что метод GoToState должен вызываться с параметром this вместо параметра this.LayoutRoot, но определения групп состояний должны находиться внутри Grid:

VisualStateManager.GoToState(this, "stateRegistration", true);

Я не знаю, где взять класс ExtendedVisualStateManager, поэтому я использую класс по умолчанию.

Кроме того, если какая-либо анимация состояния раскадровки не работает - все анимации отменяются.Попробуйте этот пример кода с двумя анимациями, он должен работать:

<Grid x:Name="LayoutRoot" Width="897" Height="699">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="stateRegistration">
                <Storyboard>
                    <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="btnRegRegister" d:IsOptimized="True"/>
                    <DoubleAnimation Duration="0" To="-10" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="btnRegRegister" d:IsOptimized="True"/>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Button x:Name="btnRegRegister" Content="Some button" Click="btnRegRegister_Click" VerticalAlignment="Center" HorizontalAlignment="Center">
        <Button.RenderTransform>
            <CompositeTransform TranslateX="0" TranslateY="0" />
        </Button.RenderTransform>
    </Button>
</Grid>
...