0

我对很多 WPF 还不是很熟悉,所以如果这个查询暴露了一些明显的误解,我会很感激他们被指出。

我想要做的(无论好坏)是将 aDoubleAnimation.FromProperty与包含/运行动画的 StackPanel 的实际宽度同步。

我最初尝试使用数据绑定来执行此操作,例如

BindingOperations.SetBinding(anim, 
   DoubleAnimation.FromProperty, 
   new Binding {Source = panel, Path = new PropertyPath(ActualWidthProperty)});

但这似乎不起作用。虽然我可以将一个文本框绑定到 From 属性并看到它正在发生变化,但动画仍然从初始值开始运行。这与故事板冻结有关吗?(我对此一无所知,但只是听说过)

然后我想为什么不停止并重新启动故事板(将其关闭然后再打开!),同时通过处理StackPanel.SizeChanged事件来更改 FromProperty。像这样的东西:

void panel_SizeChanged(object sender, SizeChangedEventArgs e)
{
    if (myStoryBoard != null && myStoryBoard.GetCurrentState(panel) == ClockState.Active)
    {
        myStoryBoard.Stop(panel);
        foreach(var child in myStoryBoard.Children)
        {
            var anim = child as DoubleAnimation;
            if (anim == null) continue;
            anim.From = panel.ActualWidth;
        }
        myStoryBoard.Begin(panel, true);
    }
}

这可行,但是,当然,每次调整面板大小时,它都会从头开始动画。我更喜欢的是能够从中断点恢复动画,但使用新的 FromProperty。这甚至可能吗?

4

1 回答 1

1

这比你想象的要容易得多。WPF 和 Silverlight 中的动画很酷的一点是它们可以与当前情况相关。创建相对动画唯一需要做的就是创建例如 DoubleAnimation,其中填充了 To 但不填充 From。

下面的示例是将堆栈面板的不透明度从当前值设置为 1:

<DoubleAnimation Duration="0:0: To="1" 
     Storyboard.TargetName="LayoutRoot" 
     Storyboard.TargetProperty="StackPanel.Opacity" />

EDIT1:
使动画循环回到其原始值,而无需永远使用 from 和循环

<Storyboard AutoReverse="True" RepeatBehavior="Forever">
    <DoubleAnimation Duration="0:0:2" 
                        To="1"
                        Storyboard.TargetName="LayoutRoot"
                        Storyboard.TargetProperty="StackPanel.Opacity"
                        />
</Storyboard>
于 2010-08-19T11:18:26.317 回答