DynamicResource颜色不起作用

时间:2012-04-17 17:02:40

标签: .net wpf styles dynamicresource

我有以下代码:

<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”的颜色

http://dl.dropbox.com/u/10557283/DynamicBug.zip

3 个答案:

答案 0 :(得分:5)

动画(VSM)为freezable objects。只要在Freezable的依赖项属性上设置绑定,就可以防止Freezable被冻结。因此,绑定了EasingColorKeyFrame objects are preventing the storyboards from being frozen.

的Value属性

作为一种出路,您可以尝试任何最适合您的三种方法 -

  • 尝试将资源声明为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 AnimationAnimation in code behindSetting 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>