UserControl动画按钮的背景

C4p*_*1nZ 12 c# wpf animation user-controls dependency-properties

我想一个动画ButtonBackground鼠标是否过Button.

ButtonBackground必然,我在代码中创建的背后,一个自定义的依赖项属性我UserControl

... Background="{Binding BGColor, Elementname="QButton"}"
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用按钮的背景动画

<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>
Run Code Online (Sandbox Code Playgroud)

我得到一个例外,说:

无法为不可变属性(或类似属性)设置动画.

我该如何解决这个问题?

Sal*_*ari 3

基于Mike Hillberg的关于无法在不可变对象实例上对“...”进行动画处理的精彩文章:

\n\n
\n

作为解决方法,您可以更新绑定来为\n 制作画笔的副本 Button。这不会干扰绑定 \xe2\x80\x93 对窗口\xe2\x80\x99s 前景的任何更改仍将传播到Button\xe2\x80\x93,但 \n Button将制作自己的副本对于本地动画。

\n
\n\n

所以你的完整解决方案应该是这样的:

\n\n
<Window x:Class="WpfApplication2.Window3"\n    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\n    xmlns:local="clr-namespace:WpfApplication1"\n    ....\n    ....\n\nBackground="{Binding BGColor, Converter={x:Static local:MyCloneConverter.Instance}}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

它引用了一个IValueConverter绑定,如下所示:

\n\n
class MyCloneConverter : IValueConverter\n{\n    public static MyCloneConverter Instance = new MyCloneConverter();\n\n    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n    {\n        if (value is Freezable)\n        {\n            value = (value as Freezable).Clone();\n        }\n        return value;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n    {\n        throw new NotSupportedException();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n