我目前正在尝试实现一个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模式的情况下解决这个问题?
答案 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>