首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VisualStateManager vs Triggers?

VisualStateManager vs Triggers?
EN

Stack Overflow用户
提问于 2011-03-23 23:57:50
回答 5查看 6K关注 0票数 17

我发现可视化状态管理器和触发器在功能上有一些重叠。

代码语言:javascript
运行
复制
<VisualStateManager.VisualStateGroups>
   <VisualStateGroup x:Name="CommonStates">
      <VisualState x:Name="Pressed">
             ... bla bla ...
      </VisualState>
  </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

或者我可以去

代码语言:javascript
运行
复制
<Trigger Property="IsPressed" Value="true">
          ... bla bla ...
</Trigger>

什么时候我应该使用一种而不是另一种?

EN

回答 5

Stack Overflow用户

发布于 2016-12-08 09:08:31

为什么使用VisualStateManager而(最终不是)使用触发器呢?

让我们从它们之间的一般区别开始。

  • How它们被激发:当属性更改其value.
  • VisualStates时,当控件请求一组states.

的状态时,

  • 触发器被激发

触发时执行的触发器:

  • property.

:通过

  1. Setter建立其他触发器

代码语言:javascript
运行
复制
- _VisualState_:  
    1. Initiates a status change request to `VisualStateManager`.
    2. `VisualStateManager` performs a `VisualTransition` before setting the state.
    3. `VisualTransition` performs a `Storyboard`.
    4. When a time specified by `GeneratedDuration` (of `VisualTransition`) has passed, `VisualStateManager` updates the `CurrentState` property of the corresponding `VisualStateGroup` of the control.
    5. Next, `VisualStateManager` performs the initial `VisualState` requested in (1).
    6. And finally, `VisualState` performs another `Storyboard`.

是的,您认为VisualStateManager使场景比触发器更复杂,这是正确的。然而,VisualStateManager的复杂性允许程序员做触发器不能做的事情(不是以简单的方式):

  • Make一个状态和一个状态转换之间的差异:通过正确设置VisualTransition.
  • Automatically控件的scenarios.

To命令(例如停止一个转换动画并在transition).

  • Easy中间激活另一个转换动画以添加/编辑/维护/删除复杂的动画),
  • 在状态变化期间生成独立于状态本身的动画,而无需生成另一个额外的property.
  • Allow重用相同的转换

甚至(这是最神奇的事情)不需要离开

  • Gives correctly.
  • Implement,同时使用
    • Gives多个状态和状态转换:,因为你可以分配一组状态组给一个控件(一个VisualStateGroup),并且每个状态组在给定的时间有一个唯一的CurrentState。也许一张图片最能说明问题:

  • Natural与WPF的集成:,因为,隐式地,控件是处理状态的控件,并允许以控件树(父控件)的方式控制状态,这是WPF中自然发生的事情。这使您只需几行代码即可生成非常复杂的场景;当然,无需触及控件背后的代码。

我很确定这样做有更多的好处。最有趣的是,如果你想自己使用触发器来实现这些优势,你最终会陷入一个非常类似于VisualStateManager的系统中……试试看!

然而..。总是使用VisualStateManager并不好

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

就我个人而言,我会为非常简单的“原始”控件使用触发器,这些控件不需要奇怪的行为或奇怪的动画。在这种类型的控件中,VisualStateManager的实现复杂性并不能证明使用它是合理的。

对于更复杂的控件,我会使用VisualStateManager,特别是那些使用其他“原始”控件的“复杂”控件(请注意“原始”和“复杂”概念的含义)。根据用户交互,这个控件自然会有一个复杂的行为。

票数 10
EN

Stack Overflow用户

发布于 2011-03-24 00:02:59

这两者之间有大量的重叠。VisualStateManager是在处理了在复杂场景中使用触发器可能产生的“痛苦”之后添加的。一般来说,它更灵活,更容易使用。

票数 9
EN

Stack Overflow用户

发布于 2011-03-24 00:15:07

有些事情用触发器更容易做,有些事情用VSM更容易做。

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

VSM有两个缺点:

  • 你不能很容易地设置开始状态。最好的方法是在后面的代码中设置它,但在两个不同的状态组中设置相同的属性是不推荐的,但在实现控件模板时通常是可取的。由于可以使用多个条件,因此您可以使用触发器在状态重叠中获得更多粒度。

不过,VSM似乎是未来的趋势。如果您使用的是Blend,则VSM的配置非常简单。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5408062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档