2011-02-03 388 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