从代码后台更改不透明度

3
为什么在 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>

解决方法: 在代码中,您可以通过首先执行以下命令来删除动画: Splashscreen.BeginAnimation(UserControl.OpacityProperty, null);
(Splashscreen是一个用户控件)。
我还尝试向故事板添加FillBehavior="HoldEnd"FillBehavior="Stop",但无法正确地使其工作。


2
我不同意你的最后一条评论...对我来说这很好用。也许你可以展示一个简化版本的XAML,仍然表现出这种行为? - Sheridan
1个回答

4

你又遇到了与依赖属性值优先级相关的问题。

让我们看一下这些优先级:

  1. 属性系统强制转换。

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

  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
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接