【问题标题】:DynamicResource color not working动态资源颜色不起作用
【发布时间】:2014-02-15 18:43:18
【问题描述】:

我有以下代码:

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

事实证明我不能在 EasingColorKeyFrame 上使用 DynamicResource
我该怎么做才能达到我的效果?

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

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

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

【问题讨论】:

标签: .net wpf styles dynamicresource


【解决方案1】:

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

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

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

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

  • 最后,如果你想坚持通过动画做到这一点,你可以在code behind中实现。这些帖子可能对您有所帮助 - Woakaround for dynamicResource in AnimationAnimation in code behindSetting foreground with VSM

【讨论】:

  • 金色只是默认颜色,我希望它是动态设置的。我认为这排除了前两点。还在考虑第三个。
【解决方案2】:

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

【讨论】:

  • @iterationx:使用静态资源。
  • @Phil 我想在运行时更改颜色
  • 将EasingColorKeyFrame移到VSM外的资源,引用color为动态资源,引用ColorAnimationUsingKeyFrames中的EasingColorKeyFrame为静态资源。像这样的东西必须工作
  • @koshdim 如何移动 EasingColorKeyFrame? ColorAnimationUsingKeyFrames 没有 Value 属性,通常我会做一个 Value={StaticResource X}" ,但在这种情况下我不能这样做吗?
【解决方案3】:

我想出了一种使用图层的方法。制作对象的多个副本,然后像这样修改透明胶片:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2017-03-23
    相关资源
    最近更新 更多