XAML 使用DynamicResource时,使用相同SolidColorBrush的所有元素都在执行动画

v6ylcynt  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(110)

我在使用ColorAnimationUsingKeyFrames时遇到问题。简单地说:
在Colors. xaml中:

<Color x:Key="Color_Main">#ff0000</Color>
<SolidColorBrush x:Key="Brush_Main" Color="{DynamicResource Color_Main}" />

在styles.xaml中:

<VisualState x:Name="State_Highlighted">
      <Storyboard>
        <ColorAnimationUsingKeyFrames Storyboard.TargetName="TextTitle" Storyboard.TargetProperty="Foreground.Color">
          <EasingColorKeyFrame KeyTime="0" Value="{StaticResource Color_White}" />
        </ColorAnimationUsingKeyFrames>
      </Storyboard>
</VisualState>

我有多个使用Brush_Main笔刷和相同动画的按钮。
我使用的是:

<SolidColorBrush x:Key="Brush_Main" Color="{StaticResouce Color_Main}" />

而不是:

<SolidColorBrush x:Key="Brush_Main" Color="{DynamicResource Color_Main}" />

一切都很正常,但是我不得不切换到DynamicResource,因为我在某个时候编辑了代码后面的颜色。
我的问题是,现在,每当我悬停在我的按钮中的任何一个按钮上,所有的按钮都会做动画。
有什么解决办法吗?我已经在网上查了好几天了。
先谢谢你。

tjjdgumg

tjjdgumg1#

解释很长,所以我不是作为评论,而是作为回答。
SolidColorBrush是Freezable类。在资源中创建Freezable示例时,WPF倾向于冻结该示例。当具有冻结Freezable值的属性被动画显示时,动画首先创建该示例的未冻结副本。由于是副本而不是示例本身被动画显示,因此这不会影响使用同一示例的其他属性。
当您将Freezable属性设置为Binding或DynamicResource时,您声明了该示例的属性可以在运行时更改。如果Freezable属性可以更改,则WPF不会冻结它,因为这将违反更改逻辑。
因此,动画属性将与一个未冻结的Freezable示例相关联。由于它未被冻结,动画将不会创建它的副本,但将动画化与其他元素的属性相关联的原始示例。

相关问题