2013-11-28 28 views
3

爲什麼窗口代碼中的以下事件無效?更改代碼隱藏的不透明度

void about_Click(object sender, RoutedEventArgs e) 
{ 
    // TopLevel.Opacity = 1.0, Splashscreen.Opacity = 0.0 
    TopLevel.Opacity = 0.1; 
    // still: TopLevel.Opacity = 1.0 
    Splashscreen.Opacity = 1.0; 
    // still: Splashscreen.Opacity = 0.0 
} 

不透明度值不會改變。

我發現下面的觸發是我的問題的原因:

<Window.Triggers> 
    <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
     <BeginStoryboard Storyboard="{StaticResource splashscreenanimation}" /> 
    </EventTrigger> 
</Window.Triggers> 

當我刪除它的代碼隱藏工作。

爲了完整性,這是動畫:

<Window.Resources> 
    <Storyboard x:Key="splashscreenanimation"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 
             Storyboard.TargetName="Splashscreen" 
             BeginTime="0:0:0.900"> 
      <EasingDoubleKeyFrame KeyTime="0:0:1.5" 
            Value="0" /> 
     </DoubleAnimationUsingKeyFrames> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 
             Storyboard.TargetName="TopLevel" 
             BeginTime="0:0:0.900"> 
      <EasingDoubleKeyFrame KeyTime="0:0:1.5" 
            Value="1" /> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
</Window.Resources> 

Solution:在後面的代碼可以由第一執行移除動畫:Splashscreen.BeginAnimation(UserControl.OpacityProperty, null);
(濺射屏幕是一個用戶控件)。
我也嘗試將FillBehavior="HoldEnd"FillBehavior="Stop"添加到故事板,但沒有讓它正常工作。

+2

我不同意你最近的評論......對我來說工作正常。也許你可以展示你的XAML的簡化版本,它仍然表現出這種行爲? – Sheridan

回答

3

再次您和依賴項屬性值優先級再次相同的問題。

看看重點。

  1. 屬性系統強制。

  2. 活動動畫或具有保持行爲的動畫。爲了產生任何實際效果,即使該值是在本地設置的,屬性的動畫必須能夠優先於基本(未動畫)值。

  3. 當地價值。可以通過「包裝器」屬性的方便來設置本地值,該值也等於在XAML中設置爲屬性或屬性元素,或者通過使用特定實例的屬性調用SetValue API。

在你的情況下,動畫接管。

您的代碼在這裏是#3。您正在設置本地值,但動畫仍然佔據上風。

void about_Click(object sender, RoutedEventArgs e) 
{ 
    // TopLevel.Opacity = 1.0, Splashscreen.Opacity = 0.0 
    TopLevel.Opacity = 0.1; 
    // still: TopLevel.Opacity = 1.0 
    Splashscreen.Opacity = 1.0; 
    // still: Splashscreen.Opacity = 0.0 
} 

我希望你現在終於明白了優先的工作方式。 :) :) :)