设计人员给了我一个Silverlight子窗口,该窗口在Expression Blend中设计,并使用Visual State Manager在两种模式之间切换。简而言之,子窗口上有一个展开按钮,单击时可以向下滑动另一个具有详细信息的Grid控件。使用VisualStateManager从代码切换到可视状态
这种互动完全发生在XAML中。但是,我需要对其进行增强,以便在满足某些条件时(例如,如果用户选择某个选项,“始终显示展开详细信息”) - 打开子窗口时,展开的可视状态将生效。
我认为这是简单的调用:
VisualStateManager.GoToState(this, "VisualStateDetails", false);
但是,这是行不通的。我错过了什么? (我很抱歉,如果我忽略了一些明显的东西,我对Silverlight相对比较陌生,并且完全不熟悉Visual State Manager。)
这里是为简洁起见删除了一部分的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>
谢谢!
这是“按钮”里面的“网格”?如果没有,你必须像这样调用状态:VisualStateManager.GoToState(LayoutRoot,“VisualStateDetails”,false); – NestorArturo 2012-01-12 14:58:41
我目前无法访问代码,但按钮位置在哪里?为了清楚起见,我想从代码转换到'VisualStateDetails'值,即在子窗口的'Initialize'方法中。我记得我尝试过使用'LayoutRoot'作为GoToState的第一个参数,但是我得到一个错误,说Grid不是一个Control。 – 2012-01-12 20:29:53
是的...根据具有VisualStateManager的控件的按钮位置是重要的,如果它在内部或外部以控制语法更改。 – NestorArturo 2012-01-12 21:12:33