2012-10-05 207 views
5

轉變我已經定義了以下可視狀態:VisualStateManager不能產生ThicknessAnimations

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup Name="EditStates"> 

     <VisualStateGroup.Transitions> 
      <VisualTransition GeneratedDuration="0:0:2"/> 
     </VisualStateGroup.Transitions> 

     <VisualState Name="Editing" />       
     <VisualState Name="Normal"> 
      <Storyboard> 
       <ThicknessAnimation Storyboard.TargetName="ViewBorder" Storyboard.TargetProperty="Margin" To="0" Duration="0"/> 
       <DoubleAnimation Storyboard.TargetName="Header"  Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform.ScaleY)" To="0" Duration="0"/> 
       <ColorAnimation  Storyboard.TargetName="EditBorder" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0"/> 
      </Storyboard> 
     </VisualState>           

    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

DoubleAnimationColorAnimation做工精細,用VisualStateManager生成過渡動畫超過2秒他們。

但是,ThicknessAnimation不動畫。而是在轉換期結束時捕捉到結束值。

有沒有辦法讓VisualStateManager爲它生成轉換,還是我將被迫提供手動轉換?

+0

我注意到了。當您直觀地使用Blend將邊緣拖出時,它會使用RenderTransform在內部運行。用手修改邊距具有相同的效果。我想這是一個錯誤或沒有實現的功能.. – Wouter

回答

2

我分析問題,併發射了.NET Reflector,發現VisualStateManager僅支持以下動畫:

  • ColorAnimation
  • DoubleAnimation是
  • PointAnimation

這是一種蹩腳的,因爲它沒有記錄在任何地方。

要證明它不能生成動畫,請查看VisualStageManager.GenerateToAnimation方法的反轉代碼。還有一個支持相同動畫子集的VisualStageManager.GenerateFromAnimation

private static Timeline GenerateToAnimation(FrameworkElement root, Timeline timeline, IEasingFunction easingFunction, bool isEntering) 
{ 
    Timeline destination = null; 

    if (destination == null) 
    { 
    var targetColor = GetTargetColor(timeline, isEntering); 
    if (targetColor.HasValue) 
     destination = new ColorAnimation { To = targetColor, EasingFunction = easingFunction }; 
    } 

    if (destination == null) 
    { 
    var targetDouble = GetTargetDouble(timeline, isEntering); 
    if (targetDouble.HasValue) 
     destination = new DoubleAnimation { To = targetDouble, EasingFunction = easingFunction }; 

    } 

    if (destination == null) 
    { 
    var targetPoint = GetTargetPoint(timeline, isEntering); 
    if (targetPoint.HasValue) 
     destination = new PointAnimation { To = targetPoint, EasingFunction = easingFunction }; 
    } 

    if (destination != null) 
    CopyStoryboardTargetProperties(root, timeline, destination); 

    return destination; 
} 

Bottomline ...您只能在VisualStageManager中使用Color,Double或Point動畫。如果你需要別的東西,還原爲老式的觸發器...

+0

煩人但有用!乾杯。 – GazTheDestroyer

0

也許你的ThicknessAnimation語句沒有完成,我從主題爲「ThicknessAnimation Class」的MSDN中搜索流動的代碼示例。

<ThicknessAnimation 
        Storyboard.TargetProperty="BorderThickness" 
        Duration="0:0:1.5" FillBehavior="HoldEnd" From="1,1,1,1" To="28,14,28,14" /> 

希望能幫助你...

+0

謝謝,但不幸的是,這是一個動畫。 VisualState需要靜態故事板,因爲它們設置已知狀態。我可以將上述定義爲過渡,但這正是我試圖避免的。 – GazTheDestroyer

+0

好吧,我現在很清楚 –