【问题标题】:ColorAnimation starts only if a color is setColorAnimation 仅在设置颜色时启动
【发布时间】:2011-12-04 20:16:03
【问题描述】:

在启动窗口中,定义了一个带有 TextBlock 的网格,如下所示:

<Grid>
    <TextBlock Text="stackoverflow.com"
               HorizontalAlignment="Center"
               VerticalAlignment="Center"
               Foreground="Yellow">
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="TextBlock.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation To="200"
                                         Duration="0:0:5"
                                         Storyboard.TargetProperty="(TextBlock.FontSize)" />

                        <ColorAnimation To="Blue"
                                        Duration="0:0:5"
                                        Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </TextBlock.Triggers>
    </TextBlock>
</Grid>

在 TextBlock 中,定义了一个简单的 DoubleAnimation 和一个 ColorAnimation,所以没什么特别的。 VS中按F5后直接开始动画。

删除Foreground="Yellow" 后出现奇怪的行为。默认情况下,TextBlock 的 Foreground 设置为黑色(取决于首选的系统主题)。现在两个动画都应该开始了,颜色应该从黑色变成蓝色。不是这样的,动画不会开始。此外,通过在 ColorAnimation 中将 From 属性设置为黑色,动画不会开始。

为什么会出现这种行为,原因是什么?从我的角度来看,无论是否设置颜色,我都看不出一个合乎逻辑的原因。

编辑(附加信息)

无论是否设置了 Foreground 属性,都不会引发异常。有趣的是,如果没有设置 Foreground 属性,则会选择默认颜色。您可以通过编写以下内容来简单地验证它:Debug.WriteLine(this.textBlock.Foreground.ToString());(另外添加了 TextBlock 的名称)。颜色由系统解析。同样通过更改 Windows 主题,颜色得到解决。因此,颜色被隐式设置为 TextBlock。应该是工作吧?

写入 Foreground="Back" 与当前选定的 Windows 主题不匹配。而不是这样做,我更喜欢 DynamicResource 如下

Foreground="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"

StaticResource 可以正常工作,而 DynamicResource 不能正常工作,因此动画无法启动。

首先,WPF 知道隐含颜色。其次,DynamicResource 不会因为任何原因起作用。为什么?可能的错误?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    如果未设置该值,则会引发异常,您无法为默认前景设置动画,因为该实例是不可变的。 (如果你像这样使用加载的事件触发动画,它只会被吞没。)

    【讨论】:

    • 根据您的回复,我已经编辑了我的问题。您能否深入了解 WPF 中的不可变类型?
    • @System.Data:大部分工作都是 dp 系统内部的,所以我不能肯定地告诉你任何事情。我只让我的测试应用程序抛出异常,指出问题是目标的不变性。使用 StaticResource 就像直接在对象上设置一个值,这样可以工作,但 DynamicResource 会创建一个引用。动画代码实际上有一些复制freezables的机制,但这显然在这里没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2012-05-22
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多