我有一个 UserControl,其中包含一个带有自定义 ItemsPanel 的 ItemsControl,具有一个名为“MaxColumns”的依赖项属性。我想定义一个 VisualState(在 UserControl 级别),它可以为自定义面板上的“MaxColumns”属性设置动画。
本质上,XAML 类似于:
<Grid x:Name="LayoutRoot">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="MyCoolState">
<VisualState x:Name="Normal" />
<VisualState x:Name="NotNormal">
<Storyboard>
<Int32Animation Duration="0"
Storyboard.TargetName="Details"
Storyboard.TargetProperty="(ItemsControl.ItemsPanel).(local:CoolPanel.MaxColumns)"
To="4" />
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateManager>
<ItemsControl x:Name="Details">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:CoolPanel x:Name="MyCoolPanel"
MaxColumns="1" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
但是,我一生都无法弄清楚动画的正确语法是什么?如果我使用上面显示的语法,则会收到错误消息:“'ItemsPanel' 属性未指向路径 '(0).(1)' 中的 DependencyObject”。我假设这是因为它在技术上指向 ItemsPanelTemplate?
如果我直接在 Storyboard.TargetName 属性中引用“MyCoolPanel”,则会收到有关名称范围的错误(可能是因为“MyCoolPanel”不在 LayoutRoot 的名称范围内)。我不知道是否有办法限定“TargetName”中的名称范围?
有人对此有解决方案吗?在不诉诸自定义附加属性的情况下,这似乎是可行的?我的意思是,我不反对附加属性,但我觉得您应该能够直接在 XAML 中执行此操作?