运行时Storyboard抛出异常:TransformCollection实例不可变问题
问题分析与解决方案
异常原因
TransformGroup.Children默认是不可变的只读集合,WPF运行时不允许通过索引路径(如(TransformGroup.Children)[3])直接修改集合内元素的属性。Blend设计环境做了兼容性处理,因此在Blend中运行正常,但实际Runtime会触发不可变实例的异常。
解决方案:给Transform命名,直接绑定属性
最简洁可靠的修复方式是给TransformGroup内需要动画的具体Transform命名,直接绑定到它们的属性,而非通过集合索引访问。
步骤1:修改Border的RenderTransform部分
给ScaleTransform和TranslateTransform添加x:Name:
<Border x:Name="Placeholder" RenderTransformOrigin="0.5,0.5" Style="{StaticResource NavPlaceholderStyle}"> <Border.RenderTransform> <TransformGroup> <ScaleTransform x:Name="PlaceholderScaleTransform"/> <SkewTransform/> <RotateTransform/> <TranslateTransform x:Name="PlaceholderTranslateTransform"/> </TransformGroup> </Border.RenderTransform> </Border>
步骤2:修改Storyboard的TargetProperty
直接指向命名Transform的属性,移除集合索引路径:
<Window.Resources> <Storyboard x:Key="Storyboard1"> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="PlaceholderTranslateTransform" Storyboard.TargetProperty="Y"> <EasingDoubleKeyFrame KeyTime="00:00:00" Value="90"/> <EasingDoubleKeyFrame KeyTime="00:00:00.3000000" Value="100"/> <EasingDoubleKeyFrame KeyTime="00:00:00.6000000" Value="200"/> </DoubleAnimationUsingKeyFrames> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="PlaceholderScaleTransform" Storyboard.TargetProperty="ScaleY"> <EasingDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1"/> <EasingDoubleKeyFrame KeyTime="00:00:00.5000000" Value="2"/> <EasingDoubleKeyFrame KeyTime="00:00:00.6000000" Value="1"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </Window.Resources>
验证修改
保持后台代码不变:
Storyboard storyboard = (Storyboard)FindResource("Storyboard1"); storyboard.Begin();
修改后Runtime即可正常运行动画,不会再抛出异常。
内容的提问来源于stack exchange,提问作者NewCode82
相关产品推荐
相关产品推荐

