2013-05-24 2 views
0

J'ai des problèmes pour obtenir une valeur de storyboard à lier à mon viewmodel. J'ai essayé beaucoup de variétés de xaml de liaison, sans chance. L'objectif de haut niveau est de permettre au ViewModel de modifier le début et la fin de la trajectoire d'une animation - cela semble être une exigence commune, mais il n'a pas été possible d'en trouver des exemples. Beaucoup de gens disent "Dans MVVM, vous ne devriez jamais essayer d'accéder au storyboard à partir du ViewModel", ce qui semble être horeshit si vous avez besoin de changer le début et la fin de l'animation à la volée. Dans tous les cas, je l'ai montré mon premier exemple, naïf ici:Problème lié aux valeurs du storyboard pour viewmodel

<UserControl 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:FishTank" x:Class="FishTank.FishTankControlView" 
     mc:Ignorable="d" 
     d:DesignHeight="100" d:DesignWidth="100" > 
<UserControl.Resources> 
    <Storyboard x:Key="Storyboard1"> 
     <DoubleAnimationUsingKeyFrames x:Name="xTransform" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="image"> 
      <SplineDoubleKeyFrame KeyTime="0" Value="-155"/> 
      <SplineDoubleKeyFrame KeyTime="0:0:4.5" Value="521"/> 
     </DoubleAnimationUsingKeyFrames> 
     <DoubleAnimationUsingKeyFrames x:Name="yTransform" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="image"> 
      <SplineDoubleKeyFrame KeyTime="0" Value="{Binding YPos1}"/> 
      <SplineDoubleKeyFrame KeyTime="0:0:4.5" Value="{Binding YPos2}"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
</UserControl.Resources> 

<UserControl.DataContext> 
    <local:FishTankControlViewModel/> 
</UserControl.DataContext> 

<UserControl.Triggers> 
    <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
     <BeginStoryboard Storyboard="{DynamicResource Storyboard1}"/> 
    </EventTrigger> 
</UserControl.Triggers> 

<Grid Background="Transparent"> 
    <Image x:Name="image" Width="100" Height="100" Source="pack://siteoforigin:,,,/Resources/Fish orange_right.png" RenderTransformOrigin="0.5,0.5"> 
     <Image.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform/> 
       <SkewTransform/> 
       <RotateTransform/> 
       <TranslateTransform/> 
      </TransformGroup> 
     </Image.RenderTransform> 
    </Image> 
</Grid> 

Je veux avoir Ypos1 et Ypos2 liés aux points de début et de fin de la transformation Y. J'ai essayé différentes variantes en utilisant RelativeSource et FindAncestor, mais tout cela me dépasse. Je voudrais une solution qui me permet de rester avec le framework 3.5 si possible.

J'ai essayé de changer le "StaticResource Storyboard1" en "DynamicResource Storyboard1" sans aucune chance.

Remarque - Comme un contrôle de santé mentale, je confirme que je suis capable de lier des contrôles normaux comme des boutons et des zones de texte à ces deux propriétés, Ypos1 et Ypos2, donc je suis assez sûr que la plomberie de base fonctionne ...

Merci beaucoup, Randy

+0

erreurs de liaison dans la sortie ou la fenêtre immédiate –

Répondre

0

Vous ne pouvez pas lier ceux-ci parce qu'ils doivent être gelables, à peu près sûr que la structure vous le dit aussi bien.

Si quelque chose que vous pouvez recréer complètement ou modifier l'animation avec de nouvelles valeurs, en utilisant un ValueConverter ou une sous-classe qui encapsule l'animation en cours de modification.

+0

Merci, mais je ne sais pas comment mettre en œuvre l'une ou l'autre de ces suggestions. J'ai déjà fait un convertisseur de valeur, mais il semble que je dois d'abord faire fonctionner la liaison, alors le convertisseur de valeur ne fait que la modifier avant de la relier, n'est-ce pas? En revenant un peu en arrière, peut-être que vous pouvez recommander une approche différente pour faire des animations dynamiques? Je n'arrive pas à comprendre comment obtenir l'objet storyboard dans le viewmodel, par exemple. –

+0

@RandyGamage: [Cette question] (http://stackoverflow.com/questions/10994716/animation-width-to-actual-width-in-wpf/10995041) pourrait illustrer l'approche de l'encapsulation. Pour l'approche 'ValueConverter', vous devez mettre un [' MutliBinding'] (http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx) sur la propriété 'BeginStoryboard.Storyboard' , les liaisons seraient aux valeurs de début et de fin, le convertisseur sera alors appelé à chaque fois un de ces changements. A l'intérieur du convertisseur, vous devrez construire et renvoyer l'ensemble du storyboard avec les valeurs actuelles. –

+0

Merci, cette question fournit une solution de contournement pour ce problème, c'est juste surprenant à quel point c'est compliqué et qu'il n'y a pas moyen de se lier directement à un storyboard. Je pense que mon meilleur itinéraire est d'oublier les storyboards, il suffit d'utiliser une minuterie pour mettre à jour l'emplacement de l'image et en finir avec elle. Dommage que l'animation WPF soit si difficile à changer dynamiquement. –

Questions connexes