我对关注问题感到困惑。
我在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
实际上是画笔。
我试图通过这种方式更改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
的正确方法是什么?
答案 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
对象,而BuildItemMouseOverBackground
是SolidColorBrush
。
您应创建一个转换器,以将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" />