【问题标题】:How should I implement non-event-based actions in WPF?我应该如何在 WPF 中实现非基于事件的操作?
【发布时间】:2012-04-13 21:30:56
【问题描述】:

我有几年的循环游戏编程背景。我非常习惯在我的应用程序中有一个恒定循环,它不断调用 Update 和 Draw 等函数,允许我通过每帧增加一点值来随时间执行动画等操作。

现在我找到了一份涉及 WPF 的工作,但我发现我太依赖那个系统了。也许我对 WPF 的感觉有限,但似乎一切都是基于事件的。用户单击一个按钮,您通知代码,代码操作值。值改变,代码通知 UI,UI 更新布局。它适用于基于 GUI 的应用程序编程,但我发现当我遇到在基于循环的游戏编程中微不足道的情况时,我会陷入困境,无法找到实现简单行为的好方法。

冒着过于模糊的风险,我将提供我当前的问题作为示例。在 Windows 8 发布后,我对 Semantic Zoom 的想法非常着迷。在广泛使用“开始”屏幕后,我开始为 Microsoft Surface 开发 Semantic Zoom 到 WPF4.0 的端口(我在工作中使用 Surface)。我只想要一个简单的例子,它可以让我使用捏合手势在一堆视图中上下导航。

在花了很多小时试图理解操作事件(我不会深入那个...... bleh)之后,我终于得到了基于捏合手势的视图缩放。如果它超过某个点,我会跳回“缩小”视图。很酷。但是,问题是,如果用户没有完成手势并决定不缩小,我就会看到一个较小的视图。我想为视图的比例设置动画,使其从用户捏合中不断“反弹”并恢复到 1 的比例。我知道这是否是基于循环的,我只会将 Lerp 朝向每帧 1。但是由于 WPF 都是基于事件的,所以我有点迷茫。

使用惯性或不同的操作事件可能会解决这个特定问题(我很高兴听到它),但除此之外,我只想知道如何重新调整我的思维定势以进行更多工作在 WPF 中有效。仅仅是知道要订阅哪些事件吗?有没有聪明的方法来使用动画来做我想做的事?我应该使用线程来完成这类任务,还是作弊(这似乎不可靠,而且我对 WPF 中的线程感到不安)?

我认为,这个问题是我在 WPF 中发挥作用的最大障碍之一(嗯,这个问题还不太了解 MVVM,正在研究那个)。我希望看到它被拆除,并且能够在不仅仅是基于循环的游戏编程中发挥作用。

【问题讨论】:

    标签: wpf wpf-4.0


    【解决方案1】:

    虽然我很确定您想要做的大部分事情都可以以基于事件的方式完成,但您可能需要查看 MSDN How to: Render on a Per Frame Interval Using CompositionTarget。另请注意Property Animation Techniques Overview 中的最后一节每帧动画:绕过动画和计时系统

    【讨论】:

    • 这个建议有什么结果吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    相关资源
    最近更新 更多