【问题标题】:Can you have a guard clause that waits for a storyboard to complete你能有一个等待故事板完成的保护子句吗
【发布时间】:2012-02-21 11:33:52
【问题描述】:

我想定义一个在按下按钮时运行五秒钟的故事板:

  • 我可以在故事板上添加一个保护子句来阻止按钮被多次按下吗?

  • 如果不是,有什么方法可以处理此问题,而无需在 ViewModel 中显式引用动画。

【问题讨论】:

    标签: c# windows-phone-7 caliburn.micro


    【解决方案1】:

    如果您确实需要将按钮链接到动画,那么我可能会创建一个 TriggerAction (System.Windows.Interactivity.TriggerAction) 并将其附加到按钮上。然后该操作将禁用按钮、启动动画并在重新启用按钮之前侦听动画的 Completed 事件。

    恕我直言,MVVM 不适用于这种情况,因为所有交互都与视图相关,并且没有真正好的方法来通知您的 ViewModel 动画正在制作动画。此外,实际动画时间不是确定性的,因此如果您假设一个固定时间,可能会有其他含义。

    您可能还想看看设置动画的HandOffBehavior。根据您实际执行的动画,如果用户反复敲击按钮,可能不会受到真正的惩罚。如果有,请使用上述建议并禁用该按钮。

    【讨论】:

    • 这就是我自己最终认为的,动画与视图严格相关,因此没有真正需要向 ViewModel 添加属性,正如我在上面的 cmets 中所说,数据已经存在,动画是严格的呈现。
    【解决方案2】:

    您可以执行以下操作:

    • 单击按钮时,启动Storyboard 并将Button.IsEnabled 设置为false。这将阻止后续点击。
    • 处理 Storyboard.Completed 事件以重新启用您的按钮。

    从 MVVM 的角度来看,按钮的启用状态应该是视图模型的属性。您应该能够将其公开为布尔属性并将其绑定到Button.IsEnabled。当您启动故事板时(可能来自代码隐藏),您可以通过对视图模型的引用来设置按钮启用状态。

    是的,...在代码隐藏中!这仍然足以将您的视图与您的视图模型分离并允许进行单元测试。

    【讨论】:

    • 这是个好主意,我唯一担心的是我通常不会在 View 中引用 ViewModel 并且真的不想为一个属性这样做......如果我必须我会,但我想先看看其他人的选择。
    • @deanvmc 很公平。然而,值得记住的是,虽然一个视图模型可能有多个视图,但一个视图通常只呈现一个视图模型类型。因此,在视图代码隐藏中引用具体的视图模型类型很少会导致问题。
    • 确实如此,但是我想知道,如果我需要访问 View 上的 ViewModel 属性只是为了控制 View(数据在那里,情节提要只是模拟它需要时间populate) 如果该属性甚至属于 ViewModel,如果我将视图从顶部取下,则永远不会考虑该属性。我想知道我是否应该直接在后面的代码中控制整个过程(故事板+保护子句),因为隐藏按钮是仅查看限制,目的是让故事板运行,想法?
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2011-03-29
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多