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

16

我知道我们可以使用

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

如何从进入SomeState1状态返回到基础状态,即没有状态、控件加载时的状态。

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

// OR

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

// OR

VisualStateManager.GoToState(this,null,true);

问题在于如果没有回到初始或基础状态的方法,那么我就必须始终创建第一个状态,并在构造函数中跳转到控件开始时的第一个状态。

我找不到任何文档,所以我尝试了所有组合,但没有找到任何可行的方法。


好问题。我想知道Base是否仅用作“基线”,以确定在设计时编辑视觉状态时是否更改了任何属性? - Jack Ukleja
3个回答

21

Normal不等于Base。

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

如果您在Expression博客上阅读本文,那么这里有一份很好的描述:

......当您自己设计模板控件或用户控件时,您应该在每个状态组中定义一个“默认”状态。当它初始化时,使该控件进入这些“默认”状态,并且使用抑制过渡的方式进行操作,以便其可以在没有延迟的情况下完成。一旦它位于状态图上,控件就准备好进行状态转换,现在您可以实现触发状态图内转换的事件处理程序。

从对VSM源代码的简要查看中,似乎没有办法从VSM中退出并回到原始的Base状态......因此,是的,您需要一个“Normal”状态。 :(

我也觉得VSM状态不能轻松移除有点烦人,尽管上述解决方案是有道理的。也许他们将来会修复这个问题。


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 );

您确定空状态会撤消先前状态的影响吗? - Akash Kava
是的,我是。VisualStates 中的故事板定义了与“基本”状态的差异。VisualStateManager 足够智能,可以看到哪些属性已更改以及如何更改。这就是它如何自动生成转换效果。实际上,你为什么不自己验证一下呢?很容易。 否则,你也可以相信我的话:我已经使用这个机制有一段时间了。 - Fyodor Soikin
1
我应该把开关放在“BaseState”中的哪里?构造函数吗? - Jehof
不需要。控件在“基本”状态下,除非明确将其放入另一个状态中。因此,您不必显式地将其放入“基本”状态中。 - Fyodor Soikin

5

默认控件在CommonStates组中定义了“Normal”视觉状态,当鼠标移开等操作时会恢复到该状态。我认为您需要遵循相同的模式来处理自定义控件?


所以Normal状态是由每个控件自动定义的,或者对于自定义控件,我需要将其定义并将其用作初始状态?哪个地方最适合切换到Normal状态?在构造函数中吗? - Akash Kava
你不需要切换到它,normal只是一个没有更改属性的状态,然后你可以使用GoToState来有效地“撤销”其他状态引起的任何更改。 - Steven Robbins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接