2013-04-10 168 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