如何使用VisualStateManager返回"Base"状态?

Aka*_*ava 16 visualstatemanager silverlight-3.0

我知道我们可以使用

VisualStateManager.GoToState(this,"SomeState1",true);
Run Code Online (Sandbox Code Playgroud)

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

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

// OR

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

// OR

VisualStateManager.GoToState(this,null,true);
Run Code Online (Sandbox Code Playgroud)

问题是如果没有这种方式返回到初始状态或基本状态,那么我将不得不始终创建第一个状态,并在构造函数中转到控制开始时的第一个状态.

我没有找到任何文档,所以我尝试所有组合,但没有找到任何工作..

Jac*_*eja 20

正常!=基地.

Base是应用任何视觉状态之前(即VSM处于活动状态之前)的控件的初始状态.

如果你在Expression博客上阅读这篇文章,我在这里有一个很好的描述:

...当您创建自己的模板化控件或UserControl时,您应该在每个状态组中定义"默认"状态.让控件在初始化时进入那些"默认"状态,并在抑制转换的情况下执行此操作,以便无延迟地发生.一旦它处于状态图上,控件就可以进行状态转换,现在您可以实现触发状态图中转换的事件处理程序.

从简短的VSM源代码看,似乎没有办法退出VSM并回到原来的Base状态......所以是的,你需要一个"正常"状态.:(

我也觉得有点烦人的是VSM状态不能轻易删除,尽管上面的解决方案确实有意义.也许他们将来会解决这个问题.


Fyo*_*kin 16

为此,您必须首先定义 "基本"状态.

如果你定义一个不包含故事板的可视状态,那么这个状态实际上将等于"基本"状态 - 加载控件的状态.

<VisualStateGroup x:Name="TheGroup">  
    <VisualState x:Name="SomeState1">
       <Storyboard>
         ...
       </Storyboard>
    </VisualState>

    <VisualState x:Name="BaseState" /> <!-- Note: the VisualState tag is empty -->
</VisualStateGroup>
Run Code Online (Sandbox Code Playgroud)

然后切换到该状态:

VisualStateManager.GoToState( this, "BaseState", true );
Run Code Online (Sandbox Code Playgroud)


Ste*_*ins 5

默认控件在CommonStates组中定义"正常"可视状态,在鼠标输出时恢复为等.我认为您需要遵循相同的模式,我认为是自定义控件?