有没有办法在故事板中使用setter而不是动画?

时间:2012-08-23 10:03:39

标签: wpf xaml storyboard setter

动画很不错,但有时我只是想立即更改属性的值,而不需要任何动画。显然,唯一的方法是使用<Something>AnimationUsingKeyFrames

<Storyboard>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="txtStatus" Storyboard.TargetProperty="Foreground">
        <DiscreteObjectKeyFrame KeyTime="0">
            <DiscreteObjectKeyFrame.Value>
                <SolidColorBrush Color="Red" />
            </DiscreteObjectKeyFrame.Value>
        </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
</Storyboard>

语法很乱...... 7行代码只是为了将属性设置为不同的值?!

有更简单的方法吗?

我希望能够做到这样的事情:

<Storyboard>
    <Setter TargetName="txtStatus" Property="Foreground" Value="Red" />
</Storyboard>

(我知道这段代码无效,只是举例说明我想要的内容)


编辑:只是为了说清楚:我知道TriggersDataTriggers,但它们不是我需要的,因为它们只能用在样式和控件模板中。我在VisualStateManager中使用UserControl,因此我被迫使用Storyboard

2 个答案:

答案 0 :(得分:1)

如果您正在设置的属性类型存在非关键帧动画(并且存在大量非关键帧动画类型),则可以使用持续时间为0的动画。像一个二传手和一行xaml一样行动的效果。例如:

<Storyboard>
    <ColorAnimation Storyboard.TargetName="txtStatus" Storyboard.TargetProperty="Foreground" Value="Red" Duration="0" />
</Storyboard>

这是有效的,因为动画的默认FillBehavior是HoldEnd。

与出现“Setter”这个词并不完全相同 - 浏览xaml需要一些解释才能意识到动画具有即时设置的效果。此外,当故事板结束时,该值将恢复,但这确实适合立即更改值的帐单。

答案 1 :(得分:0)

你必须设置触发器(你可能已经调用了故事板。而不是用BeginStoryboardStoryboard项填充它们,而是用setter填充它们。

<Trigger Property="<SomeProperty>" Value="<SomeValue>">
   <Setter TargetName="txtStatus" Property="Foreground" Value="Red" />
</Trigger>