我有以下代码:
<Color x:Key="SelectedColor">Gold</Color>
包含颜色的TabItem样式
<VisualState x:Name="Selected">
<Storyboard>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)"
Storyboard.TargetName="InnerRectangle2">
<EasingColorKeyFrame KeyTime="0" Value="{DynamicResource SelectedColor}"/>
</ColorAnimationUsingKeyFrames>
事实证明我无法在DynamicResource
上使用EasingColorKeyFrame
我能做些什么来达到我的效果?
我需要动态设置颜色,因此只需将"{DynamicResource SelectedColor}"
替换为"{StaticResource SelectedColor}"
即可。
我已经创建了一个很小的解决方案来演示这个问题 - 所选标签应该是金色的,但它实际上是透明的,因为我猜VSM无法解析名为“SelectedColor
”的颜色
答案 0 :(得分:5)
动画(VSM)为freezable objects
。只要在Freezable的依赖项属性上设置绑定,就可以防止Freezable被冻结。因此,绑定了EasingColorKeyFrame objects are preventing the storyboards from being frozen.
作为一种出路,您可以尝试任何最适合您的三种方法 -
尝试将资源声明为StaticResource
并在VSM中使用它。 StaticResource explanation for VSM
我从您的代码中了解到,您希望所选的tabItem为金色。因此,作为一种解决方法,您可以做的是让面板中包含的two borders
表示网格1与其他网格相同,金色边框默认visibility
为折叠且正常可见。
现在,在您的tabItem的selected event
(关于IsSelected或任何方法的属性更改)上,您可以swap the visibility
两个边框给出相同的效果。当然,这种解决方法特定于这种情况,例如,只有当EasingColorKeyFrame关键时间为0时才有意义,否则它不会产生相同的视觉效果。
最后,如果你想坚持通过动画来做,你可以在code behind
中实现这一点。这些帖子可能会对您有所帮助 - Woakaround for dynamicResource in Animation,Animation in code behind和Setting foreground with VSM
答案 1 :(得分:3)
这是因为VSM类型不是逻辑树的一部分,因此无法解析动态资源查找。
答案 2 :(得分:2)
我想出了一种使用图层的方法。制作对象的多个副本,然后只需修改透明度:
<VisualState x:Name="Selected">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="InnerRectangleBorder"
Storyboard.TargetProperty="Opacity"
To="0"
Duration="0:0:0" />
<DoubleAnimation Storyboard.TargetName="InnerRectangleBorderMouseOver"
Storyboard.TargetProperty="Opacity"
To="0"
Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetName="InnerRectangleBorderSelected"
Storyboard.TargetProperty="Opacity"
To="1"
Duration="0:0:1" />
</Storyboard>
</VisualState>