Подтвердить что ты не робот

Фон кнопки Анимировать UserControl

Я хотел бы оживить Button Background, если мышь находится над Button.

Button Background привязан к пользовательскому свойству зависимости, которое я создал в коде позади моего UserControl

... Background="{Binding BGColor, Elementname="QButton"}"

Теперь, если я пытаюсь анимировать фон Button, используя

<Trigger Property="IsMouseOver" Value="True">
    <Trigger.EnterActions>
        <BeginStoryboard>
            <Storyboard>
                <ColorAnimation To="LightBlue"
                                Duration="0:0:2"
                                Storyboard.TargetProperty="Background.Color"/>
            </Storyboard>
        </BeginStoryboard>
    </Trigger.EnterActions>
</Trigger>

Я получаю исключение, которое говорит:

не может анимировать неизменяемое свойство (или подобное).

Как решить эту проблему?

4b9b3361

Ответ 1

Основываясь на Майке Хиллберге, хорошая статья о Невозможно оживить "..." в экземпляре неизменяемого объекта:

В качестве обходного пути вы можете обновить привязку, чтобы сделать копию кисти для Button. Это не мешает привязке - любое изменение windows foreground будет по-прежнему распространяться на Button, но Button создаст собственную копию для локальной анимации.

Итак, полное решение для вас должно быть таким:

<Window x:Class="WpfApplication2.Window3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="clr-namespace:WpfApplication1"
    ....
    ....

Background="{Binding BGColor, Converter={x:Static local:MyCloneConverter.Instance}}"

Что ссылается на IValueConverter для привязки, которая выглядит так:

class MyCloneConverter : IValueConverter
{
    public static MyCloneConverter Instance = new MyCloneConverter();

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is Freezable)
        {
            value = (value as Freezable).Clone();
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Ответ 2

Измените сам DP (BGColor), чтобы изменить фон.

<Button.Triggers>
    <EventTrigger RoutedEvent="MouseEnter">
        <BeginStoryboard>
            <Storyboard>
                <ColorAnimation To="Red" 
                        Duration="0:0:2" 
                        Storyboard.TargetName="QButton"
                        Storyboard.TargetProperty="(BGColor).(SolidColorBrush.Color)"/>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Button.Triggers>