我有一个附加的行为,它有一个 type 的附加属性StoryBoard
。我想在 ListView 中的每个项目上设置此属性。XAML 看起来像这样:
<Grid>
<Grid.Resources>
<Storyboard x:Key="TheAnimation" x:Shared="False">
<DoubleAnimation From="0.0" To="1.0" Duration="0:0:0.20"
Storyboard.TargetProperty="Opacity" />
</Storyboard>
</Grid.Resources>
<ListView>
<ListView.Resources>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="local:MyBehavior.Animation"
Value="{StaticResource TheAnimation}" />
</Style>
</ListView.Resources>
</ListView>
</Grid>
到目前为止,一切都很好。然后“MyBehavior”中的代码尝试执行此操作:
private static void AnimationChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var listViewItem = d as ListViewItem;
if (d == null)
return;
var sb = e.NewValue as Storyboard;
if (sb == null)
return;
Storyboard.SetTarget(sb, listViewItem);
sb.Begin();
}
但是InvalidOperationException
在调用时会抛出一个StoryBoard.SetTarget()
:“无法在对象'System.Windows.Media.Animation.Storyboard'上设置属性,因为它处于只读状态。” 如果我Storyboard
在调试器中检查 ,我可以看到它IsSealed
和IsFrozen
属性都设置为true
.
相比之下,如果我MyBehavior.Animation
直接设置在 上,ListView
这样我就不需要使用 a Style
,StoryBoard
到达时未密封,我可以设置目标并成功运行它。但这不是我想要的。
为什么我StoryBoard
被封印了,我能做些什么来防止这种情况发生吗?
更新:我可以通过在空检查之后添加这个来解决我的问题:
if(sb.IsSealed)
sb = sb.Clone();
但我仍然很好奇发生了什么。显然某处(Style
??Setter
)正在冻结/密封对象Setter.Value
。