0

我相信 Windows.UI.Composition 工具与按钮上的 XAML VisualStates 冲突。

GIF #1 当按钮处于正常状态时,没有光标悬停,动画工作并且按钮在向下滚动时成功消失,然后在向上滚动时成功重新出现。

GIF #2 如果当合成动画完成时光标悬停在按钮上,并且鼠标在向上滚动之前退出按钮,我相信 PointerOver 状态会被冻结并且 0% 的不透明度会卡住。修复它的唯一方法是再次悬停以解除 XAML VisualStates 的干扰。

按钮可以消失并重新出现。 按钮消失,直到 PointerOver 事件才重新出现

按钮都在同一个 StackPanel 中,这是不透明动画的目标。当一个按钮出现这个问题时,整个 StackPanel 会卡在 0% 的不透明度。下面的代码是一般要点,为简洁起见省略了一些部分。我不认为这是代码问题,我认为这是平台限制,我正在寻找解决方法。

CompositionPropertySet _scrollerPropertySet = 
ElementCompositionPreview.GetScrollViewerManipulationPropertySet((ScrollViewer)sender);
Compositor _compositor = _scrollerPropertySet.Compositor;
CompositionPropertySet _props = _compositor.CreatePropertySet();
_props.InsertScalar("progress", 0);
var scrollingProperties = 
_scrollerPropertySet.GetSpecializedReference<ManipulationPropertySetReferenceNode>();
var props = _props.GetReference();
var progressNode = props.GetScalarProperty("progress");
ExpressionNode progressAnimation = EF.Clamp(-scrollingProperties.Translation.Y / clampSizeNode, 0, 1);
_props.StartAnimation("progress", progressAnimation);

// StackPanel relevant code:

Visual carOperationButtonStackPanelVisual= 
ElementCompositionPreview.GetElementVisual(CarOperationStackPanel);
ExpressionNode carSubtitleObjectOpacityAnimation = 1 - (progressNode * 2);
carOperationButtonStackPanelVisual.StartAnimation("Opacity", carSubtitleObjectOpacityAnimation);
4

1 回答 1

0

在上面的代码摘录中,接近尾声的这一行

ExpressionNode carSubtitleObjectOpacityAnimation = 1 - (progressNode * 2);

应该

ExpressionNode carSubtitleObjectOpacityAnimation = ExpressionFunctions.Lerp(0, 1, 1 - (progressNode * 2));

这将强制不透明度使用从 0 到 1 的线性插值进行更新。对于它的价值,我从Win UI samples repo复制了源代码,它不使用 Lerp() 来表示不透明度。我的结论是 Lerp 对系统的负担更大,但当控件具有视觉状态时是必要的。示例 repo 为一个简单的 TextBlock (没有视觉状态)设置动画。

于 2020-09-20T00:51:28.867 回答