アニメーションを xaml のどこかで (たとえば、リソースとして) 一度定義してから、複数回再利用する方法はありますか? データトリガーに基づいて同じ種類のアニメーションを個別に開始する必要がある、さまざまなデータテンプレートにまたがる独立したブラシがたくさんあります。アニメーションは Storyboard.TargetName と Storyboard.TargetProperty を定義する必要があるようです。これは、再利用性の目的をほとんど無効にします。「このアニメーションをリソースから使用するが、今回は別の要素に適用する」と何とか宣言したいと思います。
私には、これはかなり基本的で重要かつ不可欠な要求のように思えますが、達成するのがそれほど簡単ではないことに驚いています。ここで何か不足していますか?
同じことがトリガーにも当てはまります。カラー アニメーションを使用して同じ種類の状態を表すさまざまな視覚要素が多数あるとします。たとえば、「アクティブ」の場合は緑にフェードし、「エラー」の場合は「赤」にフェードします。ビジュアル間の唯一の違いは、形状/ビジュアル ツリーです。目的のアニメーションの動作は同じです。それらはすべて、ビジュアル ツリーのどこかに要素を持っています。 type color のプロパティがあります。同じアニメーションとデータトリガー セットを何度も再定義するのがどれほど面倒かは想像に難くありません。すべての開発者はこれを嫌います。私は、C# のコード ビハインドをまったく (または少なくともほとんど) 必要としない、より簡単なソリューションを必死に探しています。
私がこれまでに思いついたのはこれです:
リソースのアニメーションを次のように定義します (アクティブ化、アクティブ、非アクティブ、エラーなど、存在するすべての基本的な状態に対してこれを繰り返します)。
<ColorAnimationUsingKeyFrames x:Key="deactivatingColorAnimation"
Storyboard.TargetProperty="Material.(MaterialGroup.Children)[0].Brush.(SolidColorBrush.Color)"
FillBehavior="HoldEnd" RepeatBehavior="Forever" AutoReverse="True">
<ColorAnimationUsingKeyFrames.KeyFrames>
<LinearColorKeyFrame KeyTime="00:00:00" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.25" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.5" Value="Gray" />
<LinearColorKeyFrame KeyTime="00:00:0.75" Value="Gray" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
トリガーのストーリーボードで使用します (各状態 X ごとに異なる状態ビジュアルごとにこれを無数に繰り返し、常にストーリーボードの新しい名前を考え出します):
<DataTrigger Binding="{Binding SubstrateHolder.State}" Value="Deactivating">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="someStateVisualDeactivatingStoryboard">
<Storyboard Storyboard.TargetName="someStateVisual">
<StaticResource ResourceKey="deactivatingColorAnimation" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="someStateVisualDeactivatingStoryboard" />
</DataTrigger.ExitActions>
</DataTrigger>
無数の DataTriggers を繰り返しコピー アンド ペーストしなければならない XAML がどれだけ肥大化しているか容易に想像できます。
このすべてのトリガーを 1 回定義して、さまざまな状態のビジュアルに適用すると便利です。このような問題は WPF でどのように解決されますか? ヒントはありますか?