WPF/SL动画时间缩放

WPF/SL动画时间缩放,wpf,silverlight,animation,Wpf,Silverlight,Animation,我寻找这个特别的东西,因为我认为这是非常重要和令人费解的事情,但我没有找到任何关于这个问题的东西。我想的是WPF和Silverlight动画中的时间缩放 假设我们有一个持续4s的DoubleAnimation,并将属性设置为从0到100的动画。它是自动反转的,或者有一个互补的动画可以反转它的效果,这并不重要。假设触发此动画的事件是一个简单的鼠标悬停 问题是:我将光标悬停在一个元素上。该属性在4s内从0到100。我将光标移开1s,属性从100移到75,然后我将鼠标悬停回原处。现在,物业在4s内从7

我寻找这个特别的东西,因为我认为这是非常重要和令人费解的事情,但我没有找到任何关于这个问题的东西。我想的是WPF和Silverlight动画中的时间缩放

假设我们有一个持续4s的DoubleAnimation,并将属性设置为从0到100的动画。它是自动反转的,或者有一个互补的动画可以反转它的效果,这并不重要。假设触发此动画的事件是一个简单的鼠标悬停

问题是:我将光标悬停在一个元素上。该属性在4s内从0到100。我将光标移开1s,属性从100移到75,然后我将鼠标悬停回原处。现在,物业在4s内从75变为100。对用户来说很明显,动画运行速度慢了4倍。有没有办法缩放动画的时间?如果我想让这个动画在1秒内从75运行到100,我会怎么做?我自己也在考虑一个转换器,它可以接受四个参数(绝对开始和结束、实际开始和整个时间间隔的时间跨度),然后吐出正确的时间。还有更优雅的方式吗

我注意到,当动画速度很快时,这通常不是问题。当动画以0.2秒或0.1秒的速度运行时,人类并没有真正观察到速度的差异,也许所有的动画都应该尽可能快,以免影响体验。但是请从理论上处理这个问题(因此没有代码示例)。我只是好奇是否有合适的方法来缩放动画时间

如果网上有我的问题的答案,请直接告诉我

帕维


别介意我的英语,我不是以英语为母语的;)

我知道这并不能回答您的确切问题,但解决这一问题的一种方法是捕获
MouseEnter
MouseLeave
,检查当前动画状态并暂停或恢复:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="AnimationTest.MainPage"
    Width="640" Height="480">
    <UserControl.Resources>
        <Storyboard x:Name="Rotate" AutoReverse="True">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="textBlock">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:4" Value="100"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock x:Name="textBlock" Margin="197,216,200,215" TextWrapping="Wrap" Text="My Funky Text" FontSize="32" RenderTransformOrigin="0.5,0.5" MouseEnter="textBlock_MouseEnter" MouseLeave="textBlock_MouseLeave">
            <TextBlock.RenderTransform>
                <CompositeTransform/>
            </TextBlock.RenderTransform>
        </TextBlock>
    </Grid>
</UserControl>

我做了更多的研究。看来,缩放动画时间的唯一好方法是使用MultiConverter,它采用边界值(例如,上一个示例中的0和100)、动画属性的当前值以及完整动画的运行时间(例如,我的示例中的4s)。然后,它应该计算应该完成动画的百分比(因此,如果当前值为75,全范围为0-100,则剩余25%的动画),返回值应该是原始时间跨度的上述百分比(4s的25%为1s)。也许这不是实现目标的最优雅的方式,但它似乎应该起作用。

我在让动画以您描述的方式线性运行时遇到了同样的问题。我无法找到一个在XAML中使用WPF触发器而不必编写代码的解决方案

然后我开始使用VisualStateManager而不是触发器(WPF 4和Silverlight支持触发器)。所有的动画都表现得像你期望的那样完美


我建议使用Expression Blend 4来使用VisualStateManager,因为使用UI配置对象的各种状态只需几秒钟。

谢谢,但正如您自己所说,这并没有回答我的具体问题:)
private void textBlock_MouseEnter(object sender, MouseEventArgs e)
{
    var state = Rotate.GetCurrentState();
    if (state == ClockState.Stopped || state == ClockState.Filling) { Rotate.Begin(); } else Rotate.Resume();
}

private void textBlock_MouseLeave(object sender, MouseEventArgs e)
{
    Rotate.Pause();
}