Wpf 从代码隐藏更改不透明度

Wpf 从代码隐藏更改不透明度,wpf,animation,opacity,Wpf,Animation,Opacity,为什么窗口代码中的以下事件无效 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.Opac

为什么窗口代码中的以下事件无效

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>

:在代码隐藏中,您可以通过首先执行以下操作来删除动画:
Splashscreen.BeginAnimation(UserControl.OpacityProperty,null)
(Splashscreen是一个用户控件)。

我还尝试将
FillBehavior=“HoldEnd”
FillBehavior=“Stop”
添加到情节提要中,但没有使其正常工作。

一次又一次地解决了依赖属性值优先级的相同问题

看看优先事项

  • 产权制度强制

  • 活动动画或具有保持行为的动画。为了产生任何实际效果,特性的动画必须能够优先于基本(无动画)值,即使该值是在本地设置的

  • 本地值。本地值可以通过“包装器”属性的便利性来设置,这也等同于在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
    }
    

    我希望现在你终于明白了优先级是如何工作的

    我不同意你最后的评论。。。这对我来说很好。也许您可以展示一个简化版本的XAML,它仍然表现出这种行为?