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