Silverlight:以某种方式被重写的VisualState动画

时间:2010-01-19 18:50:19

标签: silverlight silverlight-3.0 custom-controls visualstatemanager animation

我有一个相当复杂的自定义控件,如果我向您展示了所有代码,它会让您大吃一惊。 ;)通常它是一个显示多个控件的面​​板。您可以将其视为自定义列表框。 (请不要告诉我使用列表框,我一直在那里,它完全不能满足我的需求)。

因此,我在VisualStateManager中设置了一些动画。这是发生的事情:

  • 当我悬停在我的一个子控件上时,我希望触发 MouseOver 状态。确实如此。
  • 当我选择我的一个子控件时,我希望 Selected 状态可以触发,但确实如此。
  • 当我选择其他子控件时, Selected 状态也会触发
  • 当我回到我选择的第一个子控件,选择时, Selected 状态显示为触发(通过我的代码中的调试语句)但是显示 MouseOver 动画。

是否存在一些问题,动画能够以某种方式被覆盖,或者MouseOver与我不知道的选定状态之间存在问题?

这是我的VSM标记:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="CommonStates">       
        <VisualState x:Name="Normal">
            <Storyboard>
                <ColorAnimationUsingKeyFrames BeginTime="0" Duration="00:00:00.150000" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
                    <SplineColorKeyFrame KeyTime="0" Value="DarkGray"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>
        <VisualState x:Name="MouseOver">
            <Storyboard>
                <ColorAnimationUsingKeyFrames BeginTime="0" Duration="00:00:00.150000" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
                    <SplineColorKeyFrame KeyTime="0" Value="Yellow"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
    <VisualStateGroup x:Name="SelectedStates">
        <VisualState x:Name="Unselected">
            <Storyboard>
                <ColorAnimationUsingKeyFrames BeginTime="0" Duration="1" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
                    <SplineColorKeyFrame KeyTime="0" Value="Purple"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>
        <VisualState x:Name="Selected">
            <Storyboard>
                <ColorAnimationUsingKeyFrames BeginTime="0" Duration="1" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
                    <SplineColorKeyFrame KeyTime="0" Value="Green"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

这是我的GoToState()逻辑:

private void GoToState(bool useTransitions) {     TestingVariables(“Inside GoToState”);

if (_isSelected)
{
    System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Selected VSM");
    VisualStateManager.GoToState(this, "Selected", useTransitions);
}
else if (_wasSelected)
{
    _wasSelected = false;
    System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Unselected");
    VisualStateManager.GoToState(this, "Unselected", useTransitions);
}
else if (_isMouseOver)
{
    System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing MouseOver VSM");
    VisualStateManager.GoToState(this, "MouseOver", useTransitions);
}
else
{
    System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Normal VSM");
    VisualStateManager.GoToState(this, "Normal", useTransitions);
}

}

因此,我可以看到触发了哪个VisualStateManger.GoToState()方法,并且对TestingVariables()的调用只是我用来写出我用来确定要触发哪个视觉状态的条件标志的方法。 p>

提前致谢。

1 个答案:

答案 0 :(得分:1)