Silverlight中的最佳实践触发器替代方案

时间:2011-03-21 23:37:40

标签: silverlight triggers storyboard visualstatemanager

MSDN不鼓励使用EventTriggercustom trigger actions,但提供StoryBoardVisualStateManager作为替代。

Q1。在they appear to be so useful

时,为什么不鼓励使用触发器?

MSDN的理由似乎是:

  

EventTrigger和object.Triggers   元素的属性元素用法是   由Silverlight支持,但使用   不鼓励这种技术   目前的申请。 EventTrigger可以   仅支持触发操作   Loaded事件(您为事件命名   在EventTrigger.RoutedEvent中   property。)这个生成一个EventTrigger   不适合大多数运行时   相互作用。

因此,可以为VSM命名VisualState,但不能为事件命名吗?两者都是可以改变的字符串值,那么为什么一个的命名比另一个更糟?

Q2。动画对象属性的最佳实践方法是什么,其值取决于其数据上下文的属性值?

当然,VSM和StoryBoard非常适合动画,但它们不直接与对象的数据上下文交互,是吗?

请考虑以下场景进行讨论:

Canvas路径的边框应根据Canvas'数据上下文的IsSelected属性的值更改颜色和粗细。左键单击Canvas Path的封闭区域应切换IsSelected属性,该属性还应更改Path的动画以及最终的颜色和粗细。


方法1

也许我可以挂钩交互事件(即MouseLeftButtonUp)并更新后面代码中的IsSelected属性值并启动StoryBoard或更改VisualState以设置Canvas路径的动画。虽然从动画的角度来看这可能没问题,但除非我将数据上下文转换为某些IIsSelectable接口,否则它会将视图强烈耦合到其视图模型/数据上下文。


方法2

也许我可以创建一个行为来切换IISelectable(如上所述)属性并启动StoryBoard或更改VisualState。由于Canvas是一个控件,使用VSM而不仅仅是StoryBoard可能更好(否则我不得不以某种方式将StoryBoard的引用传递给Behavior,也许?)。


方法3

也许我可以使用双向转换与双转换器,以便Canvas路径的初始动画由IsSelected属性值确定,但用户交互将更改动画/ VisualState,然后将更新IsSelected属性值。如果是这种情况,我会转换Canvas Path的边框颜色/ thickness属性,还是有办法正确转换VisualState(与IsSelected的布尔值相对应)?


这些只是我头脑中的一些想法。还有其他更好的做法吗?

1 个答案:

答案 0 :(得分:1)

Q1:不建议使用EventTrigger和System.Windows.TriggerAction。您提供的链接“它们似乎非常有用?”适用于System.Windows.Interactivity.TriggerAction,它的使用受到鼓励,因为它在Blend SL项目中受支持,并且它不仅可用于Loaded事件。

Q2:您可以将动画的To值数据绑定,但我会考虑创建自定义模板化控件。这样,您可以定义对IsSelected属性的更改会更改控件的VSM状态。