听取Loaded的EventTrigger被触发两次?

时间:2015-07-21 18:23:47

标签: c# wpf animation storyboard eventtrigger

首先,我不确定它是否实际触发了两次。如果在代码后面测试Loaded事件只触发一次(甚至尝试使用AddHandler接受第三个参数 processedEventsToo )。但看起来很可能。我在XAML中设置了Storyboard,并且在Loaded引发时应该只运行一次。但它似乎开始了2次,特别是第二次是在窗口显示之后。

我知道因为我在故事板内的DoubleAnimation上使用了附加属性。这个附加属性有1个propertyChangedCallback处理程序。然而,此处理程序使用相同的e.NewValue值(来自参数)触发两次。它不应该被触发两次。我可以确定目标(它是动画的)并设置一些附加标志来标记已经完成的事情,以防止两次触发的问题,但这也会阻止其他实际触发器(不是来自Loaded )。然而,DoubleAnimation本身是为每个触发器新创建的(因此我也无法在其上标记任何标志,因为每次触发propertyChangedCallback时都是另一个DoubleAnimation的时间,无法标记并阻止执行)。

这是代码,只是简单的测试:

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>

我想避免这两次触发以及理解为什么会如此。 感谢您提出任何建议和帮助。

1 个答案:

答案 0 :(得分:0)

嗯,实际上EventTrigger只触发一次。我在问题中所说的几乎是错误的看法。我发现看起来像Storyboard克隆了DoubleAnimation这实际上克隆了连接属性导致2次进入propertyChanged回调处理程序。第一次是原始DoubleAnimation。第二次是克隆的DoubleAnimation,它实际上可以克隆并在Loaded被引发时运行,所以它就像我之前说的那样显示窗口后发生。

至少现在我理解了这个问题,而且更多的调试告诉我,进入处理程序的那种2次不会影响任何严重的问题。所以这个问题似乎已经解决了。