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?
+1 pour le titre: D – Shawn
Haha merci. C'est un gâchis que je connais, mais c'est un vrai résumé de ceci. – Jippers