2010-05-28 2 views
6

J'essaie, en tant qu'exposition, d'utiliser une DoubleAnimation sur les propriétés ScaleX et ScaleY d'une ScaleTransform. J'ai un rectangle (144x144) que je veux faire rectangulaire sur cinq secondes.DoubleAnimation dans ScaleTransform

Mon XAML:

<Window x:Class="ScaleTransformTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Grid> 
     <Rectangle Name="rect1" Width="144" Height="144" Fill="Aqua"> 
      <Rectangle.RenderTransform> 
       <ScaleTransform ScaleX="1" ScaleY="1" /> 
      </Rectangle.RenderTransform> 
     </Rectangle> 
    </Grid> 
</Window> 

Mon C#:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    ScaleTransform scaly = new ScaleTransform(1, 1); 
    rect1.RenderTransform = scaly; 

    Duration mytime = new Duration(TimeSpan.FromSeconds(5)); 
    Storyboard sb = new Storyboard(); 

    DoubleAnimation danim1 = new DoubleAnimation(1, 1.5, mytime); 
    DoubleAnimation danim2 = new DoubleAnimation(1, 0.5, mytime); 
    sb.Children.Add(danim1); 
    sb.Children.Add(danim2); 

    Storyboard.SetTarget(danim1, scaly); 
    Storyboard.SetTargetProperty(danim1, new PropertyPath(ScaleTransform.ScaleXProperty)); 
    Storyboard.SetTarget(danim2, scaly); 
    Storyboard.SetTargetProperty(danim2, new PropertyPath(ScaleTransform.ScaleYProperty)); 

    sb.Begin(); 
} 

Malheureusement, quand je lance ce programme, il ne fait rien. Le rectangle reste à 144x144. Si je supprime l'animation, et juste

ScaleTransform scaly = new ScaleTransform(1.5, 0.5); 
rect1.RenderTransform = scaly; 

il s'allongera instantanément, pas de problème. Il y a un problème ailleurs. Aucune suggestion? J'ai lu la discussion au http://www.eggheadcafe.com/software/aspnet/29220878/how-to-animate-tofrom-an.aspx dans lequel quelqu'un semble avoir une version pure-XAML fonctionnant, mais le code n'est pas montré là.

EDIT: Au Applying animated ScaleTransform in code problem il semble que quelqu'un a eu un problème très similaire, je suis d'accord avec l'utilisation de sa méthode qui a fonctionné, mais qu'est-ce que c'est que le string thePath = "(0).(1)[0].(2)";? Que représentent ces chiffres?

Répondre

7

est ici l'affaire, voici une citation d'entrée de MSDN Storyboards Overview, dans la section intitulée «Où pouvez-vous utiliser un storyboard?:

A Storyboard can be used to animate dependency properties of animatable classes (for more information about what makes a class animatable, see the Animation Overview). However, because storyboarding is a framework-level feature, the object must belong to the NameScope of a FrameworkElement or a FrameworkContentElement.

Cela m'a fait penser que l'objet ScaleTransform ne fait pas partie le NameScope de FrameworkElement. Même si le Rectangle est un FrameworkElement, puisque le ScaleTransform ne fait pas partie de ses enfants logiques, mais plutôt une valeur affectée à une autre propriété (dans ce cas la propriété RenderTransform).

Pour contourner cela, vous devez spécifier votre objet cible et PropertyPath différemment, donc:

Storyboard.SetTarget(danim1, rect1); 
Storyboard.SetTargetProperty(danim1, 
    new PropertyPath("RenderTransform.(ScaleTransform.ScaleX)")); 

Essayé et il fonctionne, même si je ne comprends pas bien la citation de moi-même MSDN :-)

+0

En fait, j'obtiens cette erreur: Impossible de résoudre toutes les références de propriété dans le chemin de propriété 'RenderTransform. (ScaleTransform.ScaleX)'. Vérifiez que les objets applicables prennent en charge les propriétés. Êtes-vous sûr de copier/coller correctement votre code de travail? –

+0

Je ne sais pas, j'ai trouvé une erreur de copier/coller que j'ai corrigée il y a 17 minutes. –

+0

Ça ne fonctionne toujours pas pour vous? Je vous assure, il le fait pour moi sur .NET 4 avec VS2010. –

Questions connexes