【问题标题】:TouchEvents on Canvas in MVVMMVVM 中 Canvas 上的 TouchEvents
【发布时间】:2017-08-31 09:17:28
【问题描述】:

我目前正在尝试实现一个可以通过触摸输入移动和缩放的 ImageViewer。 我已经在 Code Behind 的最近一个项目中实现了这些功能,但是我在 MVVM 的视图模型中很难做到这一点。

问题是,要让我的代码正常工作,我必须知道同时识别了多少个触摸输入。 在我的代码隐藏中,我使用了:

canvas.TouchesCaptured.Count()

ViewModel 不应该知道 View 的任何控件,因此将 Canvas 作为命令参数传递不是可行的方法。

在画布旁边,我需要触发的 TouchEvent 的 TouchEventArgs 来确定 TouchEvent 在画布上的位置。 使用 Prism,我能够将 TouchEventArgs 放入 ViewModel。

 <i:Interaction.Triggers>
        <i:EventTrigger EventName="TouchDown">
            <prism:InvokeCommandAction Command="{Binding TouchDownCommand}"
        </i:EventTrigger>
 </i:Interaction.Triggers>

prism:InvokeCommandAction 自动将 EventArgs 设置为 CommandParameter 以进行说明。

要确定触控事件在画布上的位置,我需要画布和触控事件。 在我的 Code-Behind 中,它看起来像这样:

startingPoint = e.GetTouchPoint(canvas);

任何人知道如何在不违反 MVVM 模式的情况下解决这个问题?

【问题讨论】:

标签: c# wpf canvas mvvm


【解决方案1】:

您可以尝试编写一个 Blend 行为来封装 Canvas 事件处理并公开命令(例如特别是 ManipulationDelta)。您甚至可以向公开 TouchesCaptured 值的行为添加一个属性(在 ManipulationDelta 事件期间)。

例如

<Canvas>
    <i:Interaction.Behaviors>
        <bhv:CanvasBehavior ManipulationDeltaCommand="{Binding MyViewModelCommand}" TouchPointCount="{Binding MyViewModelTouchPointCount}" />
    </i:Interaction.Behaviors>
</Canvas>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多