代码之家  ›  专栏  ›  技术社区  ›  Akash Kava

如何使用VisualStateManager返回“基本”状态?

  •  16
  • Akash Kava  · 技术社区  · 16 年前

    我知道我们可以用

    VisualStateManager.GoToState(this,"SomeState1",true);
    

    进入somestate1,但是现在如何回到基本状态,就像没有状态一样,控件加载的状态。

    VisualStateManager.GoToState(this,"base",true); 
    
    // OR
    
    VisualStateManager.GoToState(this,"",true);
    
    // OR
    
    VisualStateManager.GoToState(this,null,true);
    

    问题是,如果没有这样的方法返回到初始状态或基本状态,那么我必须始终创建第一个状态,并在控制器中转到控制开始时的第一个状态。

    我没有找到任何文档,所以我尝试了所有的组合,但没有找到任何有效的组合。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Steven Robbins    16 年前

    默认控件在CommonStates组中定义了一个“正常”的可视状态,该状态将恢复为On MouseOut等。我认为对于我假定的自定义控件,您需要遵循相同的模式吗?

        2
  •  20
  •   Jack Ukleja    16 年前

    正常!=基地。

    Base只是应用任何可视状态之前(即,在VSM处于活动状态之前)控件的初始状态。

    如果你阅读这篇文章 Expression blog 我在这里举了一个很好的描述:

    …当你创作自己的模板 控件或用户控件,您应该 在每个状态中定义一个默认状态 组。 把控制权交给那些人 _默认_秷状态,当它初始化时 , 在禁止转换的情况下这样做 这样它就可以毫不拖延地发生。一次 它在状态图上,控制 准备好状态转换为 发生,现在可以实现 触发 状态图中的转换。

    从一个简单的VSM源代码来看,似乎没有办法摆脱VSM并返回到原始的基本状态…所以是的,你需要一个“正常”的状态。:(

    我也觉得这有点恼人的是,虽然上面的解决方案是有意义的,但是VSM状态不能轻易移除。也许他们将来会解决这个问题。

        3
  •  16
  •   Fyodor Soikin    16 年前

    要做到这一点,你必须首先 定义 你的“基地”状态。

    问题是,如果您定义了一个不包含故事板的可视状态,那么这个状态将有效地等于“基本”状态,即加载控件的状态。

    <VisualStateGroup x:Name="TheGroup">  
        <VisualState x:Name="SomeState1">
           <Storyboard>
             ...
           </Storyboard>
        </VisualState>
    
        <VisualState x:Name="BaseState" /> <!-- Note: the VisualState tag is empty -->
    </VisualStateGroup>
    

    然后切换到该状态:

    VisualStateManager.GoToState( this, "BaseState", true );
    
    推荐文章