Pourquoi cette animation silverlight fait-elle disparaître toute la mise en page?

StackOverflow https://stackoverflow.com/questions/619369

  •  03-07-2019
  •  | 
  •  

Question

Je commence à regarder Silverlight et je voulais commencer petit. Tous les exemples que j'avais examinés utilisaient des animations d'images clés, je voulais donc essayer un type d'animation différent. Je ne connaissais pas non plus très bien les animations à partir de code, j'ai donc décidé de l'essayer également. Mon but ultime est de créer une sorte de panneau animé, mais pour le moment je commence petit avec un seul bouton:

<UserControl x:Class="TestSilverlight.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" Background="Azure">
    <Grid x:Name="LayoutRoot" Background="Azure">
        <Button x:Name="btnClick" Content="Animate me!" Height="48" Width="96" Click="btn_Click">
        </Button>
    </Grid>
</UserControl>

J'ai écrit ce gestionnaire d'événements, ce que je thoguth était assez simple:

private void btn_Click(object sender, EventArgs e)
{
    Storyboard story = new Storyboard();
    story.RepeatBehavior = new RepeatBehavior(3.0);
    story.Duration = new Duration(TimeSpan.FromSeconds(1.0));

    if (btnClick.RenderTransform == null)
        btnClick.RenderTransform = new TranslateTransform();

    DoubleAnimation xAnim = new DoubleAnimation();
    xAnim.To = 50;
    Storyboard.SetTargetProperty(xAnim, new PropertyPath(TranslateTransform.XProperty));
    Storyboard.SetTarget(xAnim, btnClick.RenderTransform);

    story.Children.Add(xAnim);

    story.Begin();
}

Ce que j'attend quand je clique sur le bouton est de le voir glisser vers la droite 50 unités 3 fois. Ce qui se passe réellement, c’est que toute la mise en page disparaît, tout comme la couleur de fond et le bouton disparaissent.

Si je réécris le code du bouton pour qu'il commence par RenderTransform, tout fonctionne!

<Button x:Name="btnClick" Content="Animate me!" Height="48" Width="96" Click="btn_Click">
    <Button.RenderTransform>
        <TranslateTransform />
    </Button.RenderTransform>
</Button>

Que se passe-t-il dans le premier cas qui cause l'échec? Est-ce que je fais quelque chose de fondamentalement faux?

Était-ce utile?

La solution

Vous pouvez résoudre le problème en supprimant la vérification de "btnClick.RenderTransform == null" et en créant toujours un nouveau TranslateTransform, ou en recherchant "btnClick.RenderTransform est TranslateTransform". au lieu de null.

La raison pour laquelle vous voyez cette erreur est que par défaut, le bouton a une transformation d'identité pour son RenderTransform, qui se trouve être un MatrixTransform. Donc, vous essayez d’animer un MatrixTransform comme s’il s’agissait d’un TranslateTransform.

Autres conseils

La dernière fois que j'ai travaillé avec Silverlight, c'était plus tôt en 2008. Dans les versions bêta de Silverlight, la présentation entière disparaissait parfois (restait blanche et vide) lorsque une erreur se produisait au lieu d'un message d'erreur.

Je ne sais pas si c'est toujours le cas dans les versions actuelles. Pouvez-vous (ou l'avez-vous déjà fait) parcourir le code pour vérifier si une exception est levée ... ou le récupérer par programme et afficher une sorte de message d'erreur?

J'espère que je pourrais vous aider un peu.

Matthias

J'ai examiné à peu près la même chose, et diverses sources que j'ai lues suggèrent qu'il est impossible d'ajouter des storyboards par programmation. Essayez de l’ajouter dans le code XAML, puis modifiez-le dans le code - assurez-vous simplement de le nommer pour pouvoir y accéder. Vous devrez peut-être également ajouter la transformation dans le fichier xaml. La chose à retenir est que silverlight n’est pas wpf, c’est proche, mais beaucoup de choses sont différentes - juste assez pour être pénible.

<UserControl x:Class="TestSilverlight.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" Background="Azure">
    <UserControl.Resources>
        <StoryBoard Name="story" />
    </UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="Azure">
    <Button x:Name="btnClick" Content="Animate me!" Height="48" Width="96" Click="btn_Click">
    </Button>
</Grid>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top