试图动画一的SolidColorBrush静态资源(Trying to animate a Soli

2019-09-21 02:40发布

我想什么

我想重复使用多个一些风格UserControl的类型。

我想一些背景Border控制闪烁,我想他们都使用相同的样式,静态资源和动画,让他们都在同步闪光。


我怎样,我试图做到这一点

为此,我在一个资源字典中定义了一些常见的颜色,就像这样:

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

...我也这个字典中定义的故事板,就像这样:

<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 S中的的孩子,我重新导入ResourceDictionary的上方,然后使用{StaticResource StatusErrorBackground}Background

有问题的元素是红色(如SolidColorBrush声明), 但他们不闪烁


模糊认识迄今

也许这样做并不会提高对有问题的内容适当的PropertyChanged通知,因此他们没有重绘? 或类似的东西。 在Color上财产SolidColorBrush不是依赖属性,但SolidColorBrush实现IAnimatable ,所以很明显有神奇的事情发生在幕后这里后面我不明白。

或者它是因为我导入相同的资源字典在两个不同的地方(曾经在我的顶级UserControl加上曾经在我的孩子),我结束了两个独立的StaticResource引用? 如果导入相同ResourceDictionary文件在两个不同的控件,它为每个独立的资源? 在这种情况下,我也许可以通过在应用程序层面拉来解决这个问题,我想...

谁能告诉我什么,我做错了,我怎么可能去修复它?

Answer 1:

我真的不能说为什么,但如果添加一个虚拟对象,例如使用的SolidColorBrush其一个Rectangle它的工作原理Fill属性,然后设置动画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>


Answer 2:

我知道我迟到了这里,但我发现这个问题,当我试图动画,并从以实画笔颜色举行。 刷子是其他人正在使用的资源字典的一部分,我不想改变。 我刚做这个,很快尝试,它似乎工作。

public class SolidColorAnimation : ColorAnimation
{
    public SolidColorBrush ToBrush
    {
        get { return To == null ? null : new SolidColorBrush(To.Value); }
        set { To = value?.Color; }
    }
}

而在这样的XAML中使用它:

        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard >
                        <ui:SolidColorAnimation Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" ToBrush="{StaticResource NavButtonRolloverBrush}" Duration="0:0:0.75"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard >
                        <ui:SolidColorAnimation Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" ToBrush="{StaticResource NavButtonBrush}" Duration="0:0:0.25"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.ExitActions>
        </Trigger>


文章来源: Trying to animate a SolidColorBrush static resource