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>
我目前正在为按钮实现自定义样式,并希望使用 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>