使用MVVMLight检测和处理WP8中的手势

时间:2013-10-29 12:52:38

标签: c# wpf mvvm windows-phone-8 mvvm-light

问题

我目前正在尝试在我的WP8应用中找到一种兼容MVVMLight的方式来使用手势。具体来说,我只想检测滑动/轻弹并将其绑定到我的视图模型中的RelayCommand。多年来我是否已经开发出任何我不知道的解决方案?

先前研究

我事先做了一些研究,我提出的结果大多已经过时或不再存在。即:

  1. Old Stackoverflow Question
  2. Clarity Consulting Blog Post with non-existant code
  3. Windows Phone Toolkit中的
  4. toolkit:GestureListener支持手势,但要求您将ViewModel与View结合使用。
  5. 修改

    注意:发现toolkit:GestureListener已被弃用。

2 个答案:

答案 0 :(得分:1)

Joost Van Schaaik在wp7:http://dotnetbyexample.blogspot.be/2011/03/simple-windows-phone-7-silverlight.html

上创建了这样的行为

可以通过@localjoost

在Twitter上与他联系

答案 1 :(得分:0)

找到我的问题的答案。

我没有使用toolkit:GestureListener,而是发现EventToCommandManipulationDeltaManipulationCompleted也有效:

在XAML中

<i:Interaction.Triggers>
    <i:EventTrigger EventName="ManipulationDelta">
    <Command:EventToCommand Command="{Binding SlideOutDeltaCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
    </i:EventTrigger>
        <i:EventTrigger EventName="ManipulationCompleted">
    <Command:EventToCommand Command="{Binding SlideOutCompletedCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
        </i:EventTrigger>
</i:Interaction.Triggers>

通过将EventArgs传递给ViewModel,您可以检测是否已发出滑动手势:

在ViewModel

定义RelayCommand

 public RelayCommand<ManipulationDeltaEventArgs> SlideOutDeltaCommand
    {
        get;
        private set;
    }

定义Execute()方法

 private void OnSlideDelta(ManipulationDeltaEventArgs e)
    {
        var delta = e.CumulativeManipulation.Translation;

        //If Change in X > Change in Y, its considered a horizontal swipe
        var isDeltaHorizontal = Math.Abs(delta.X) > Math.Abs(delta.Y) ? true : false;
    }

在ViewModel构造函数中注册您的命令

public MainViewModel()
{
    SlideOutDeltaCommand = new RelayCommand<ManipulationDeltaEventArgs>((e) => OnSlideDelta(e));
}