我发现可视状态管理器和触发器之间的功能有一些重叠。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Pressed">
... bla bla ...
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
或者我可以去
<Trigger Property="IsPressed" Value="true">
... bla bla ...
</Trigger>
我应该何时使用另一个?
答案 0 :(得分:8)
两者之间存在巨大的重叠。在处理了因复杂场景使用触发器而产生的“痛苦”后,VisualStateManager
被添加。一般来说,它更灵活,更易于使用。
答案 1 :(得分:7)
使用触发器可以更轻松地完成某些操作,使用VSM则更容易。
使用VSM的最大原因是Silverlight不支持触发器。如果您希望过渡到Silverlight,请远离触发器。
VSM的两个缺点:
VSM似乎是未来。如果您使用Blend,则VSM非常易于配置。
答案 2 :(得分:5)
让我们从它们之间的一般差异开始。
Setter
建立其他一些财产。VisualStateManager
发送状态更改请求。VisualStateManager
在设置状态之前执行VisualTransition
。VisualTransition
执行Storyboard
。GeneratedDuration
(VisualTransition
)指定的时间过去后,VisualStateManager
会更新对应CurrentState
控件的VisualStateGroup
属性。< / LI>
VisualStateManager
执行(1)中请求的初始VisualState
。VisualState
执行另一个Storyboard
。是的,您认为VisualStateManager使场景比触发器更复杂。但是,VisualStateManager的复杂性允许程序员执行触发器无法做的事情(不是以简单的方式):
From
的{{1}}和To
命令,允许重复使用相同的转换。 在触发VisualState的方式中获得更大的自由:,因为它可以通过更改属性,事件,方法等来制作。甚至(这是最神奇的事情) 没有退出xaml ,正确使用VisualTransition
。
同时实现多个状态和状态转换:,因为您可以将一组状态组分配给控件(Behavior
),并且每个状态组都有一个唯一的{ {1}}在给定时间。也许图像说得最好:
与WPF自然集成:因为,隐含地,控件是处理状态的控件,并允许控制控件树的排列状态(父级 - 控制),在WPF中自然发生的事情。这允许您生成非常复杂的场景,只有几行;当然,不要触及控件背后的代码。
我非常确定有更多优势。最有趣的是,如果你想使用触发器自己做一些这些优点,你最终会陷入一个非常类似于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)。使用触发器无法轻松完成。