我想要什么

我想在多个UserControl类型中重用某些样式。

我希望一些Border控件的背景闪烁,并且我希望它们都使用相同的样式,静态资源和动画,以便它们都同步闪烁。

我如何尝试做到这一点

为此,我在资源字典中定义了一些常见的颜色,如下所示:

<SolidColorBrush x:Key="StatusErrorBackground" Color="#440000" />

...而且我还在此字典中定义了一个StoryBoard,如下所示:
<Storyboard x:Key="BackgroundAnimation">
    <ColorAnimation
        Storyboard.Target="{StaticResource StatusErrorBackground}"
        Storyboard.TargetProperty="Color"
        From="#440000"
        To="#ff0000"
        Duration="0:0:1"
        RepeatBehavior="Forever"
        AutoReverse="True"/>
</Storyboard>

然后,我将以下内容添加到顶级UserControl中:
<FrameworkElement.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="CommonResources.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</FrameworkElement.Resources>

<FrameworkElement.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard Storyboard="{StaticResource BackgroundAnimation}"/>
    </EventTrigger>
</FrameworkElement.Triggers>

...然后在作为其子级的其他各种UserControl中,如上所述重新导入ResourceDictionary,并将{StaticResource StatusErrorBackground}用作Background

有问题的元素显示为红色(如SolidColorBrush声明中所示),但没有闪烁。

到目前为止的模糊理解

也许这样做不会在有问题的元素上引发适当的PropertyChanged通知,因此它们不会重绘吗?或类似的东西。 Color上的SolidColorBrush属性不是依赖项属性,但是SolidColorBrush实现IAnimatable,因此在幕后显然有魔术发生在我不明白的地方。

还是因为在两个不同的地方(一次在我的顶层UserControl中加上一个在我的孩子中一次)导入相同的资源字典,我最终得到了两个独立的StaticResource引用?如果在两个不同的控件中导入相同的ResourceDictionary文件,它是否为每个控件创建独立的资源?我想在这种情况下,我可以通过在应用程序级别将其拉入来解决此问题。

谁能告诉我我做错了什么以及如何解决?

最佳答案

我真的不能说为什么,但是如果您添加一个虚拟对象,例如使用SolidColorBrush的Fill属性的Rectangle,然后对该Fill进行动画处理。现在,SolidColorBrush的颜色已设置为动画。

<SolidColorBrush x:Key="StatusErrorBackground" Color="#440000" />
<Rectangle x:Key="StatusErrorBackgroundRectangle" Fill="{StaticResource StatusErrorBackground}"/>

<Storyboard x:Key="BackgroundAnimation">
    <ColorAnimation
        Storyboard.Target="{DynamicResource StatusErrorBackgroundRectangle}"
        Storyboard.TargetProperty="Fill.(SolidColorBrush.Color)"
        ... />
</Storyboard>

10-05 18:37