Windows 8 在Windows应用商店应用程序中的代码隐藏中转到网格内的可视状态

Windows 8 在Windows应用商店应用程序中的代码隐藏中转到网格内的可视状态,windows-8,windows-runtime,windows-store-apps,winrt-xaml,windows-8.1,Windows 8,Windows Runtime,Windows Store Apps,Winrt Xaml,Windows 8.1,我的xaml代码如下所示- <Grid x:Name="LayoutRoot"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualStateManager.CustomVisualStateManager> <common:ExtendedVisualStateManager />

我的xaml代码如下所示-

<Grid x:Name="LayoutRoot">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="CommonStates">
<VisualStateManager.CustomVisualStateManager>
    <common:ExtendedVisualStateManager />
</VisualStateManager.CustomVisualStateManager>
<VisualStateManager.VisualStateGroups>
    <VisualStateGroup .../>
</VisualStateManager.VisualStateGroups>
但它总是返回
null


有什么解决方法吗?

通常,我的控件中有一个
UpdateVisualState(bool-usetransforts)
方法,用于执行所有
GoToVisualState()
调用。如果某些东西无法设置动画,我会看到两个选项:

  • 在我的
    UpdateVisualState()方法中更改代码隐藏。此解决方案的缺点是,Blend不会在可视状态编辑器中显示更改。我个人并不在意,因为我很少在已经集成的设计上使用Blend,而且这个解决方案很简单
  • 创建一个(n个附加的)属性或行为,以进行预期的更改,并从视觉状态
    情节提要中设置该属性的动画。这是一个多一点的工作,但可以在您的项目中保持混合支持
  • 我刚想出来

    首先创建一个helper类,就像我们在Silverlight或Windows Phone中使用它一样(我从中获取了这段代码,并对其进行了一点修改,这样当一个元素没有附加任何可视状态组时,它会自动搜索其父级,直到找到为止)

    然后您需要手动将xaml更新为如下内容-

    <Grid x:Name="LayoutRoot">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
    
    <VisualStateManager.CustomVisualStateManager>
        <common:ExtendedVisualStateManager />
    </VisualStateManager.CustomVisualStateManager>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup .../>
    </VisualStateManager.VisualStateGroups>
    
    
    

    我想这个解决方案的好处在于,您仍然可以在Blend的状态选项卡中看到视觉状态,对于Blend爱好者来说,这很酷。

    如果包含视觉状态的元素是
    控件的类型,则第一种方法可以工作;如果它是
    网格
    或不是从
    控件继承的东西
    ,则需要使用
    ExtendedVisualStateManager
    或类似工具。第二种方法可行,但会丢失视觉状态之间的所有转换。实际上,如果使用这两种方法中的任何一种-基本上是在编写代码,因此可以在其中执行任何操作-运行故事板动画、每帧动画,甚至为不可设置动画的属性设置动画,如
    Grid.ColumnDefinitions
    等。是的,任何事情都可以通过代码来完成,但在这种情况下,这两种解决方案并不理想,因为您最终会编写大量额外的代码,这些代码可以在VisualStatesManager中自动生成。例如,您永远不需要编写故事板,就可以从特定状态返回到正常状态
    VisualStateManager
    为您做到了这一点。我并没有说不要使用VSM,我的意思是您可以同时使用这两者,尽管
    CustomVisualStateManager
    听起来确实是最好的解决方案。这在WinRT上对我不起作用。我复制了扩展的vsm,并根据答案更新了XAML。但是,没有更新发生。具体来说,我使用的是网格控件。我使用以下调用:ExtendedVisualStateManager.GoToElementState(网格,“InitializedState”,useTransforms:true);