MVVM中的Canvas上的TouchEvents

时间:2017-08-31 09:17:29

标签: c# wpf canvas mvvm

我目前正在尝试实现一个ImageViewer,可以通过触摸输入进行移动和缩放。 我已经在Code Behind的最近一个项目中实现了这些功能,但我很难在MVVM中的View Model中这样做。

问题是,为了使我的代码能够工作,我必须知道同时识别了多少触摸输入。 在我使用的Code-Behind中:

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以便澄清。

要确定TouchEvent在画布上的位置,我需要画布和TouchEvent。 在我的Code-Behind中,它看起来像是:

startingPoint = e.GetTouchPoint(canvas);

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

1 个答案:

答案 0 :(得分:0)

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

e.g。

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