2011-02-03 24 views
6

ObjectAnimationUsingKeyFramesを使用して「スタイル」プロパティをアニメートしようとしています。下のサンプルを実行すると、空のウィンドウが表示され、例外はありません。WPFのObjectAnimationUsingKeyFramesを使用してコントロールの「スタイル」プロパティをアニメーション化します

ほとんど同じサンプルがSilverlightで動作します。 WPFでは、コントロールの 'スタイル'プロパティを直接割り当てても機能します。 WPFで 'スタイル'プロパティをアニメーション化することが可能かどうかは誰にも分かりますか?

多くのありがとうございます。

<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

StaticResourceの代わりにDynamicResourceを試してください。 – Bijan

答えて

1

ObjectAnimationUsingKeyFramesDependencyObjectから導出された値にアニメーション化しようとすると、それは最初のオブジェクトをfreezeしよう。オブジェクトをフリーズできない場合は、例外がスローされ、アニメーションは実行されません。

作成したカスタムタイプの値をアニメートする場合は、Freezableから派生するか、DependencyObjectから派生する必要があるように見えます。

DependencyObjectから派生し、既に存在するプロパティのために

なくFreezable、あなたは(StylePropertyまたはTemplatePropertyがポイントである場合)、それらをアニメーション化することはできません。

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

さまざまなスタイルを切り替える代わりに、すべてのトランジションロジックをスタイルに組み込みます。あなたがこれを持っている可能性がある課題は、ターゲットプロパティが依存プロパティでなければならないため、IsLoadedを使用できないことです。

この情報が役に立ちましたら幸いです。

最終的な考え:custom animationsを定義することは可能ですが、これは自分では行っていません。 Freezableまたは非DependencyObjectクラスに限定されないカスタム "ObjectAnimation"を書くことができる機会はありません。

+0

スタイルをアニメートする理由の詳細については、他の選択肢を提案することができます。別のスタイルにアニメートするのはいいかもしれませんが、私は希望の効果を得るための他の方法があると確信しています。 –

関連する問題