2012-01-11 22 views
1

设计人员给了我一个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> 

谢谢!

+0

这是“按钮”里面的“网格”?如果没有,你必须像这样调用状态:VisualStateManager.GoToState(LayoutRoot,“VisualStateDetails”,false); – NestorArturo 2012-01-12 14:58:41

+0

我目前无法访问代码,但按钮位置在哪里?为了清楚起见,我想从代码转换到'VisualStateDetails'值,即在子窗口的'Initialize'方法中。我记得我尝试过使用'LayoutRoot'作为GoToState的第一个参数,但是我得到一个错误,说Grid不是一个Control。 – 2012-01-12 20:29:53

+0

是的...根据具有VisualStateManager的控件的按钮位置是重要的,如果它在内部或外部以控制语法更改。 – NestorArturo 2012-01-12 21:12:33

回答