2011-02-03 34 views
6

我正在尝试使用ObjectAnimationUsingKeyFrames为'样式'属性创建动画。当我运行下面的示例时,我只看到空的窗口,没有任何异常。在WPF中使用ObjectAnimationUsingKeyFrames控制动画的“样式”属性

几乎相同的示例在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> 

+0

尝试DynamicResource而不是StaticResource。 – Bijan 2012-10-10 15:30:55

回答

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

我希望你觉得这个很有用。

最后一个想法:可以定义custom animations,尽管我自己并没有这样做。有一个外部的机会,你可以编写自己的自定义的“ObjectAnimation”,但不限于Freezable或非DependencyObject类。

+0

如果您提供了更多关于为什么要为某种风格设置动画的信息,我可能会提出其他选择。尽管以不同风格创作动画看起来不错,但我相信还有其他方法可以达到预期的效果。 – 2011-03-23 13:57:23

相关问题