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.