2013-04-10 103 views
2

我有一个窗口,在显示时会淡入。第一次使用它时,动画不会运行。在后续使用中,它工作正常。这是一个请求者,我实例化显示的东西 - 我不保留它并重新使用这些实例。我实例化请求者,设置各种属性,如.Top和.Left,然后调用ShowDialog。在构造函数中,我设置了DataContext。如果我发表评论(因为另一个线程提示这可能是由于在动画播放时设置了数据上下文而导致的),那么它就会摆脱这个问题。然而,直到构造函数被调用之后,我才调用ShowDialog。而且,因为每次我想使用它时都会实例化一个新实例,所以我不明白为什么只有在第一次运行时才会出现问题。WPF动画不会第一次运行

就好像程序集第一次被加载,但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,但这看起来很乱,而且在将来可能会出现填充字段的情况下,它可能会在动画出现之后发生并且看起来很糟糕,所以我只是隐藏了问题直到后来。

有没有人有这个想法?

回答

0

试试这个代码:

<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> 
+1

谢谢。可以看到逻辑,但行为保持不变。如果我将故事板转换为全局资源文件之一,在对话框中使用它并在程序启动期间使用FindResource显式加载它,以尝试强制执行可能发生的任何预编译/缓存,它也保持不变。即使我将相同的触发器应用于主UI窗口,请求者在第一次使用它时仍然不会褪色。 – 2013-04-10 11:19:35

+0

抱歉,我已经测试了您的代码和我的电脑上的代码,并且两者都正常工作。你的问题不在编码,我认为直接x。确保你有它的最新版本。 – MoHaKa 2013-04-11 10:06:15