0

Windowsストアアプリケーションでは、位置が変更されたときにテレポートする代わりに急降下させるために、RepositionThemeTransitionをUI要素に追加できます。他のタイプの遷移もあります。

<Rectangle>
    <Rectangle.Transitions>
        <TransitionCollection>
            <RepositionThemeTransition/>
        </TransitionCollection>
    </Rectangle>
</Rectangle>

WPFはこの機能をサポートしていないようです。同等のことをする方法はありますか?

4

2 に答える 2

0

あなたが探しているのは、BlendのSDKFluidMoveBehaviorでの動作だと思います。Webにはいくつかのチュートリアルがあります。これは、動作やこの特定の動作に慣れていない場合のチュートリアルです。

于 2012-11-21T23:06:17.190 に答える
0

位置の変化を最初に打ち消すLayoutUpdatedイベントにアニメーションを適用することで、機能を自分でエミュレートすることになりました。コードは次のとおりです。

public static void AddRepositionTransitionsUsingRenderTransform(this FrameworkElement control, bool x = true, bool y = true, CancellationToken lifetime = default(CancellationToken)) {
    if (control == null) throw new ArgumentNullException("control");
    var approachPeriod = TimeSpan.FromMilliseconds(100);

    // animate when positions change, to give a 'swooping' effect instead of teleporting
    var transform = new TranslateTransform();
    var oldPosition = May<Point>.NoValue;
    EventHandler updated = (sender, arg) => {
        // determine where the control has moved to
        var newPosition = control.ActualWidth == 0 || control.ActualHeight == 0 || control.Visibility != Visibility.Visible
                        ? May<Point>.NoValue
                        : control.TranslatePoint(new Point(-transform.X, -transform.Y), Application.Current.MainWindow);
        if (oldPosition == newPosition) return;

        // adjust the animation to initially cancel the change in position, and finish at the new final position after the approach period
        var dif = (from o in oldPosition
                    from n in newPosition
                    select new Point(n.X - o.X, n.Y - o.Y)
                    ).ElseDefault();
        if (x) transform.BeginAnimation(TranslateTransform.XProperty, new DoubleAnimation(transform.X - dif.X, 0, approachPeriod));
        if (y) transform.BeginAnimation(TranslateTransform.YProperty, new DoubleAnimation(transform.Y - dif.Y, 0, approachPeriod));

        oldPosition = newPosition;
    };

    // register for events and replace transform, until lifetime ends
    var oldTransform = control.RenderTransform;
    control.RenderTransform = transform;
    control.LayoutUpdated += updated;
    lifetime.Register(() => {
        control.LayoutUpdated -= updated;
        control.RenderTransform = oldTransform;
    });
}

「May」はカスタムオプションタイプであるため、パーツはコンパイルされないことに注意してください。タイプポイントを使用できますか?代わりに、クエリの代わりに明示的なnullチェックを使用します。

于 2012-11-22T19:27:55.737 に答える