2012-10-05 11 views
5

Mam następujący Zjednoczone wizualne zdefiniowane:VisualStateManager nie może generować przejścia dla 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> 

grzywny DoubleAnimation i ColorAnimation pracy, animacje przejścia VisualStateManager generujących ponad 2 sekundy dla nich.

Jednak ThicknessAnimation nie animuje. Zamiast tego przechwytuje do wartości końcowej pod koniec okresu przejściowego.

Czy jest jakiś sposób, aby uzyskać VisualStateManager, aby wygenerować przejścia dla niego, lub czy będę zmuszony do ręcznego przejścia?

+0

Zauważyłem to samo. Podczas wizualnego używania Blend do przeciągania krawędzi działa wewnętrznie za pomocą RenderTransform. Modyfikowanie marginesu ręcznego ma taki sam efekt. Domyślam się, że to błąd lub nie zaimplementowano funkcji .. – Wouter

Odpowiedz

2

analizowałem problem i wystrzelił w górę .NET Reflector i stwierdził, że VisualStateManager obsługuje tylko następujące animacje:

  • ColorAnimation
  • DoubleAnimation
  • PointAnimation

To trochę bzdura, ponieważ nie jest nigdzie udokumentowane.

Aby udowodnić, że nie można wygenerować animacji, spójrz na odwrócony kod metody VisualStageManager.GenerateToAnimation. Istnieje również VisualStageManager.GenerateFromAnimation, który obsługuje ten sam podzestaw animacji.

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; 
} 

Dolna linia ... W programie VisualStageManager można używać tylko animacji kolorów, podwójnych lub punktów. Przywróć staromodne wyzwalacze, jeśli potrzebujesz czegoś innego ...

+0

Irytujące, ale użyteczne! Twoje zdrowie. – GazTheDestroyer

0

Może twoje stwierdzenie ThicknessAnimation nie jest kompletne, przeszukuję próbkę kodu płynącego z MSDN w temacie "Klasa grubości klasy".

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

Nadzieja to może pomóc ...

+0

Dzięki, ale niestety jest to animacja. VisualStates wymagają statycznych storyboardów, ponieważ ustawiają znane stany. Mogę zdefiniować powyższe jako przejście, ale tego właśnie próbuję uniknąć. – GazTheDestroyer

+0

OK, dla mnie jest to teraz jasne –

Powiązane problemy