使用故事板的动态动画

使用故事板的动态动画

问题描述:

我使用MVVM模式在WPF中开发应用程序。 我正在显示一个面向图的节点和链接(请参阅下图)。使用故事板的动态动画

http://free0.hiboox.com/images/1110/diapo1c36a4b95802846b8553d2fe9b9e6639.png?26

用户可以拖动并从一个“小区”到另一个下降的节点。当用户放下一个节点时,它的位置会改变,以便将其对齐到网格中。我想要做的是在对齐例程中调整其位置时对节点进行动画处理。

节点,链接和分隔符都显示在一个ItemsControl中。它们的表示由一些DataTemplates控制,并由Styles控制。

什么我做的是以下几点:

private void Align() { 
    // Computations... 
    TX = ... //Target X is set 
    TY = ... //target Y is set 
    X = TX; 
    Y = TY; // X and Y setters fire PropertyChanged 
} 

<Style x:Key="NodeViewStyle"> 
    <Setter Property="Canvas.Left" Value="{Binding X, Mode=TwoWay}"/> 
    <Setter Property="Canvas.Top" Value="{Binding Y, Mode=TwoWay}"/> 

我想要做的是以下几点:

private void Align() { 
    // Computations... 
    TX = ... 
    TY = ... //TX and TY setters fire PropertyChanged 
} 

<Style x:Key="NodeViewStyle"> 
    <Setter Property="Canvas.Left" Value="{Binding X, Mode=TwoWay}"/> 
    <Setter Property="Canvas.Top" Value="{Binding Y, Mode=TwoWay}"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding State}" Value="UPDATEPOS"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation To="{Binding TX}" Duration="0:0:1" 
             Storyboard.TargetProperty="(Canvas.Left)"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 

但是,这在运行时不工作,因为我无法绑定到“要“我的DoubleAnimation属性(它是一个Freezable)。

做这种动态动画最简单的方法是什么?直接在视图模型中通过定时器动画“X”属性?

+2

您是否找到类似MVVM的解决方案?如果您可以发布您的解决方案的xaml代码(更具体地说是“To”绑定问题)的一小段代码,那将是非常好的。谢谢 – Peanut 2010-06-09 14:16:41

我解决了一个类似的问题,动画的辅助(附加)属性从0到1,然后将所需的目标属性绑定到一个值转换器的辅助属性。 它有道理吗?

+1

这确实有道理。对于一些非常类似的问题,这是一个常见的解决方法,因为这类问题在谷歌或计算器上并不是非常频繁:) 但是作为一个大MVVM的粉丝,我很失望,看到我更容易解决问题没有模式。太多的开销太多了。 我希望这种行为在将来的框架修订中会变得更容易,就像他们对InputGesture做了Freezable并且不接受命令绑定一样。 Freezables很酷,但并非总是如此。 – 2010-03-19 20:43:23