2

在动画结束后保持(“填充”)动画属性值时,我在 Silverlight 和 WPF 中遇到了不同的行为。FillBehavior 属性文档中的备注部分说

如果您不小心停止意外动画,填充行为可能会造成属性在运行时不可设置的错觉。尝试在代码中更改来自填充动画的动画值似乎没有效果,直到填充动画停止。

然而,在 Silverlight 中,这似乎不是真的。在下面的小示例中,当单击“淡出”按钮时,我Opacity将填充到零的动画。Rectangle尽管动画FillBehavior设置为HoldEnd,但在“重置”按钮单击处理程序中将不透明度重置为 1 有效并且按钮重新出现。如果我在 WPF 应用程序中执行相同操作,则它的行为与预期相同,即单击“重置”按钮没有视觉效果。

我的问题是,有没有其他人观察到这种行为?这可能是 Silverlight 中的错误,还是我遗漏了什么?

我在这里使用 Silverlight 5 和 WPF 4.5。

<StackPanel HorizontalAlignment="Center">
    <Rectangle Name="rect" Width="200" Height="100" Fill="DarkGreen"/>
    <Button Content="Fade Out" Click="FadeOutButtonClick"/>
    <Button Content="Reset" Click="ResetButtonClick"/>
</StackPanel>

-

private void FadeOutButtonClick(object sender, RoutedEventArgs e)
{
    var animation = new DoubleAnimation
    {
        To = 0d,
        Duration = TimeSpan.FromSeconds(1),
        FillBehavior = FillBehavior.HoldEnd
    };

    Storyboard.SetTargetProperty(animation, new PropertyPath(UIElement.OpacityProperty));
    Storyboard.SetTarget(animation, rect);

    var storyboard = new Storyboard();
    storyboard.Children.Add(animation);
    storyboard.Begin();
}

private void ResetButtonClick(object sender, RoutedEventArgs e)
{
    rect.Opacity = 1d;
}
4

1 回答 1

0

您可以在 reset 上做一个反向动画:

private void ResetButtonClick(object sender, RoutedEventArgs e)
    {
        var animation = new DoubleAnimation
        {
            To = 1d,
            Duration = TimeSpan.FromSeconds(0),
            FillBehavior = FillBehavior.HoldEnd
        };

        Storyboard.SetTargetProperty(animation, new PropertyPath(UIElement.OpacityProperty));
        Storyboard.SetTarget(animation, rect);

        var storyboard = new Storyboard();
        storyboard.Children.Add(animation);
        storyboard.Begin();

希望这会有所帮助。

于 2013-01-28T14:35:55.990 回答