我目前正在为按钮实现自定义样式,并希望使用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>
正如您所看到的,我想在按下状态时将网格的背景属性更改为红色,但抛出以下异常:
gymlog.exe中0x7708210B(KERNELBASE.DLL)的第一次机会异常:0x40080201:WinRT发起错误(参数:0x800F1000,0x00000056,0x0178E4F4)。
如果我跳转到特定的内存地址,则会显示以下内容:
由于类型不兼容
,ColorAnimation无法用于动画属性背景
如何解决这个问题?
答案 0 :(得分:0)
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>