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