从代码隐藏中改变不透明度

时间:2013-11-28 14:28:53

标签: wpf animation opacity

为什么Window代码中的以下事件无效?

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);
(Splashscreen是UserControl)。
我还尝试将FillBehavior="HoldEnd"FillBehavior="Stop"添加到故事板但是没有让它正常工作。

1 个答案:

答案 0 :(得分:4)

再次提及依赖属性值优先级的相同问题。

看看优先事项。

  1. 物业系统强制。

  2. 动态动画或具有保留行为的动画。为了产生任何实际效果,属性的动画必须能够优先于基础(非动画)值,即使该值是在本地设置的。

  3. 本地价值。可以通过“wrapper”属性的方便来设置本地值,该属性也等同于在XAML中设置为属性或属性元素,或者通过使用特定实例的属性调用SetValue API。

  4. 在你的情况下,动画接管。

    这里的代码是#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
    }
    

    我希望你现在终于明白优先事项是如何运作的。 :) :) :))