动态资源颜色不起作用



我有以下代码:

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

和包含颜色的选项卡项样式

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

事实证明,我不能在EasingColorKeyFrame上使用DynamicResource.
我能做些什么来达到我的效果?

我需要动态设置颜色,所以只需将"{DynamicResource SelectedColor}""{StaticResource SelectedColor}"交换即可。

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

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

Animations(VSM) 是freezable objects .只要对可冻结对象的依赖项属性设置绑定,就可以防止冻结可冻结项。 因此,EasingColorKeyFrame objects are preventing the storyboards from being frozen. Value 属性上的绑定

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

  • 尝试将资源声明为 StaticResource 并在 VSM 中使用它。VSM 的静态资源说明

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

  • 最后,如果你想坚持通过动画来做到这一点,你可以在 code behind .这些帖子可能会对您有所帮助 - Woakaround用于动画中的动态资源,代码中的动画和使用VSM设置前景

这是因为

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

我想出了一种用图层来做到这一点的方法。创建对象的多个副本,然后像这样修改透明度:

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

我意识到这有点晚了,但是这个例子对我来说非常有效,关于在 VisualState 情节提要中使用 DynamicResource 分配颜色:

<VisualState x:Name="PopupOpen">
  <Storyboard>
        <ObjectAnimationUsingKeyFrames
               Storyboard.TargetName="rootGrid"
               Storyboard.TargetProperty="(Panel.Background)">
            <DiscreteObjectKeyFrame KeyTime="0:0:0.25" Value=" 
            {DynamicResource 
                  BrushIconComboBox_Popup_Open_Background}" />

最新更新