11
votes

Placez le storyboard dans les ressources d'application

Je dois utiliser le même storyboard à plusieurs endroits donc j'ai placé le scénario à l'intérieur de ma candidature.Resources. Lorsque j'essaie d'exécuter le scénario, le seul problème est que je dois faire référence à la cible que je veux animer. Voici mon 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();


1 commentaires

Je pense que c'est parce que Border2 n'existe pas dans une portée globale qu'il n'existe que dans MainWindow. Mais j'ai essayé de remplacer border2 pour MAINWINDOW.BORDER2 et cela ne fonctionne toujours pas


3 Réponses :


25
votes

Vous n'avez pas besoin de faire référence à la cible nulle part, vous pouvez simplement en créer un local, il s'agit de l'une des fonctionnalités importantes de la recherche dynamique des ressources, par exemple

<!-- Somewhere else... -->
<Button Name="mybutton" Content="Test" Height="20">
    <Button.Resources>
        <sys:String x:Key="AnimationTarget">mybutton</sys:String>
    </Button.Resources>
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
            <BeginStoryboard Storyboard="{StaticResource SB_Height}"/>
        </EventTrigger>
    </Button.Triggers>
</Button>


5 commentaires

Si avec ce bouton, je veux animer quelque chose d'autre, je changerai l'animation de la ressource à cordes à quelque chose d'autre? Pourquoi est-ce que quand je change ça à autre chose, cela ne fonctionne pas? Cela fonctionne lorsque j'élever ce bouton.


Je viens de créer la ressource: Brdborader Et cela a fonctionné.


Merci beaucoup pour l'aide. Lorsque je veux exécuter le même scénario sur différents objets simultanément, cela ne fonctionne pas. J'ai besoin d'exécuter les storyboards du code.


DynamicResource n'existe pas dans UWP. Est-ce qu'il existe une solution similaire comme celle-ci?


@Briefkasten: Je ne sais pas. Si vous souhaitez animer l'élément qui fait référence au storyboard, vous devriez pouvoir simplement déposer le storyboard .TargetName entièrement. Je n'ai pas d'outils UWP installé et je ne peux penser à rien qui fonctionnerait ...



7
votes

Enfin j'ai trouvé la solution !!!!!

Si vous rappelez l'erreur que j'ai eu lors de la mise en place du storyboard dans le fichier app.xaml était la suivante: p>

Impossible de définir une propriété sur l'objet 'System.windows.media.animation.doublbleLimationDUningKeyFames' parce qu'il est Dans un état en lecture seule. P>

En d'autres termes, je ne pouvais pas modifier la propriété cible du storyboard que je pouvais simplement le rouge. La solution consistait donc à modifier le scénographier.targetname = "grille" code> pour storyboard.targetname = "{binding}" code> p>

laisse moi Mettez tout ensemble: p> xxx pré>

- p> xxx pré>

- p> xxx pré>

// remplace le storyboard.targetname = "grille" pour storyboard.targetname = "{Binding}". // votre ressource de scénario ne devrait pas ressembler à: p> xxx pré>

- p> xxx pré>

- p>

<Border Name="brdBorder"  BorderBrush="Silver" BorderThickness="1" Margin="338,6,0,0" Background="#FFE52E2E" HorizontalAlignment="Left" Width="94" Height="38" VerticalAlignment="Top">
    <Border.RenderTransform>
        <TransformGroup>
            <ScaleTransform/>
            <SkewTransform/>
            <RotateTransform/>
            <TranslateTransform/>
        </TransformGroup>
    </Border.RenderTransform>
</Border>

   //   AND

<Button Name="mybutton" Content="Test" Height="20" Click="mybutton_Click">
    <Button.RenderTransform>
        <TransformGroup>
            <ScaleTransform/>
            <SkewTransform/>
            <RotateTransform/>
            <TranslateTransform/>
        </TransformGroup>
    </Button.RenderTransform>
</Button>



AS:

runStoryboard("Storyboard1", brdBorder.Name);
runStoryboard("Storyboard1", mybutton.Name);


6 commentaires

Vous auriez juste pu écouter mes conseils et définir x: partagé sur false et vous ne seriez pas dans aucun de ce désordre.


Mais j'avais besoin d'appeler le scénario à partir du code et lorsque j'utilise votre code, cela fonctionnait, mais pas sur plusieurs objets animés à la fois.


Vous devez définir x: partagé à faux , Ça fonctionne, je l'ai essayé , si vous avez toujours des problèmes, il vous suffit de l'obtenir deux fois en utilisant Findresource , de cette façon que vous obtenez Deux scénario ...


Lorsque X: partagé est false Vous pouvez définir les propriétés du code qui auparavant ont été réadis, jetant une exception ...


Ouais tu as raison désolé. Je vais vous donner les points :). Merci pour l'aide. Une solution ma solution peut être longue parce que j'ai tout expliqué. La seule chose que vous devez avoir est la méthode que j'ai montrée dans ma solution et coller toute scénario remplaçant la propriété cible avec une ressource contraignante. Je pense que j'ai expliqué beaucoup. Merci encore


Je ne pouvais pas utiliser "ce" mot-clé dans Storyboard.begin () et Findresource n'est pas disponible. De l'aide?



1
votes

pour un

Téléphone Windows 8.1 Application H2>

J'ai fait face au même problème et j'ajoute de mélanger de nombreuses solutions pour y accomplir. P>

Ceci est mon application . xaml strong> fichier p> xxx pré>

dans ma page, j'ai quelque chose comme ça ( page.xaml strong>) p> xxx Pre>

Maintenant, vous liez cette méthode à un événement (touche TAP ou quelque chose d'autre) p>

page.xaml.cs strong> p>

private void MenuPanel_OnTap(object sender, GestureEventArgs e)
        {
            Storyboard sb = App.Current.Resources["ShowMenuAnimationKey"] as Storyboard;
            sb.Stop();
            Storyboard.SetTarget(sb, ViewPanel);
            sb.Begin();
        }


0 commentaires