2010-08-17 130 views
1

給出一個由VisualStateManager作爲ControlTemplate的一部分啓動的Storyboard,如何根據控件的屬性更改來調整該動畫的SpeedRatio?如何控制VisualState中Storyboard的SpeedRatio?

<ControlTemplate> 
    <Grid> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup> 
     <VisualState> 
      <Storyboard Name="SpinningThing" 
         SpeedRatio="{Binding SpinningSpeedRatio}"> 
      ... 

這需要WPF和Silverlight的工作。

我不認爲我可以設置一個綁定有很多原因。最重要的是,Storyboard是Freezable,所以你不能僅僅在WPF中設置SpeedRatio。但是,如果它是由VisualStateManager啓動的,我可以在其上調用SetSpeedRatio嗎?

另外,因爲它的父類是一個VisualState,那麼這是不是意味着將沒有管理FrameworkElement來關聯它呢?

所以,如果我不能用綁定來做到這一點,怎麼辦呢?

回答

0

好的,所以看起來真的沒有辦法嚴格處理這個綁定。所以爲了說明這一點,我在代碼隱藏中將事件掛鉤,以適當地開始/調整動畫。

0

通常情況下,您會使用{TemplateBinding ...}而不是{Binding ...},但只適用於簡單的兼容類型。

您還應該能夠使用"relative binding source"綁定到模板化控件。如果類型不匹配,這也允許您使用值轉換器。

SpeedRation={Binding SomeProperty, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource SomeConverter}}" 

我還沒有在WPF中測試過,但Silverlight通常是功能受限的。

+1

不幸的是,WPF是簡單答案分崩離析的地方。在WPF中,時間軸是Freezable對象,因此綁定不會更改SpeedRatio的實際值。 http://msdn.microsoft.com/en-us/library/system.windows.media.animation.timeline.aspx 此外,因爲它在ViewState(我猜),你會得到綁定錯誤說: 「無法找到綁定的治理FrameworkElement ...」。 – MojoFilter 2010-08-19 13:16:10

相關問題