2010-08-05 21 views
1

J'ai la construction ci-dessous et il fonctionne:Pourquoi la valeur Storyboard ne serait pas obtenue à partir d'une ressource ou d'une liaison?

<Storyboard x:Key="GrowOnStart"> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Left)" Storyboard.TargetName="window"> 
      <EasingDoubleKeyFrame KeyTime="0" Value="1024"/> 

Pourquoi cela ne fonctionne pas si je tente quelque chose comme ceci:

<EasingDoubleKeyFrame KeyTime="0" Value="{DynamicResource StartingPositionLeft}"/> 

Et oui, je définissais la ressource avant que le story-board. Et la déclaration comme la suivante ne fonctionnerait pas non plus:

<EasingDoubleKeyFrame KeyTime="0" Value="{Binding StartingPositionLeft}"/> 

Et oui, il est une propriété publique sur le code derrière et this.DataContext ensemble à ce .

Répondre

2

Ceci est dû au fait que les animations sont des objets pouvant être congelés. Il y a plus d'informations dans le MSDN Documentation, mais fondamentalement cela signifie que vous ne pouvez pas utiliser la liaison car les propriétés de l'objet figé (c'est-à-dire l'animation) ne peuvent pas changer. Pour contourner cette limitation, vous devrez effectuer tout ou partie du travail dans le code-behind.

+1

Oui, semble le seul moyen de modifier le storyboard dans le code derrière. var sb = (Storyboard) Ressources ["GrowOnStart"]; var anim = (DoubleAnimationUsingKeyFrames) sb.Children [0]; anim.KeyFrames [0] .Valeur = 100; – Agzam

+0

Dans le code derrière, vous devriez être en mesure d'obtenir la valeur à laquelle vous voulez vous lier (au lieu de faire des valeurs codées en dur). Par exemple, en utilisant vos exemples, vous pouvez faire quelque chose comme anim.KeyFrames [0] .Value = this.StartingPositionLeft (ou toute autre propriété à laquelle vous voulez vous lier), ou vous pouvez utiliser FindResource pour trouver et obtenir la valeur de DynamicResource (ou StaticResource) que vous vouliez utiliser à l'origine. –