如何在不使用动画的情况下设置 属性 (Composition Api)?
How to set a property without using an animation (Composition Api)?
问题,我们如何在不使用动画的情况下在 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);
document已经说翻译不在视觉上了:
这些属性与组合 Visual class 上的 like-named 属性具有相同的目的和行为(除了 Translation,它不在 Visual 上)。
编辑:
首先感谢Maximus的分享:
ElementCompositionPreview.SetIsTranslationEnabled(MyRectangle, true);
我现在还不太确定你的具体问题。但是对于标题的问题:"How to set a property without using an animation",你的意思是这样的吗:
ElementCompositionPreview.SetIsTranslationEnabled(MyRectangle, true);
var myInteropVisualPropertySet = ElementCompositionPreview.GetElementVisual(MyRectangle).Properties;
myInteropVisualPropertySet.InsertVector3("Translation", new Vector3(0f,100f,0f));
此外,对于"Suppose and were to-to-be Offset as you stated, is and a-to-set it directly with animation"问题,我有以下代码示例:
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
这是我根据@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));
}
问题,我们如何在不使用动画的情况下在 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);
document已经说翻译不在视觉上了: 这些属性与组合 Visual class 上的 like-named 属性具有相同的目的和行为(除了 Translation,它不在 Visual 上)。
编辑:
首先感谢Maximus的分享:
ElementCompositionPreview.SetIsTranslationEnabled(MyRectangle, true);
我现在还不太确定你的具体问题。但是对于标题的问题:"How to set a property without using an animation",你的意思是这样的吗:
ElementCompositionPreview.SetIsTranslationEnabled(MyRectangle, true);
var myInteropVisualPropertySet = ElementCompositionPreview.GetElementVisual(MyRectangle).Properties;
myInteropVisualPropertySet.InsertVector3("Translation", new Vector3(0f,100f,0f));
此外,对于"Suppose and were to-to-be Offset as you stated, is and a-to-set it directly with animation"问题,我有以下代码示例:
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
这是我根据@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));
}