C# 使用VisualStateManager从代码切换到可视状态

C# 使用VisualStateManager从代码切换到可视状态,c#,silverlight-4.0,C#,Silverlight 4.0,一位设计师给了我一个Silverlight子窗口,它是在Expression Blend中设计的,并使用可视化状态管理器在两种模式之间切换。简言之,在子窗口上有一个展开按钮,单击该按钮时,会向下滑动另一个包含详细信息的网格控件 这种交互完全发生在XAML中。但是,我需要对其进行增强,以便在满足某些条件的情况下(例如,如果用户选择某个选项,“始终显示展开的详细信息”),打开子窗口时,展开的视觉状态将生效 我觉得这就像打电话一样简单: VisualStateManager.GoToState(thi

一位设计师给了我一个Silverlight子窗口,它是在Expression Blend中设计的,并使用可视化状态管理器在两种模式之间切换。简言之,在子窗口上有一个展开按钮,单击该按钮时,会向下滑动另一个包含详细信息的网格控件

这种交互完全发生在XAML中。但是,我需要对其进行增强,以便在满足某些条件的情况下(例如,如果用户选择某个选项,“始终显示展开的详细信息”),打开子窗口时,展开的视觉状态将生效

我觉得这就像打电话一样简单:

VisualStateManager.GoToState(this, "VisualStateDetails", false);
但这是行不通的。我错过了什么?(如果我忽略了一些显而易见的事情,我很抱歉,因为我对Silverlight比较陌生,对可视化状态管理器一点也不熟悉。)

以下是为简洁起见略去一点的XAML

<Grid x:Name="LayoutRoot" Margin="2" DataContext="{Binding ProjectNode, Mode=TwoWay}">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="EditorWindowStates">
            <VisualStateGroup.Transitions>
                <VisualTransition GeneratedDuration="0:0:0.5">
                    <VisualTransition.GeneratedEasingFunction>
                        <CubicEase EasingMode="EaseInOut"/>
                    </VisualTransition.GeneratedEasingFunction>
                </VisualTransition>
            </VisualStateGroup.Transitions>
            <VisualState x:Name="VisualStateNormal"/>
            <VisualState x:Name="VisualStateDetails">
                <Storyboard>
                    <!-- snip -->
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <VisualStateManager.CustomVisualStateManager>
        <ei:ExtendedVisualStateManager/>
    </VisualStateManager.CustomVisualStateManager>

    <!-- snip -->

这里有一个按钮,单击该按钮可展开详细信息:

<Button ...>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <ei:GoToStateAction StateName="VisualStateDetails"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>


谢谢

问题似乎是可视化状态管理器在子窗口中的表现不好

这篇博客文章描述了这个问题,并提供了两种解决方法。第一个(使用
ExtendedVisualStateManager
类)帮了我一把:


这个“按钮”在“网格”内吗?如果没有,则必须如下调用状态:VisualStateManager.GoToState(LayoutRoot,“VisualStateDetails”,false);我现在没有访问代码的权限,但是按钮在哪里重要吗?为了清楚起见,我想从code转换到
VisualStateDetails
值,即在子窗口的
Initialize
方法中。我记得我试着使用
LayoutRoot
作为
GoToState
的第一个参数,但是我得到一个错误,说网格不是控件。是的。。。根据具有VisualStateManager的控件确定按钮的位置很重要,如果按钮位于控件内部或外部,则语法会发生更改。