如何在ColorAnimation for Background属性中使用SolidColorBrush?

时间:2019-12-22 00:45:27

标签: wpf xaml

我对关注问题感到困惑。

我在XAML中定义了SolidColorBrush

<SolidColorBrush x:Key="BuildItemMouseOverBackground" Color="#617492"/>

我的风格是:

<Style x:Key="BuildItem" TargetType="{x:Type Border}" BasedOn="{StaticResource RoundBorder}">
    <Setter Property="Background" Value="{StaticResource BuildItemBackground}" />
    <Style.Triggers>
        <EventTrigger RoutedEvent="Mouse.MouseEnter">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation Storyboard.TargetProperty="Background" To="{StaticResource BuildItemMouseOverBackground}" Duration="0:0:0.5" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Style.Triggers>
</Style>

但是此代码引发异常:

ArgumentException: '#FF617492' is not a valid value for property 'To'.

如果我将To设置为Red#123456,则代码可以正常工作。所以我的结论是To期望颜色,而不是画笔。但这确实很奇怪,因为我查看了Border类,发现Background实际上是画笔。

Border Class

我试图通过这种方式更改ColorAnimation

<ColorAnimation Storyboard.TargetProperty="Background" To="{Binding Source={StaticResource BuildItemMouseOverBackground}, Path=Color}" Duration="0:0:0.5" />

但是看起来存在一些多线程问题,但出现异常

InvalidOperationException: Cannot freeze this Storyboard timeline tree for use across threads.

所以我的问题是:在SolidColorBrush中使用ColorAnimation的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

<Setter Property="Background" Value="{StaticResource BuildItemBackground}" />

在上面的代码中,BackGround属性可以接收SolidColorBrush类型。 因此,如果BuildItemBackground类型为SolidColorBrush,则如下所示。

<SolidColorBrush x:Key="BuildItemBackground" Color="#3e3e42" />

但是下面的代码无法接收SolidColorBrush类型。

<ColorAnimation Storyboard.TargetProperty="Background" To="{StaticResource BuildItemMouseOverBackground}" Duration="0:0:0.5" />

因此,如果您声明为'SolidColorBrush',则如下所示。编译器将显示错误。

<SolidColorBrush x:Key="BuildItemMouseOverBackground" Color="#3e3e42" />

在“动画”之类的代码中,您必须使用“颜色”类型。因此,如果您将BuildItemMouseOverBackground的定义更改为如下所示的Color,那么它将很好用。

<Color x:Key="BuildItemMouseOverBackground">#3e3e42</Color>

同样,如果您使用BackGround或BorderBrush属性支持以下动画,则必须使用“颜色”类型而不是“ SolidColorBrush”类型。

<Border.BorderBrush>
    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
        <LinearGradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="{DynamicResource BorderMediumColor}" Offset="0.0" />
                <GradientStop Color="{DynamicResource BorderDarkColor}" Offset="1.0" />
            </GradientStopCollection>
        </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
</Border.BorderBrush>

在上面的代码中,BorderMediumColor和BorderDarkColor必须为“颜色”类型。 如果为'SolidColorBrush'类型,则编译器将显示错误。

如果您使用如下所示的BackGroud或BorderBrush属性。(现在为例)颜色类型必须为'SolidColorBrush'

<Setter Property="Background" Value="{StaticResource BuildItemBackground}" />

因此,要解决此问题,请首先将BuildItemMouseOverBackground类型更改为Color,如下所示。

<Color x:Key="BuildItemMouseOverBackground">#3e3e42</Color>

第二,如下更改ColorAnimation代码。

<ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" To="{StaticResource BuildItemMouseOverBackground}" Duration="0:0:0.5" />

它会很好地工作。

希望这些信息对您有所帮助。

答案 1 :(得分:0)

因为To属性是Color对象,而BuildItemMouseOverBackgroundSolidColorBrush

您应创建一个转换器,以将SolidColorBrush转换为Color类型。

public class SolidColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (targetType != typeof(Color))
            throw new InvalidOperationException("The target must be a Color");

        return ((SolidColorBrush) value)?.Color ?? new Color();
    }

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

并像这样使用:

<converters:SolidColorConverter x:Key="ToColor"/>

<ColorAnimation Storyboard.TargetProperty="Background" To="{Binding Source={StaticResource BuildItemMouseOverBackground,Converter={StaticResource ToColor}}, Path=Color}" Duration="0:0:0.5" />
相关问题