1

C# コードでの WPF のアニメーションについて質問があります。
MouseWheel イベントのハンドラー関数があります。「ズームイン」または「ズームアウト」したかどうかを確認するだけです。コードを見てください。ここで重要な行は、RenderTransform が設定されている 4 行目です。

    private void ZoomPanCanvas_MouseWheel(object sender, MouseWheelEventArgs e) {
        var factor = (e.Delta > 0) ? (1.1) : (1 / 1.1);
        currrentScale = factor * currrentScale;
        mNetworkUI.RenderTransform = new ScaleTransform(currrentScale, currrentScale);
        var pos = e.GetPosition(mNetworkUI);
        mNetworkUI.Width = ZoomPanCanvas.ActualWidth / currrentScale;
        mNetworkUI.Height = ZoomPanCanvas.ActualHeight /currrentScale;
        var dummyTransform = new ScaleTransform(factor, factor, pos.X, pos.Y);
        var offSet = new Point(dummyTransform.Value.OffsetX, dummyTransform.Value.OffsetY);
        mNetworkUI.ViewModel.Network.SetTransformOffset(offSet);
    }

完全を期すために、残りの関数をコードに残しました。
私がやりたいのは、この RenderTransform の変更をアニメーション化することです!

私はすでに Storyboard を使用しようとしました (UIElement.RenderTransformProperty が設定されています)。最良の結果は、アニメーション化されていない RenderTransform の変更でした (ただし、コードのこの 4 行目と同じ結果にはなりませんでした)。

多分あなたは私を助けることができます、私はすでにここで他の質問からいくつかの提案された方法を試しました.

編集:

これは機能しない試みであり、最初は上記の変更されたコードです。

    private void ZoomPanCanvas_MouseWheel(object sender, MouseWheelEventArgs e) {
        var factor = (e.Delta > 0) ? (1.1) : (1 / 1.1);
        currrentScale = factor * currrentScale;
        ///mNetworkUI.RenderTransform = new ScaleTransform(currrentScale, currrentScale);
        Helper.Animations.RenderTransformAnimation(mNetworkUI, new ScaleTransform(currrentScale, currrentScale));
        var pos = e.GetPosition(mNetworkUI);
        mNetworkUI.Width = ZoomPanCanvas.ActualWidth / currrentScale;
        mNetworkUI.Height = ZoomPanCanvas.ActualHeight /currrentScale;
        var dummyTransform = new ScaleTransform(factor, factor, pos.X, pos.Y);
        var offSet = new Point(dummyTransform.Value.OffsetX, dummyTransform.Value.OffsetY);
        mNetworkUI.ViewModel.Network.SetTransformOffset(offSet);
    }

そして、静的ヘルパー関数に従います。

    public static void RenderTransformAnimation(FrameworkElement element, Transform newTransform) {
        MatrixAnimationUsingKeyFrames anim = new MatrixAnimationUsingKeyFrames();
        var key1 = new DiscreteMatrixKeyFrame(element.RenderTransform.Value, KeyTime.FromPercent(0));
        var key2 = new DiscreteMatrixKeyFrame(newTransform.Value, KeyTime.FromPercent(1));

        Storyboard.SetTarget(anim, element.RenderTransform);
        Storyboard.SetTargetProperty(anim, new PropertyPath(UIElement.RenderTransformProperty));
        Storyboard sb = new Storyboard();
        sb.Children.Add(anim);
        sb.Duration = AnimationDuration;
        sb.Begin();
    }

sb.Begin() 呼び出しで常に例外がスローされ、'PropertyPath' に問題があることがわかります。私はそれを行う方法がわかりません:(。つまり、「TransformAnimation」を直接作成する方法はありませんよね? MatrixAnimations のみが利用可能です...

4

1 に答える 1