2013-11-28 23 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 
} 

我希望你现在终于明白了优先的工作方式。 :) :) :)