在WPF中使用ObjectAnimationUsingKeyFrames动画控制的“Style”属性

6
我正在尝试使用ObjectAnimationUsingKeyFrames动画化“Style”属性。 运行下面的示例时,我只看到空窗口,也没有任何异常。
几乎相同的示例在Silverlight中有效。 在WPF中,如果我直接分配控件的“Style”属性,则也有效。 是否有人知道如何在WPF中动画化“Style”属性?
非常感谢。
<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:this="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525"
    >
<Window.Resources>
    <ResourceDictionary>

        <Style x:Key="TestStyle" TargetType="Control">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Canvas x:Name="Rectangle">
                            <Rectangle Width="200" Height="150" Fill="Red"/>
                        </Canvas>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
</Window.Resources>
<Canvas>
    <Canvas.Triggers>
        <EventTrigger RoutedEvent="Canvas.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Target" Storyboard.TargetProperty="Style" >
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="{StaticResource ResourceKey=TestStyle}" />
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Canvas.Triggers>

    <Canvas.Children>
        <ContentControl x:Name="Target"/>
    </Canvas.Children>
</Canvas>


尝试使用DynamicResource而不是StaticResource。 - Bizhan
1个回答

1

ObjectAnimationUsingKeyFrames尝试动画到从DependencyObject派生的值时,它首先尝试freeze该对象。如果无法冻结该对象,则会引发异常并且动画不会运行。

如果您正在对自己编写的自定义类型的值进行动画处理,则似乎需要从Freezable派生或者不要从DependencyObject派生。

对于已经存在且从DependencyObject而不是Freezable派生的属性,您无法对其进行动画处理(StylePropertyTemplateProperty就是这种情况)。请尝试在样式内使用属性设置器:

<Style.Triggers>
  <Trigger Property="IsEnabled" Value="True">
    <Setter Property="Template" Value="{StaticResource TestTemplate}"/>
  </Trigger>
</Style.Triggers>

将所有的过渡逻辑都构建到样式中,而不是在不同的样式之间切换。你可能会遇到的一个挑战是目标属性必须是依赖属性,因此你不能使用 IsLoaded

希望这对你有用。

最后一点思考:可以定义自定义动画,尽管我自己没有这样做过。有一种可能性是你可以编写自己的自定义 "ObjectAnimation",它不会受到Freezable或非DependencyObject类的限制。


如果您提供更多有关为什么想要为样式添加动画的信息,我可能能够建议其他替代方案。虽然将动画应用于不同的样式可能看起来很好,但我相信还有其他方法可以实现所需的效果。 - Josh G

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