【问题标题】:VisualStateManager doesn't skip 'non-generated' transitionsVisualStateManager 不会跳过“非生成”转换
【发布时间】:2012-11-29 11:49:58
【问题描述】:

Blend / WPF / Silverlight 中的 VisualState 工具非常棒,但我认为我们都可以同意,这有时是错误的。这是一个示例,我想要一些澄清/解决方法/修复。

考虑如下定义的一堆视觉状态:

<VisualState x:Name="Hidden">
       <Storyboard>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="contentPresenter">
                <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0">
                    <EasingDoubleKeyFrame.EasingFunction>
                                <CircleEase EasingMode="EaseOut"/>
                    </EasingDoubleKeyFrame.EasingFunction>
                </EasingDoubleKeyFrame>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="contentPresenter">
                <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1">
                    <EasingDoubleKeyFrame.EasingFunction>
                        <CircleEase EasingMode="EaseOut"/>
                    </EasingDoubleKeyFrame.EasingFunction>
                </EasingDoubleKeyFrame>
                                            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <CircleEase EasingMode="EaseOut"/>
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="contentPresenter">
                                            <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <CircleEase EasingMode="EaseOut"/>
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <CircleEase EasingMode="EaseOut"/>
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Revealed">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="contentPresenter">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                            <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <CircleEase EasingMode="EaseOut"/>
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="contentPresenter">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                            <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <CircleEase EasingMode="EaseOut"/>
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="contentPresenter">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                            <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <CircleEase EasingMode="EaseOut"/>
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <CircleEase EasingMode="EaseOut"/>
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>

现在创建一系列触发器来切换到这些状态,但选择忽略转换。

过渡仍在播放。似乎视觉状态管理器会看到带有多个连续关键帧的情节提要并播放整个内容,而不是在不使用转换时跳过填充。

我想要的效果是 2 阶段隐藏/显示,其中 内容 淡出然后缩小。不幸的是,这意味着将始终播放状态“转换”,无论我决定忽略转换。

我是愚蠢还是这是一个错误?有解决办法吗?

编辑 - 在这种情况下使用急性缓动功能来“延迟”过渡会更好吗?

【问题讨论】:

    标签: wpf silverlight xaml transition visualstatemanager


    【解决方案1】:

    在 VisualState 中声明的情节提要是当 VSM 处于该状态时播放的情节提要。

    您所说的要忽略的转换是在从 VisualState 转换到 VisualState 时播放的故事板。这些在 VisualStateGroup.Transitions 部分中单独指定。

    所以,类似:

    <VisualStateGroup x:Name="Something">
        <VisualState x:Name="Hidden">
        <VisualState x:Name="Revealed">
    
        <VisualStateGroup.Transitions>
            <VisualTransition From="Hidden" To="Revealed">
                <Storyboard>
                    ...
                <Storyboard>
            </VisualTransition>
            <VisualTransition From="Revealed" To="Hidden">
                <Storyboard>
                    ...
                <Storyboard>
            </VisualTransition>
        </VisualStateGroup.Transitions>
    </VisualStateGroup>
    

    并在情节提要中填写适当的动画。

    在此之后,当您将 false 传递给 VisualStateManager 的 GoToState 或 GoToElementState 方法的 useTransitions 参数时,您将看不到过渡。

    【讨论】:

    • 此外,根据预期的效果,您可能还需要在视觉状态中包含“静态”故事板(即具有捕捉和按住效果的零持续时间动画的故事板)动画属性到一个值)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2011-09-16
    • 1970-01-01
    • 2015-07-06
    • 2015-06-18
    • 2021-04-14
    • 2020-10-27
    相关资源
    最近更新 更多