1

私はWindowsPhoneアプリに取り組んでいますが、これは同様に当てはまると思いますSilverlight。'プロパティを透明から赤にStoryboard変更してから透明に戻す(現在、テスト用の分離コードページでグローバル変数として作成しています)を作成したいと思います。これを複数の長方形の間で再利用するので、コードビハインドからアクセスできるようにしたいと思います。このような例は見つからなかったので、うまくいくと思うものを試してみました。RectangleFillStoryboardBegin()

初期設定:

sb = new Storyboard();

turnOn= new ColorAnimation();
turnOn.From = Colors.Transparent;
turnOn.To = Colors.Red;
turnOn.Duration = new TimeSpan(0, 0, 0, 0, 500); //half second

turnOff= new ColorAnimation();
turnOff.From = Colors.Red;
turnOff.To = Colors.Transparent;
turnOff.Duration = new TimeSpan(0, 0, 0, 0, 500); //half second

Storyboard.SetTargetProperty(turnOn, new PropertyPath("(Rectangle.Fill)"));
Storyboard.SetTargetProperty(turnOff, new PropertyPath("(Rectangle.Fill)"));

sb.Children.Add(turnOn);
sb.Children.Add(turnOff);

canvas.Resources.Add("sb", sb); // this is the canvas where the rectangles will be

次に、いつでも、Rectangle上から上にあるインスタンスがある場合Canvasは、ストーリーボードを開始したいと思います。これにより、Rectangle赤に変わり、透明に戻ります。

// Set the target to my current rectangle, and begin:
Storyboard.SetTarget(turnOn, myRectangle);
Storyboard.SetTarget(turnOn, myRectangle);
sb.Begin();

ただし、次の例外がsb.Begin()行にスローされます。

InvalidOperationExceptionはユーザーコードによって処理されませんでしたタイプ'System.InvalidOperationException'の例外がSystem.Windows.ni.dllで発生しましたが、ユーザーコードでは処理されませんでした

私の考えでは、ここからそれほど遠くないことを望んでいますが、もっと簡単な方法があるのではないでしょうか。そうでない場合、誰かが私が間違っていることを見ることができますか?

更新(解決策):

@Josh Mackeyが提供した例に従い、とにかくきれいになると思うページに移動Storyboardしました。XAML以前気づかなかったのは、「互換性のないタイプのため、ColorAnimationを使用してプロパティFillをアニメーション化することはできません」という例外の詳細でした。に変更することで、@JoshMackeyのソリューションを使用できましColorAnimationColorAnimationUsingKeyFrames。新しいコード:

<Canvas.Resources>
  <Storyboard x:Name="sb">
    <ColorAnimationUsingKeyFrames 
      Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)"
         AutoReverse="True">
            <EasingColorKeyFrame KeyTime="00:00:0" Value="Black" />
            <EasingColorKeyFrame KeyTime="00:00:0.25" Value="Red" />
    </ColorAnimationUsingKeyFrames>
  </Storyboard>
</Canvas.Resources>

に設定できたため、1つのアニメーションしか使用できませんでしたAutoReverseTrueこの記事Storyboardでは、コード内でにアクセスする方法を説明しています。次のようになります。

sb.Stop();
sb.SetValue(Storyboard.TargetNameProperty, myRectangle.Name);
sb.Begin();

そして今、それは期待通りに動作します!

4

1 に答える 1

6

XAMLファイルでストーリーボードを定義できない特別な理由はありますか?

次の例は、私のWP7プロジェクトからのものです。そのユーザーコントロールですが、同じプロセスが適用されます。UserControlを使用しているものに置き換えるだけです。

<UserControl.Resources>
    <Storyboard x:Key="aniFlipToBack">
        <DoubleAnimation Storyboard.TargetName="LayoutRoot" 
                         Completed="DoubleAnimation_Completed"
                         Storyboard.TargetProperty="(Grid.Projection).(PlaneProjection.RotationY)" 
                         From="0" To="180" Duration="0:0:0.5" RepeatBehavior="1x" />
        <ObjectAnimationUsingKeyFrames 
            Duration="0:0:0.5"
            Storyboard.TargetName="gridFront" Storyboard.TargetProperty="Visibility">
            <DiscreteObjectKeyFrame KeyTime="0:0:0.25" Value="Collapsed" />
        </ObjectAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames 
            Duration="0:0:0.5"
            Storyboard.TargetName="gridBack" Storyboard.TargetProperty="Visibility">
            <DiscreteObjectKeyFrame KeyTime="0:0:0.25" Value="Visible" />
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>     
</UserControl.Resources>

そしてそれを使用するには:

Storyboard storyBoard = (Storyboard)this.Resources["aniFlipToBack"];
storyBoard.Begin();

(コメントしたと思いますが、どうやら私の担当者は十分に高くないので、それを有効にするためにサンプルを含む回答を投稿します。:P)

于 2012-11-10T03:53:54.833 に答える