Как связать цвет в WPF ColorAnimation? - PullRequest
5 голосов
/ 08 июня 2010

Я хотел бы сделать что-то, что кажется довольно простым, но я не могу понять, как это сделать. У меня есть ColorAnimation, которая срабатывает, когда происходит событие MouseEnter. Он просто меняет цвет фона рамки с одного цвета на другой.

К сожалению, я не могу понять, как поместить что-либо, кроме жестко закодированных цветов, в эту ColorAnimation. Так это выглядит в настоящее время так:

<Style x:Key="MouseOverStyle">
<Style.Triggers>
    <EventTrigger RoutedEvent="Mouse.MouseEnter">
        <EventTrigger.Actions>
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
                                    To="Red" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger.Actions>
    </EventTrigger>
</Style.Triggers>
</Style>

Однако я бы хотел сделать что-то вроде этого:

<SolidColorBrush x:Key="MyEventColor" Color="{Binding EventColor}" />

<Style x:Key="MouseOverStyle">
<Style.Triggers>
    <EventTrigger RoutedEvent="Mouse.MouseEnter">
        <EventTrigger.Actions>
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
                                    To="{StaticResource MyEventColor}" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger.Actions>
    </EventTrigger>
</Style.Triggers>
</Style>

Или вот так:

<Style x:Key="MouseOverStyle">
<Style.Triggers>
    <EventTrigger RoutedEvent="Mouse.MouseEnter">
        <EventTrigger.Actions>
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
                                    To="{Binding EventColor}" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger.Actions>
    </EventTrigger>
</Style.Triggers>
</Style>

Когда я пытаюсь сделать что-то из этого, возникает исключение. Во-первых, он выдает исключение, которое говорит мне, что свойство «Color» не может принимать значение SolidColorBrush ... что имеет смысл ... но это, конечно, не помогает, потому что ColorAnimation не позволит мне анимировать свойство "(Border.Background). (SolidColorBrush)" ... это позволит мне только анимировать свойство "(Border.Background). (SolidColorBrush.Color)" ....

Исключение во втором примере в основном говорит мне, что оно "Не может заморозить это дерево шкалы времени раскадровки для использования в потоках" ... поэтому похоже, что ColorAnimation пытается выполнить эту привязку в каком-то другом потоке, кроме потока пользовательского интерфейса или что-то? Что бы он ни пытался сделать ... он не работает.

Как, черт возьми, я могу сделать такую ​​простую задачу?

1 Ответ

7 голосов
/ 08 июня 2010

Для первого вы можете использовать {StaticResource MyColor} с MyColor, определенным так:

<Color x:Key="MyColor">#FF00FF00</Color>

Однако это не решает вашу проблему: вы не можете привязать свойства анимации, поскольку эти свойства должны быть заморожены (неизменяемыми), чтобы анимация работала. Попробуйте изменить зависимость от привязки или воссоздайте раскадровку с правильным цветом из кода после изменения цвета.

...