WPF VisualStateManager动画绑定

WPF VisualStateManager动画绑定,wpf,binding,visualstatemanager,Wpf,Binding,Visualstatemanager,我正在Button.Trigger中使用一个简单的双动画。来自的动画绑定到根元素实际高度。这正如预期的那样有效 接下来,我尝试将故事板移动到VisualStateManager。现在WPF抱怨: System.Windows.Data错误:2:找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:Path=ActualWidth;DataItem=null;目标元素为“DoubleAnimation”(HashC

我正在Button.Trigger中使用一个简单的双动画。来自的动画绑定到根元素实际高度。这正如预期的那样有效

接下来,我尝试将故事板移动到VisualStateManager。现在WPF抱怨:

System.Windows.Data错误:2:找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:Path=ActualWidth;DataItem=null;目标元素为“DoubleAnimation”(HashCode=29201322);目标属性为“To”(类型为“Nullable`1”)

无法在VisualStateManager.VisualStateGroups/VisualState中的动画中使用绑定吗

似乎不是。我通过将情节提要移动到参考资料中解决了这个问题。所以现在GameToTitle将起作用,而TitleToGame将失败

我仍然很想知道这是否是预期的

相关XAML:

<Grid x:Name="MainInterface">
    <Grid.Resources>
        <Storyboard x:Key="GameToTitle">
            <DoubleAnimation Storyboard.TargetName="GameScreenInterface" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="0" To="{Binding Path=ActualHeight, ElementName=MainInterface}" Duration="0:0:0.2"/>
            <DoubleAnimation Storyboard.TargetName="TitleScreenInterface" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="{Binding Path=ActualHeight, ElementName=MainInterface, Converter={Converters:InverseConverter}}" To="0" Duration="0:0:0.2"/>
        </Storyboard>
    </Grid.Resources>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="TitleScreenState" Storyboard="{StaticResource ResourceKey=GameToTitle}"/>
            <VisualState x:Name="GameScreenState">
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="GameScreenInterface" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="{Binding Path=ActualHeight, ElementName=MainInterface}" To="0" Duration="0:0:0.2"/>
                        <DoubleAnimation Storyboard.TargetName="TitleScreenInterface" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="0" To="{Binding Path=ActualHeight, ElementName=MainInterface, Converter={Converters:InverseConverter}}" Duration="0:0:0.2"/>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <View:TitleScreen x:Name="TitleScreenInterface"/>
    <View:GameScreen x:Name="GameScreenInterface" />
</Grid>

正如问题的注释所述,包含绑定的故事板必须声明为资源,而不是在VisualStateGroup中内联,绑定才能工作。这是因为VisualStates不是VisualTree的一部分。另一方面,资源是有限的

您可以使用Snoop(或类似的实用程序)查看应用程序的可视化树,从而自己将其可视化。您会注意到,资源节点出现在Snoop中的可视化树中,但VisualState没有


是的,您应该提供一些XAML。谢谢,但是问题现在已经解决了。我把情节提要移到了参考资料中。不确定内联故事板失败的原因。(忽略转换器的内容-它只是将值乘以-1得到负值)内联情节提要失败,因为VisualState不是逻辑树的一部分,因此任何对逻辑树的依赖(例如绑定)都将失败。事实上,我很惊讶它能在将故事板转移到本地资源时起作用。我不知道为什么,但我要了@KentBoogaart-我实际上测试了这种方法,但它似乎不起作用。它确实调用了转换器,但似乎没有设置属性。我不知道为什么它对戈兰有效。那些绑定应该有效吗?或者它仅仅是一个可以建造的东西?基本上,这就是创建需要在WPF上绑定的动画的方法吗?