1

MSDN 不鼓励使用EventTrigger和任何自定义触发操作,但提供了StoryBoardVisualStateManager作为替代方案。

Q1。当触发器看起来如此有用时,为什么不鼓励它们?

MSDN 的理由似乎是:

Silverlight 支持在元素上使用 EventTrigger 和 object.Triggers 属性元素,但不鼓励当前应用程序使用此技术。EventTrigger 只能支持 Loaded 事件的触发操作(您在 EventTrigger.RoutedEvent 属性中命名事件。)这使得 EventTrigger 不适用于大多数运行时交互。

那么,可以为 VSM 命名 VisualState,但不能为事件命名?两者都是可能发生变化的字符串值,那么为什么一个的命名比另一个更糟糕呢?

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

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

考虑以下场景进行讨论:

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


方法一

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


方法二

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


方法 3

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


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

4

1 回答 1

1

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

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

于 2011-03-22T05:41:22.200 回答