2015-07-21 3 views
0

Tout d'abord, je ne suis pas vraiment sûr si elle est réellement déclenchée deux fois. L'événement Loaded si testé dans le code derrière est déclenché une seule fois (même essayé en utilisant AddHandler acceptant le troisième argument processedEventsToo). Cependant, il semble très probable que. J'ai une configuration de Storyboard en XAML et devrait être exécuté juste une fois quand Loaded est augmentée. Mais il semble commencer 2 fois, surtout la deuxième fois est juste après la fenêtre est affichée.EventTrigger écoutant Loaded est déclenché deux fois?

Je le sais parce que j'ai une propriété attachée utilisée sur un DoubleAnimation dans le Storyboard. Cette propriété attachée a 1 gestionnaire propertyChangedCallback. Ce gestionnaire est cependant déclenché deux fois avec la même valeur de e.NewValue (à partir de l'argument). Il ne devrait pas être déclenché deux fois comme ça. Je peux déterminer la cible (qui est animée) et définir un drapeau attaché pour marquer quelque chose qui a été fait dessus pour éviter le problème de deux fois le déclenchement, mais cela empêchera également d'autres déclencheurs réels (qui ne proviennent pas du Loaded). Le DoubleAnimation lui-même est cependant créé nouvellement pour chaque déclencheur (donc je ne peux pas non plus marquer n'importe quel drapeau car chaque fois que propertyChangedCallback est déclenché est une autre fois d'un autre DoubleAnimation, aucun moyen de marquer et empêcher l'exécution).

Voici le code, tout simple à tester:

public class TestOwner { 
    public static readonly DependencyProperty TestProperty = 
     DependencyProperty.RegisterAttached("Test", typeof(bool), typeof(TestOwner), new PropertyMetadata(testChanged)); 
    public static bool GetTest(DependencyObject o) 
    { 
     return (bool) o.GetValue(TestProperty); 
    } 
    public static void SetTest(DependencyObject o, bool value) 
    { 
     o.SetValue(TestProperty, value); 
    } 
    static private void testChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { //Mark some break point here and run it, you'll see it's stopped 
     //here twice, the second time is right after the window is shown. 
     //... 
    } 
} 

XAML:

<FrameworkElement> 
     <FrameworkElement.Triggers> 
      <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation From="20000" To="0" 
             Duration="00:00:20" 
             Storyboard.TargetName="someName" 
             local:TestOwner.Test="True"/> 

        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </FrameworkElement.Triggers> 
</FrameworkElement> 

Je voudrais éviter ce déclenchement à deux reprises ainsi que de comprendre pourquoi il en est ainsi. Nous vous remercions de vos suggestions et de votre aide.

Répondre

0

Eh bien, en fait le EventTrigger est déclenché une seule fois. Presque ce que j'ai dit dans ma question est une perception erronée. J'ai découvert que cela ressemble à Storyboard clones DoubleAnimation et cela clone même les propriétés jointes entraînant 2 fois d'entrer dans le gestionnaire de callback propertyChanged. La première fois est pour l'original DoubleAnimation. La deuxième fois est pour le DoubleAnimation cloné, il peut être effectivement cloné et exécuté lorsque le Loaded est élevé, de sorte qu'il se produit juste après que la fenêtre est affichée comme je l'ai déjà dit. Au moins maintenant je comprends le problème et aussi plus de débogage m'a montré que ce genre de 2 fois entrer dans le gestionnaire n'affectera aucun problème sérieux. Donc, ce problème semble être résolu pour moi.