15

アニメーションを 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 でどのように解決されますか? ヒントはありますか?

4

4 に答える 4

4

このようなことを試してみませんか?

  • 現在のすべてのコントロール テンプレートを非表示のルート要素 (Border や StackPanel など) でラップします。境界ボックスはコントロール全体をカバーします。
  • すべてのトリガーとアニメーションを含むこの非表示ボックスのスタイルまたはコントロール テンプレートを作成します。
  • アニメーションで、非表示ボックスの任意の Color プロパティをアニメーション化します。
  • すべての異なるコントロールのビジュアル ツリーで、アニメーション化するすべてのプロパティを非表示のルート要素の Color プロパティにバインドします。
于 2009-11-06T22:38:14.197 に答える
1

この一般的な問題に対する適切な XAML のみの解決策はないようです。最終的に、特定の要素のすべてのアニメーション動作を定義する独自の添付プロパティを作成しました。このようなもの:

<DataTemplate>
   <!-- ...  -->
   <Rectangle Fill="Gray">
     <v:AnimationHelper.Animations>
        <v:StandardColorStateAnimation TargetColorProperty="(Rectangle.Fill).(SolidColorBrush.Color)" TargetStateProperty={Binding State} />
     </v:AnimationHelper.Animations>
   </Rectangle>
<DataTemplate>

残り(アニメーションの作成など)はコードビハインドで行われます。

于 2009-11-10T10:42:57.473 に答える
0

この投稿の時点で、この問題は少し死んでいることを認識していますが、コードビハインドをほとんど必要としない解決策を見つけました。

カスタム プロパティを使用してUserControl を作成できます(図 8 までスクロールします)。これには、四角形、アニメーション、および状態トリガーが含まれます。このユーザー コントロールは、変更されたときに色の変更をトリガーするステータスなどのパブリック プロパティを定義します。

必要な分離コードは、コードで変数を作成することだけです。

ユーザー コントロールは、XAML ストーリーボードやデータ トリガーを書き換えることなく、何度でも再利用できます。

于 2009-12-18T19:54:35.653 に答える