0

WPF アプリケーションでトランジションを実装しています。

最初に、2 つの FrameworkElement を 2 つの ImageBrush に「保存」します。次に、シェーダー Effect の Input & Back (Brush) プロパティを設定します。

    CustomEffect s = new CustomEffect();

    RenderTargetBitmap rtb = new RenderTargetBitmap((int)SourceFrameWorkElement.ActualWidth, (int)SourceFrameWorkElement.ActualHeight, 96, 96, PixelFormats.Pbgra32);

    rtb.Render(SourceFrameWorkElement);
    ImageBrush ib = new ImageBrush(rtb);
    s.Input = ib;

    rtb.Render(TargetFrameWorkElement);
    ib.ImageSource = rtb;
    s.Back = ib;

    SourceFrameWorkElement.Effect = s;

すべての設定が完了したので、シェーダーの Time プロパティをアニメーション化したいので、これを試しました:

    DoubleAnimation refDoubleAnimation = new DoubleAnimation(0.0, 1.0, Duration);
    Storyboard.SetTarget(refDoubleAnimation, SourceFrameWorkElement);
    Storyboard.SetTargetProperty(refDoubleAnimation, new PropertyPath("(Effect).(CustomEffect.Time)");
    refStoryboard.Children.Add(refDoubleAnimation);
    refStoryboard.Completed += new EventHandler(OnStoryboardCompleted);
    refStoryboard.Begin(SourceFrameWorkElement, true);

そして、次のメッセージで begin メソッドで InvalidOperationException を取得します。

「プロパティ パス '(Effect).(CustomEffect.Time)' 内のすべてのプロパティ参照を解決できません。
該当するオブジェクトがプロパティをサポートしていることを確認してください。」

しかし、BlurEffect のような組み込みのエフェクトを使用すると、機能します....

誰かが私が間違っている場所を教えてもらえますか?

編集:
私も試しました

    SourceElement.Effect.BeginAnimation(SlideInEffect.TimeProperty, refDoubleAnimation)

ストーリーボードを使用する代わりに、例外は発生しませんが、2 番目の画像がすぐにポップされ、アニメーションが再生されません

4

1 に答える 1

0

解決策は、BeginAnimation を使用することでした ^^

実際、不透明度が 1 の 2 番目の画像があり、アニメーションが遅れて再生されていました (OnAnimationCompleted eventHandler を取得するのにかかった時間がトランジション Duration と一致するかどうかを確認しました)。

そのため、2 つの DiscreteDoubleKeyFrames を使用して TargetElement の不透明度に 2 番目のアニメーションを作成し、このトリックを実行しましたが、今では機能します ^^

たぶん、PropertyPath に名前空間を追加すれば Storyboard が機能する可能性がありますが、テストする時間がないので、必要に応じて試してみて、投稿を更新してください ^^.

于 2012-06-19T06:12:11.787 に答える