【问题标题】:Detect and handle Gestures in WP8 using MVVMLight使用 MVVMLight 在 WP8 中检测和处理手势
【发布时间】:2013-10-29 12:52:37
【问题描述】:

问题

我目前正在尝试找到一种兼容 MVVMLight 的方式来在我的 WP8 应用程序中使用手势。具体来说,我只想检测滑动/轻弹并将其绑定到我的视图模型中的 RelayCommand。这些年来有没有我不知道的最近开发的解决方案?

先前的研究

我之前做过一些研究,得出的结果大多已经过时或不复存在。即:

  1. Old Stackoverflow Question
  2. Clarity Consulting Blog Post with non-existant code
  3. Windows Phone Toolkit 中的toolkit:GestureListener 支持手势,但需要您将 ViewModel 与 View 耦合。

编辑

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

【问题讨论】:

  • 您是否考虑过编写一个 Behavior 将 Gesture 侦听器与 RelayCommand 结合起来?
  • 关于我将如何去做的任何建议?
  • 您有很多编写自定义行为的经验吗?这将是一个很好的起点。它们是DependencyObjects,因此您可以在 xaml 中编写它们并将它们数据绑定到您的视图模型的RelayCommands。
  • 我会努力解决的,如果我得到解决方案会回答我的问题
  • 感谢您的帮助,但找到了一个更简单的方法:)

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


【解决方案1】:

Joost Van Schaaik 在 wp7 上创建了这样的行为:http://dotnetbyexample.blogspot.be/2011/03/simple-windows-phone-7-silverlight.html

可以通过@localjoost在推特上联系他

【讨论】:

    【解决方案2】:

    找到了我的问题的答案。

    我发现 EventToCommandManipulationDeltaManipulationCompleted 一起使用,而不是使用 toolkit:GestureListener

    在 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,可以检测是否发出了滑动手势:

    在视图模型中

    定义中继命令

     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));
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多