VisualStateManager 抛出异常

VisualStateManager thrown exception

我目前正在为按钮实现自定义样式,并希望使用 VisualStateManager 定义不同的状态(例如,按下)。

<Style x:Name="customStyle" TargetType="Button">
<Setter Property="ClickMode" Value="Release"/>
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="Button">
            <Grid x:Name="RootElement" Background="{TemplateBinding Background}">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                        <VisualState x:Name="Normal"/>
                        <VisualState x:Name="Pressed">
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="RootElement"
                                                Storyboard.TargetProperty="Background"
                                                To="Red"
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                ...
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

如您所见,我想在按下状态下将网格的背景 属性 更改为红色,但抛出了以下异常:

First-chance exception at 0x7708210B (KERNELBASE.DLL) in gymlog.exe: 0x40080201: WinRT originate error (parameters: 0x800F1000, 0x00000056, 0x0178E4F4).

如果我跳转到特定的内存地址,则会显示以下内容:

ColorAnimation cannot be used to animate property Background due to incompatible type

如何解决?

Background 属性 不是颜色。它是一个画笔,因此您不能使用 ColorAnimation 为它设置动画。画笔可以使用 ObjectAnimationUsingKeyFrames 设置动画。但首先你必须用目标颜色创建一个新画笔(在你的例子中它是红色的)。

您可以将 SolidColorBrush 添加到与您的风格相同的资源中:

<SolidColorBrush x:Name="RedBrush" Color="Red" />

<!-- And here goes your button style... -->

然后就可以在物体动画中使用了。

<VisualState x:Name="Pressed">
    <Storyboard>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootElement"
                                       Storyboard.TargetProperty="Background">
            <DiscreteObjectKeyFrame KeyTime="0" 
                                    Value="{StaticResource RedBrush}"/>
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
</VisualState>