MSDN 不鼓励使用EventTrigger和任何自定义触发操作,但提供了StoryBoard和VisualStateManager作为替代方案。
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 的布尔值之间)?
这些只是我脑海中的一些想法。还有其他更好的做法建议吗?