Попытка анимировать статический ресурс SolidColorBrush

что бы я хотел

Я хочу повторно использовать некоторые стили для нескольких типов 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 в два разных элемента управления, создаются ли для каждого из них независимые ресурсы? В этом случае я мог бы исправить это, потянув его на уровне приложения, я думаю...

Может ли кто-нибудь сказать мне, что я делаю неправильно и как я могу это исправить?


person Alastair Maw    schedule 10.08.2012    source источник


Ответы (3)


Я не могу сказать, почему, но это работает, если вы добавите фиктивный объект, например. Rectangle, который использует SolidColorBrush для свойства 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>
person Clemens    schedule 10.08.2012
comment
Ваш работает, потому что вы анимируете прямоугольник как Storyboard.Target. У него есть несколько целей, и он хочет их оживить. - person Trevor Elliott; 11.08.2012
comment
Я попробую, спасибо. Чтобы ответить на некоторые из моих собственных вопросов, я определенно получаю две независимые ссылки на StaticResource, когда я делаю это из разных пользовательских элементов управления (что, я думаю, имеет смысл), поэтому мне все равно сначала нужно вытащить это в ресурс верхнего уровня. Даст вам знать, как это происходит. - person Alastair Maw; 13.08.2012
comment
Это работает для меня. Я не знаю почему. Раздражает, что анимация кисти напрямую не работает. - person Jack Ukleja; 20.03.2015
comment
Имейте в виду: это не сработает, если вы установите цвет кисти с помощью преобразователя типа XAML, например. ‹SolidColorBrush x:Key=StatusErrorBackground ›Желтый‹/SolidColorBrush› - person Jack Ukleja; 23.03.2015

Я знаю, что опаздываю, но я нашел этот вопрос, когда пытался анимировать цвета, которые содержатся в сплошных кистях. Кисти являются частью словаря ресурсов, который используют другие люди, и я не хочу его менять. Я только что сделал это, очень быстро, чтобы опробовать, и, похоже, это сработало.

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>
person F5 F5 F5    schedule 05.10.2015

просто используйте

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

вместо

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

это подходит для меня

person undø _    schedule 13.12.2020