【问题标题】:How to set a property without using an animation (Composition Api)?如何在不使用动画(Composition Api)的情况下设置属性?
【发布时间】:2019-05-04 01:32:13
【问题描述】:

问题,我们如何在不使用动画的情况下为 Visual 上的属性设置值?例如,这对我有用(对于翻译),但我觉得必须有更好的方法。我正在使用 1 毫秒的动画来立即设置一个值:

ElementCompositionPreview.SetIsTranslationEnabled(MyRectangle, true);

var visual = ElementCompositionPreview.GetElementVisual(MyRectangle);
var anim = compositor.CreateScalarKeyFrameAnimation();

anim.InsertKeyFrame(1.0f, 100f);
anim.Duration = TimeSpan.FromMilliseconds(1);

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

【问题讨论】:

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


    【解决方案1】:

    document 已经说过翻译不在视觉上: 这些属性与组合 Visual 类上的同名属性具有相同的用途和行为(Translation 除外,它不在 Visual 上)。


    编辑:

    首先感谢Maximus的分享:

    ElementCompositionPreview.SetIsTranslationEnabled(MyRectangle, true);
    
    

    我现在还不太确定您的具体问题。但是对于标题的问题:“如何在不使用动画的情况下设置属性”,你的意思是这样的:

    ElementCompositionPreview.SetIsTranslationEnabled(MyRectangle, true);
      var myInteropVisualPropertySet = ElementCompositionPreview.GetElementVisual(MyRectangle).Properties;
      myInteropVisualPropertySet.InsertVector3("Translation", new Vector3(0f,100f,0f));
    

    此外,我有以下代码示例用于“假设和将要成为偏移量,如您所说,是和直接用动画设置它”问题:

    private void MyRectangle_Tapped(object sender, TappedRoutedEventArgs e)
            {
                var compositor = Window.Current.Compositor;
                Visual visual = ElementCompositionPreview.GetElementVisual(MyRectangle);
                var vertical = compositor.CreateVector3KeyFrameAnimation();
                vertical.InsertKeyFrame(1.0f, new Vector3(0f, 100f, 0f));
                vertical.Duration = TimeSpan.FromMilliseconds(1);
                visual.StartAnimation("Offset", vertical);
            }
    

    顺便说一句,如果您只是专注于动画 UI 元素(不是视觉元素),社区工具包包含一个简单的 function for offset

    【讨论】:

    • 该属性确实存在,因为合成团队添加了以下方法:ElementCompositionPreview.SetIsTranslationEnabled(MyRectangle, true);这种特殊方法是一种将“翻译”属性“注入”到 Visual 属性集中的修复。所以回答,是的,它可以工作,是的,它已经准备好生产了。但除此之外,假设我们要使用您所说的 Offset,有没有办法直接用动画设置它?
    • 这里是关于属性注入的解释:github.com/Microsoft/WindowsCompositionSamples/issues/…
    • @Maximus 感谢分享信息,我已经更新了我对您问题的一些想法的回答,请检查它们是否是您需要的
    • 啊,我知道你做了什么,你抓住了propertyset并直接设置了它,好的,我会尝试一下,希望它能起作用,谢谢!
    【解决方案2】:

    这是我根据@Barry Wang 的回答所做的一个示例:

    var props = ElementCompositionPreview.GetElementVisual(MyRectangle).Properties;
    
    if (props.TryGetVector3("Translation", out var vect) == CompositionGetValueStatus.Succeeded)
    {
        props.InsertVector3("Translation", new Vector3(vect.X, 150f, vect.Z));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2014-01-07
      • 2020-02-09
      相关资源
      最近更新 更多