3

我有以下代码:

<Color x:Key="SelectedColor">Gold</Color> 

和一个包含颜色的 TabItem Style

<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>

事实证明我不能DynamicResourceEasingColorKeyFrame.
我该怎么做才能达到我的效果?

我需要动态设置颜色,因此只需交换"{DynamicResource SelectedColor}"即可"{StaticResource SelectedColor}"

我创建了一个小解决方案来演示这个问题 - 选定的选项卡应该是金色的,但它实际上是透明的,因为我猜 VSM 无法解析名为“ SelectedColor”的颜色

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

4

3 回答 3

6

动画(VSM)是freezable objects。一旦对 Freezable 的依赖属性设置绑定,就可以防止 Freezable 被冻结。因此,您的 Value 属性上的绑定EasingColorKeyFrame objects are preventing the storyboards from being frozen.

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

  • 尝试将资源声明为StaticResource并在您的 VSM 中使用它。VSM的StaticResource解释

  • 我从您的代码中了解到,您希望选定的 tabItem 为金色。因此,作为一种解决方法,您可以做的是让two borders面板中包含一个网格,一个网格,金色边框默认visibility为折叠,正常一个可见。现在,在tabItem 的selected event(在 IsSelected 或任何方法的属性更改时)上,您可以swap the visibility使用两个边框来产生相同的效果。当然,这种解决方法是针对这种情况的,例如,只有 EasingColorKeyFrame 关键时间为 0 时才有意义,否则不会产生相同的视觉效果。

  • 最后,如果你想坚持通过动画来做到这一点,你可以在code behind. 这些帖子可能对您有帮助 - Woakaround for dynamicResource in Animation , Animation in code behindSetting forforeground with VSM

于 2012-07-23T17:09:36.843 回答
3

这是因为 VSM 类型不是逻辑树的一部分,因此无法解析动态资源查找。

于 2012-04-17T17:09:52.223 回答
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>
于 2012-07-24T21:13:07.867 回答