2009-01-09 5 views
3

PHEW.Comment démarrer un storyboard dans un modèle de données dans un contrôle de contenu dans un contrôle utilisateur à partir de codebehind?

Je suis sérieux. Je vais l'épeler comme suit ...

Le Storyboard a une clé "myStoryboard". Il est conservé dans un DataTemplate avec une clé "myDataTemplate".

Ce modèle de données est utilisé dans un ContentControl avec le nom « myContentControl » par ce tag:

<ContentControl Name="myContentControl" 
    ContentTemplate="{DynamicResource myDataTemplate}"/> 

Le contrôle de contenu est utilisé dans mon UserControl. Dans le code UserControl derrière, j'ai fait un geste au clavier qui devait démarrer "myStoryBoard" mais je n'ai pas de chance d'y arriver.

private void StartSB(object sender, ExecutedRoutedEventArgs e) 
{ 
    Storyboard sb = (Storyboard) this.TryFindResource("myStoryboard"); 
    sb.Begin(this); 
} 

sb est toujours nulle ici. Comment puis-je obtenir le Storyboard?

MISE À JOUR:

afin de jouer avec TryFindResource() J'ai réussi à se rendre à myDataTemplate

private void StartSB(object sender, ExecutedRoutedEventArgs e) 
{ 
    object sb = this.myContentControl.TryFindResource("myDataTemplate"); 
} 

dans la visionneuse Locals je peux voir sb est myDataTemplate. Je peux voir dans l'arbre sb.base.Resources.Keys qui est un tableau de ressources dans lequel "myStoryboard" est à l'intérieur. Oh si proche!

MAJ2:

Plus code complet ici. Je me rends compte maintenant que cela peut être trop spaghétisé pour expliquer avec des mots.

<UserControl > 
    <UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Resources\myUCResources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    </UserControl.Resources> 
    <ContentControl Name="myContentControl" 
      ContentTemplate="{DynamicResource myDataTemplate}" 
       Content="{Binding}" /> 
    ... 
</UserControl> 

maintenant codebehind pour ce contrôle utilisateur

namespace myclass 
{ 
    public partial class myUserControl: UserControl, System.ComponentModel.INotifyPropertyChanged 
    { 
    ... 
     public myUserControl() 
     { 
     InitializeComponent(); 

     <!--setup keybinding--> 
     } 

     public void KeyBindExecuted(object sender, ExecutedRoutedEventArgs e) 
     { 
     Object sb = this.myContentControl.TryFindResource("myDataTemplate"); 
     //sb returns the DataTemplate 
     } 

    } 
} 

Et enfin, le dictionnaire de ressources contenant la substance de l'interface utilisateur et l'animation que je veux finalement déclencher. (MyUCResources.xaml)

<ResourceDictionary> 
    <DataTemplate x:Key="myDataTemplate" > 
     <Grid> 
      <!-- elements like buttons --> 
     </Grid> 
     <DataTemplate.Resources> 
      <Storyboard x:Key="myStoryBoard"> 
       <DoubleAnimation> 
        <!-- animation stuff--> 
       </DoubleAnimation> 

      </Storyboard> 
     </DataTemplate.Resources> 
     <DataTemplate.Triggers> 
      <EventTrigger SourceName="aButton" RoutedEvent="Button.Click"> 
        <BeginStoryboard Storyboard="{StaticResource myStoryBoard}" /> 
       </EventTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ResourceDictionary> 

Mise à jour 3:

approche ok différente. Puis-je utiliser le EventTrigger dans le DataTemplate à partir du codebehind pour démarrer l'animation?

+0

+1 pour le titre: D – Shawn

+0

Haha merci. C'est un gâchis que je connais, mais c'est un vrai résumé de ceci. – Jippers

Répondre

1

AH HAH! J'ai donc trouvé un moyen détourné de résoudre ce problème. Ma troisième mise à jour où j'ai eu l'idée de lancer un événement semblait plus fructueuse. Tout peut être trouvé ici.

http://www.codeproject.com/script/Forums/View.aspx?fid=1004114&msg=2827455

En un mot j'ai utilisé FindResource pour obtenir le DataTemplate, puis FindName du bouton dans le DataTemplate utilisé pour déclencher normalement l'animation. Puis j'ai soulevé un bouton cliquez sur ce bouton.

Questions connexes