WPF动画不会第一次运行

时间:2013-04-10 07:24:19

标签: wpf

我有一个窗口,打算在显示时淡入。第一次使用时,动画不会运行。在后续使用中,它工作正常。它是一个请求者,我实例化以显示某些内容 - 我不会保留它并重新使用实例。我实例化请求者,设置各种属性,如.Top和.Left,然后调用ShowDialog。在构造函数中,我正在设置DataContext。如果我评论出来(因为另一个线程暗示这可能是由于在动画播放时设置数据上下文引起的)然后它解决了问题。然而,在调用构造函数之后,我才会调用ShowDialog。而且因为我每次想要使用它时都会实例化一个新实例,所以我不明白为什么只有在第一次运行时才会出现问题。

就好像第一次加载程序集一样,但是VS输出窗口没有显示这种情况。

窗口从零不透明度开始,因此通过变为可见,它显示动画被触发,它没有时间运行。如果我将BeginTime设置为半秒,那么它每次都会起作用,但显然当它响应按下按钮时显得更加缓慢,并且在较慢的机器上可能仍然不够。

我正在使用

在XAML中定义动画
<Window.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
        <BeginStoryboard>
            <Storyboard Name="FormFade">
                <DoubleAnimation Name="FormFadeAnimation"
                                 Storyboard.TargetProperty="(Window.Opacity)"
                                 From="0.0" To="1.0" Duration="0:0:0.25"
                                 AutoReverse="False" RepeatBehavior="1x"
                                 BeginTime="0:0:0"/>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Window.Triggers>

是否有更合适的事件要触发?我尝试了Window.Initialized和Window.IsVisibleChanged,但似乎都没有路由事件,所以当解析XAML时它们会抛出异常。

我可以将它全部转移到代码后面(因为无论如何都必须在那里完成淡出)但是如果可以的话,更喜欢在xaml中使用。

我可以从Dispatcher.BeginInvoke分配DataContext,但这看起来很混乱,并且将来要填充的字段可能会在动画之后发生并且看起来很糟糕,所以我只是隐藏问题直到后来。

有没有人对此有任何想法?

1 个答案:

答案 0 :(得分:1)

试试这段代码:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="WpfApplication2.MainWindow"
    x:Name="thisWindow"
    Title="MainWindow"
    Width="640" Height="480" AllowsTransparency="True" WindowStyle="None">

    <Window.Resources>
        <Storyboard x:Key="MyStoryboard">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="thisWindow">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </Window.Resources>
    <Window.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
        </EventTrigger>
    </Window.Triggers>

    <Grid x:Name="LayoutRoot"/>

</Window>