WPF / Silverlight:VisualStateManager与触发器?

时间:2011-03-23 15:57:50

标签: wpf silverlight xaml

我发现可视状态管理器和触发器之间的功能有一些重叠。

<VisualStateManager.VisualStateGroups>
   <VisualStateGroup x:Name="CommonStates">
      <VisualState x:Name="Pressed">
             ... bla bla ...
      </VisualState>
  </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

或者我可以去

<Trigger Property="IsPressed" Value="true">
          ... bla bla ...
</Trigger>

我应该何时使用另一个?

5 个答案:

答案 0 :(得分:8)

两者之间存在巨大的重叠。在处理了因复杂场景使用触发器而产生的“痛苦”后,VisualStateManager被添加。一般来说,它更灵活,更易于使用。

答案 1 :(得分:7)

使用触发器可以更轻松地完成某些操作,使用VSM则更容易。

使用VSM的最大原因是Silverlight不支持触发器。如果您希望过渡到Silverlight,请远离触发器。

VSM的两个缺点:

  • 您无法轻松设置开始状态。最好的方法是将它设置在某个地方后面的代码中,但这很痛苦。
  • 不建议在两个不同的状态组中设置相同属性的动画,但在实现控件模板时通常需要这样做。您可以使用触发器在状态重叠中获得更多粒度,因为您可以使用多个条件。

VSM似乎是未来。如果您使用Blend,则VSM非常易于配置。

答案 2 :(得分:5)

为什么使用VisualStateManager和(最终)不使用触发器?

让我们从它们之间的一般差异开始。

  • 如何解雇:
    • 属性更改其时会触发触发器。
    • 控件请求状态组状态时,会触发VisualStates。
  • 攻击时执行的操作:
    • 触发器:
      1. 通过Setter建立其他一些财产。
    • 的VisualState
      1. VisualStateManager发送状态更改请求。
      2. VisualStateManager在设置状态之前执行VisualTransition
      3. VisualTransition执行Storyboard
      4. GeneratedDurationVisualTransition)指定的时间过去后,VisualStateManager会更新对应CurrentState控件的VisualStateGroup属性。< / LI>
      5. 接下来,VisualStateManager执行(1)中请求的初始VisualState
      6. 最后,VisualState执行另一个Storyboard

是的,您认为VisualStateManager使场景比触发器更复杂。但是,VisualStateManager的复杂性允许程序员执行触发器无法做的事情(不是以简单的方式):

  • 在状态和状态转换之间做出改变:
    • 在状态更改期间生成动画,与状态本身无关,而不会生成其他额外属性。
    • 通过正确设置From的{​​{1}}和To命令,允许重复使用相同的转换。
    • 自动控制视觉问题和动画(例如停止转换动画并在转换过程中激活另一个动画)。
    • 易于添加/编辑/维护/删除复杂的动画,这有助于在复杂场景中进行编程。
  • 在触发VisualState的方式中获得更大的自由:,因为它可以通过更改属性,事件,方法等来制作。甚至(这是最神奇的事情) 没有退出xaml ,正确使用VisualTransition

  • 同时实现多个状态和状态转换:,因为您可以将一组状态组分配给控件(Behavior),并且每个状态组都有一个唯一的{ {1}}在给定时间。也许图像说得最好: State-Based Navigation QuickStart Using the Prism Library 5.0 for WPF

  • 与WPF自然集成:因为,隐含地,控件是处理状态的控件,并允许控制控件树的排列状态(父级 - 控制),在WPF中自然发生的事情。这允许您生成非常复杂的场景,只有几行;当然,不要触及控件背后的代码。

我非常确定有更多优势。最有趣的是,如果你想使用触发器自己做一些这些优点,你最终会陷入一个非常类似于VisualStateManager的系统......试试吧!

然而......总是使用VisualStateManager

并不好

即使具备所有这些优点,VisualStateManager系统也不应丢弃触发器系统。触发器是一个更简单的系统,但它也有其潜力。

就我个人而言,我会使用Triggers非常简单&#34;原始&#34;控件不需要奇怪的行为或奇怪的动画。在这种类型的控件中,VisualStateManager的实现复杂性并不能证明其使用的合理性。

对于更复杂的控件,我会使用VisualStateManager,特别是那些&#34; complex&#34;利用其他&#34;原语&#34;控制(注意&#34;原语&#34;和&#34;复杂&#34; 的概念的含义。当然,根据用户交互,这种控件具有复杂的行为。

答案 3 :(得分:2)

我认为您可以使用VisualStateManager(VSM)为零件创建控件合约作为全局设计解决方案,并在特定情况下触发视图元素的反应。

实现自定义控件是一种很好的做法,将自己的视图描述为“状态机”和转换的内部逻辑。 但触发器可以对周围控件或应用程序数据的更改做出反应。

我认为在开发具有多个控件的复杂视图时,可以在开发自定义控件和触发器时使用VisualStateManager。

我不同意使用VSM的最大原因 - Silverlight中不支持的触发器。您可以使用Blend SDK中的Microsoft.Expression.Interaction + System.Windows.Interactivity中的触发器。在Silverlight 5中,此功能将在silverlight核心中提供。

答案 4 :(得分:1)

除了其他答案之外,围绕视觉状态(使用触发器)构建“设计”体验更容易。例如,Expression Blend允许您interactively build为各种视觉状态运行的故事板(Blend 3的video)。使用触发器无法轻松完成。