【问题标题】:Why isn't the Translation property (Composition) retained?为什么没有保留 Translation 属性(Composition)?
【发布时间】:2019-04-29 22:25:26
【问题描述】:

我有以下代码将矩形 向下 100px 平移,然后在完成后将矩形 向右 100px 平移,但我希望向右平移以保持动画 Y (100px),但它并没有这样做。调试时,我注意到 Translation 的值是 (0,0,0) 而不是 (0,100,0)。

这是我的应用程序中的代码(应用程序需要有 UWP 目标 + 最小 sdk 17763):

public MainPage()
{
    this.InitializeComponent();

    this.Loaded += (sender1, e1) =>
    {
        var compositor = Window.Current.Compositor;
        var batch = compositor.CreateScopedBatch(Windows.UI.Composition.CompositionBatchTypes.Animation);

        var vertical = compositor.CreateVector3KeyFrameAnimation();

        vertical.InsertKeyFrame(1.0f, new Vector3(0f, 100f, 0f));
        vertical.Duration = TimeSpan.FromMilliseconds(2000);
        vertical.Target = "Translation";

        Rect.StartAnimation(vertical);

        batch.End();

        batch.Completed += (sender2, e2) =>
        {
            var horizontal = compositor.CreateVector3KeyFrameAnimation();

            // PROBLEM: ... Rect.Translation.Y is not 100, it's 0 ...
            horizontal.InsertKeyFrame(1.0f, new Vector3(100f, Rect.Translation.Y, 0f));
            horizontal.Duration = TimeSpan.FromMilliseconds(2000);
            horizontal.Target = "Translation";

            Rect.StartAnimation(horizontal);
        };
    };
}

初始动画完成后保持Y位置的正确方法是什么?

【问题讨论】:

  • 它可能在你期待它之前捕获了 Rect.Translation.Y 的值。也许尝试`horizo​​ntal.InsertExpressionKeyFrame(1.0f, "Vector3(100f, this.Target.Translation.Y, 0f)");`
  • 我以另一种方式解决了它,但我也认为你的正确。谢谢!

标签: uwp windows-composition-api xaml-composition


【解决方案1】:

我很确定 Johhny Westlake 有一个有效的答案,但我通过以下方式解决了我的问题:

this.Loaded += (sender1, e1) =>
{
    var compositor = Window.Current.Compositor;

    ElementCompositionPreview.SetIsTranslationEnabled(Rect, true);
    var visual = ElementCompositionPreview.GetElementVisual(Rect);
    var batch = compositor.CreateScopedBatch(Windows.UI.Composition.CompositionBatchTypes.Animation);

    var vertical = compositor.CreateScalarKeyFrameAnimation();

    vertical.InsertKeyFrame(1.0f, 100f);
    vertical.Duration = TimeSpan.FromMilliseconds(2000);

    visual.StartAnimation("Translation.Y", vertical);

    batch.End();

    batch.Completed += (sender2, e2) =>
    {
        var horizontal = compositor.CreateScalarKeyFrameAnimation();

        horizontal.InsertKeyFrame(1.0f, 100f);
        horizontal.Duration = TimeSpan.FromMilliseconds(2000);

        visual.StartAnimation("Translation.X", horizontal);
    };
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2021-07-26
    • 2012-12-11
    相关资源
    最近更新 更多