3

我想要什么

我想在多种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作为其子级的 s 中,我重新导入ResourceDictionary上述内容并使用{StaticResource StatusErrorBackground}for a Background

有问题的元素是红色的(如SolidColorBrush声明中所示),但它们没有闪烁.


到目前为止的模糊理解

也许这样做不会针对相关元素引发适当的 PropertyChanged 通知,因此它们不会被重绘?或类似的东西。Coloron 属性SolidColorBrush不是依赖属性,而是SolidColorBrushimplements ,所以我不明白这里IAnimatable显然在幕后发生了魔法。

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

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

4

3 回答 3

7

我知道我在这里迟到了,但是当我尝试在实心画笔中保存的颜色进行动画处理时,我发现了这个问题。画笔是其他人正在使用的资源字典的一部分,我不想更改。我刚做了这个,很快就尝试了,它似乎奏效了。

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>
于 2015-10-05T12:38:28.433 回答
1

我真的不能说为什么,但如果你添加一个虚拟对象,例如一个使用 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>
于 2012-08-10T18:06:06.060 回答
0

只需使用

<Color x:Key="name" A="0" R="255" G="255" B="255"/>

而不是

<SolidColorBrush x:Key="name" Color="#0fff"/>

这对我行得通

于 2020-12-13T18:52:22.727 回答