2010-03-16 122 views
5

我使用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

回答

1

我解決了一個類似的問題,動畫的輔助(附加)屬性從0到1,然後將所需的目標屬性綁定到一個值轉換器的輔助屬性。 它有道理嗎?

+1

這確實有道理。對於一些非常類似的問題,這是一個常見的解決方法,因爲這類問題在谷歌或計算器上並不是非常頻繁:) 但是作爲一個大MVVM的粉絲,我很失望,看到我更容易解決問題沒有模式。太多的開銷太多了。 我希望這種行爲在將來的框架修訂中會變得更容易,就像他們對InputGesture做了Freezable並且不接受命令綁定一樣。 Freezables很酷,但並非總是如此。 – 2010-03-19 20:43:23