locked
FAQ: 什么是 Visual State Manager?我们如何用代码使用 VSM 去控制 VisualState? RRS feed

  • 问题

  • 为了帮助大家更好地学习 WPF 技术,微软论坛技术支持团队编辑了一些列的 "WPF 常见问题及解答" 精华帖。

    本帖的主题是:什么是 Visual State Manager?我们如何用代码使用 VSM 去控制 VisualState?

    如果您觉得这个帖子对您的学习、工作有所帮助,请再把这个帖子分享给你的同学、同事和朋友。

    如果您想阅读更多的 "WPF 常见问题及解答",请打开索引页面:

    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年1月26日 13:57

答案

  • VisualStateManager 控制控件的状态(states) 逻辑之间的转化. 同时, VisualStateManager 也使用户可以根据不同的states为控件指定不同的外观. 例如, 一个Button在按下的states和没有被按下的时候可以有不同的外观。这样,你就可以为Button指定2states,一个是(“按下”),另一个是(“正常”).我们可以通过 VisualState去控制一个特性states下的控件外观. 一个 VisualState 中包含 Storyboard对象的集合,这些集合可以指定当一个空间在某一状态下的外观. 我们可以为一个控件添加visual states 通过设置控件的附加属性,这个属性是: VisualStateManager.VisualStateGroups. 每一个 VisualStateGroup 包含 自己特有的VisualState对象的集合。这就说明在某一 VisualStateGroup中的states,总是会显示正常的.


    在下面的例子中, 我们可以通过 VisualStateManager.GoToElementState VisualStateManager.GoToState 在两个不同的states中进行转化, 并且通过 GetVisualStateGroups 去得到 VisualStateManager.VisualStateGroups 附加属性. 在下面的示例中, 两个Buttons 能够在“Normal”和“Waning”两个状态中进行转换:

    XAML:

    <StackPanel>

     <Ellipse Name="ellipse" Width="100" Height="100" Fill="Green">

      <VisualStateManager.VisualStateGroups>

       <VisualStateGroup Name="CommonStates">

        <VisualState Name="Normal"/>

        <VisualState Name="Warning">

         <Storyboard>

          <ColorAnimation To="Red" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="Fill.Color"/>

         </Storyboard>

        </VisualState>

        <VisualStateGroup.Transitions>

         <VisualTransition To="Normal" GeneratedDuration="00:00:01"/>

         <VisualTransition To="MouseOver" GeneratedDuration="00:00:01"/>

        </VisualStateGroup.Transitions>

       </VisualStateGroup>

      </VisualStateManager.VisualStateGroups>

     </Ellipse>

     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">

      <Button Name="buttonNormal" Content="Normal" Click="Normal_Click" Margin="2"/>

      <Button Name="buttonWarning" Content="Warning" Click="Warning_Click" Margin="2"/>

     </StackPanel>

    </StackPanel>

    C#代码:

    private void Normal_Click(object sender, RoutedEventArgs e)

    {

      VisualStateManager.GoToElementState(ellipse, "Normal", true);

    }

     

    private void Warning_Click(object sender, RoutedEventArgs e)

    {

      VisualStateManager.GoToElementState(ellipse, "Warning", true);


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年1月26日 13:58