Placez le storyboard dans les ressources de l'application
J'ai besoin d'utiliser la même table de montage séquentiel dans plusieurs endroits, donc j'ai placé la table de montage séquentiel à l'intérieur de mon Application.Les ressources . Lorsque j'essaie d'exécuter le storyboard, le seul problème est que j'ai besoin de faire référence à l'objectif que je veux animer. Voici mon storyboard:
<System:String x:Key="target">border2</System:String>
<Storyboard x:Key="stHeight">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(FrameworkElement.Height)"
Storyboard.TargetName="{DynamicResource target}">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="90">
<EasingDoubleKeyFrame.EasingFunction>
<CircleEase EasingMode="EaseOut"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
la façon dont je l'animation d'un objet différent de la hauteur est de changer la dynamique de la ressource cible. J'ai été en mesure de le faire lorsque le storyboard a été dans la fenêtre actuelle. Mais maintenant que je veux le placer dans les ressources de l'application, je ne sais pas comment faire référence à la propriété target.
MODIFIER
La solution que j'ai posté plus tôt œuvres agréable, mais parfois, il est difficile de créer des animations complexes avec code. donc, une autre solution de rechange que j'ai travaillé était de créer le storyboard avec expression blend. j'ai donc faites glisser un contrôle aléatoire de la fenêtre principale dans expression blend et de créer une animation aléatoire. disons que l'animation en tant que:
<Storyboard x:Key="Storyboard1">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="grid">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="90"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="grid">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="103"/>
</DoubleAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransformOrigin)" Storyboard.TargetName="grid">
<EasingPointKeyFrame KeyTime="0:0:1" Value="0.75,0.5"/>
</PointAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="grid">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="75"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
puis-je copier ce code et de le coller sur ma fenêtre de travail PAS DANS L'APPLICATION.XAML.
et ensuite dans mon code, disons que j'ai un:
<Border Name="brdBorder" BorderBrush="Silver" BorderThickness="1" Margin="328,104,0,0" Background="#FFE52E2E" HorizontalAlignment="Left" Width="94" Height="100" VerticalAlignment="Top" >
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Border.RenderTransform>
</Border>
pour une raison quelconque, la transformation du groupe est d'être là pour animer l'objet. de toute façon, donc disons que j'ai ce pensionnaire dans mon travail de la fenêtre et je veux l'animer avec la même animation que j'ai créé avec expression blend. ce que je vais faire dans le code est:
Storyboard sb1 = FindResource("Storyboard1") as Storyboard;
foreach (var child in sb1.Children)
{
Storyboard.SetTargetName(child, brdBorder.Name);
}
sb1.Begin(this);
et puis je suis en mesure d'animer cette frontière sur mon lieu de travail de la fenêtre. La belle partie de ceci est que je suis en mesure d'appliquer la même animation à plusieurs objets (c'est le but de la création d'une ressource, je pense que le problème vient quand j'essaie de mettre la table de montage séquentiel dans un dictionnaire de ressources ou dans l'application.fichier xaml. quand je fais ça, c# est capable de trouver le storyboard, mais les propriétés de la table de montage séquentiel sont en lecture seule donc j'obtiens l'erreur:
Cannot set a property on object 'System.Windows.Media.Animation.DoubleAnimationUsingKeyFrames' because it is in a read-only state.
La raison pour laquelle je voulais faire c'est d'appliquer la même animation à plusieurs objets. Un travail autour de la solution a été de construire la base de l'animation avec le code et ensuite le plus d'animation complexes, telles que l'assouplissement de la fonction etc de l'enregistrer comme une ressource. Laissez-moi vous montrer ce que je veux dire.
Dans mon fichier de ressources, j'ai placé la ressource suivante:
<EasingDoubleKeyFrame x:Key="pleaseWork">
<EasingDoubleKeyFrame.EasingFunction >
<BackEase EasingMode="EaseOut" Amplitude="1"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
Dans expression blend, vous pouvez construire un complexe de la facilité de la fonction. Ensuite, avec le code derrière, je vais créer une base de storyboard:
DoubleAnimation animation = new DoubleAnimation();
animation.To = 336; //final value
//animation.From = 0;
//animation.BeginTime = TimeSpan.FromSeconds(0);
animation.Duration = new Duration(TimeSpan.FromSeconds(5)); //how much time should animation last
//here comes the magic:
//note that I can bind to EasingDoubleKeyFrame in my resource file in xaml
animation.EasingFunction = ((EasingDoubleKeyFrame)FindResource("pleaseWork")).EasingFunction; //apply the easing function
Storyboard.SetTarget(animation, groupBox1); //what object will be animated?
Storyboard.SetTargetProperty(animation, new PropertyPath(FrameworkElement.HeightProperty)); //what property will be animated
Storyboard sb = new Storyboard();
sb.Children.Add(animation);
sb.Begin();
Cela m'a permis d'utiliser le même storyboard sur plusieurs objets.
source d'informationauteur Tono Nam
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin de faire référence à la cible n'importe où, vous pouvez simplement créer un localement, c'est l'une des grandes caractéristiques de la dynamique de recherche de ressources, par exemple
J'AI ENFIN TROUVÉ LA SOLUTION!!!!!
Si vous vous souvenez de l'erreur que j'ai eu lors de la passation de la table de montage séquentiel dans l'application.fichier xaml était:
Ne peut pas définir une propriété sur l'objet " du Système.De Windows.Médias.De l'Animation.DoubleAnimationUsingKeyFrames", car il est dans un état de lecture seule.
en d'autres termes, je ne pouvais pas modifier la propriété target de la table de montage séquentiel je pouvais juste rouge. donc la solution a été de changer le
Storyboard.TargetName="grid"
pourStoryboard.TargetName="{binding}"
Permettez-moi de mettre tout cela ensemble:
--
--
//remplacer la table de montage séquentiel.TargetName="grille" pour le Storyboard.TargetName="{Binding}".
//Votre storyboard ressource doit pas ressembler à:
--
--
REMARQUE IMPORTANTE:
par conscient que lorsque vous créez votre scénario avec expression blend, parfois, expression blend permettra de créer un rendu de groupe transformer le contrôle de l'animer. dans cet exemple, où l'animation d'un pensionnaire. et pour que pensionnaire à être animé, il avait besoin d'
En d'autres termes, si votre animation traite scaletransform skewtransform etc.. puis placez le rendu de groupe transformer à tous les objets que vous prévoyez sur l'animation.
finalement je suis capable d'animer:
Pour un
Windows Phone 8.1 Application
J'ai connu le même problème et j'ai ajouter au mélange de nombreuses solutions pour ce faire.
C'est mon App.xaml fichier
Dans ma page, j'ai quelque chose comme ceci (page.xaml)
Maintenant, vous liez cette méthode à un événement (appuyez sur le bouton ou autre chose)
page.xaml.cs
J'espère que cela va vous aider!