2009-05-12 9 views
3

J'ai une grille à l'intérieur d'un DataTemplate d'ItemsControl, donc il y aura beaucoup de copies de cette grille. Je veux un clic de souris sur la grille pour déclencher le storyboard d'un élément en dehors du DataTemplate. Par exemple, je voudrais animer les propriétés Transform d'un élément nommé qui existe ailleurs dans la fenêtre.WPF: Déclenchez des animations sur les éléments par nom depuis EventTrigger sur un contrôle créé dynamiquement.

Disons que mon DataTemplate ressemble à ceci:

<DataTemplate x:Key="myDataTemplate"> 
     <Grid> 
      <Grid.Triggers> 
       <EventTrigger RoutedEvent="UIElement.MouseLeftButtonUp"> 
        <BeginStoryboard> 
         <Storyboard Storyboard.TargetName="myRectangle"> 
          <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.X)" 
               To="10" Duration="0:0:0.2" /> 
          <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" 
               To="10" Duration="0:0:0.2" /> 
          <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" 
               To="1" Duration="0:0:0.5" /> 
          <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" 
               BeginTime="0:0:0.5" To="1" Duration="0:0:0.5" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </Grid.Triggers> 
     </Grid> 
    </DataTemplate> 

et quelque part dans ma fenêtre, j'ai un rectangle qui ressemble à ceci:

<Rectangle x:Name="myRectangle" Height="400" Width="400"> 
     <Rectangle.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform ScaleX="0" ScaleY="0" /> 
       <TranslateTransform /> 
      </TransformGroup> 
     </Rectangle.RenderTransform> 
    </Rectangle> 

Lorsque l'événement se déclenche MouseLeftButtonUp, je reçois la exception suivante:

Le nom 'myRectangle' est introuvable dans la zone de nom de 'System.Windows.Controls.Grid'.

Y at-il un moyen de dire au storyboard où chercher un élément par ce nom? Je suis particulièrement intéressé par une solution xaml uniquement si elle existe.

+1

Je n'ai pas trouvé de solution XAML à cela, je dois utiliser le code-behind. Je serais également intéressé de connaître la raison pour laquelle la cible devrait être dans la portée de la grille. –

Répondre

1

Il est possible de trouver des éléments xaml dans un autre nom (à l'extérieur du modèle de données) en utilisant le mode FindAncestor d'une liaison RelativeSource, tant que l'élément xaml auquel vous essayez de vous lier est un élément parent. Le code de liaison ressemblerait à ceci:

{Binding Path="myRectangle", RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Rectangle}}} 

liaisons de nom dans storyboards peuvent être tout à fait un autre animal, mais peut-être que vous pouvez utiliser.

Questions connexes