zoukankan      html  css  js  c++  java
  • Windows Phone 8 中Pivot和Panorama控件手势监听的变化

    背景

    在Windows Phone 7的时代,我们可以通过监听ManipulationStarted、ManipulationDelta和ManipulationCompleted事件来判断Pivot或者Panorama控件是向左滑动还是向右滑动。

    例如:Windows Phone 7中,我们通过监听滑动手势事件来控制Pivot控件中第一项不能向右滑动和最后一项不能向左滑动,以下具体实现方法:

       1:  protected override void OnManipulationCompleted(ManipulationCompletedEventArgs e)
       2:          {           
       3:              this.pivot.IsHitTestVisible = true;
       4:          }      
       5:          protected override void OnManipulationDelta(ManipulationDeltaEventArgs e)
       6:          {
       7:             
       8:              if (this.pivot.SelectedIndex == 0)
       9:              {
      10:                  if (e.DeltaManipulation.Translation.X > 0)
      11:                  {
      12:                      e.Complete();
      13:                      this.pivot.IsHitTestVisible =false;                   
      14:                  }                
      15:              }
      16:              if (this.pivot.SelectedIndex == 4)
      17:              {
      18:                  if (e.DeltaManipulation.Translation.X < 0)
      19:                  {
      20:                      e.Complete();
      21:                      this.pivot.IsHitTestVisible = true;                  
      22:                  }                
      23:              }
      24:          }

    前几天我将该段代码移植到Windows Phone 8项目中进行测试,发现没有任何的效果。然后我就在这个三个事件上面加入断点进行调试。

    1

    发现滑动Pivot控件的时候,只执行了ManipulationStarted事件,并没有执行ManipulationDelta和ManipulationCompleted事件,非常的神奇

    追踪原因

    发现问题之后,我就开始追踪原因。

    追踪一:MSDN对Pivot的类库说明文件;

    发现MSDN存在两处对Pivot控件的使用说明网址:

    Windows Phone 7中Pivot控件的解释:点击此处查看

    2

    Windows Phone 8中Pivot控件的解释:点击此处查看

    3

    通过对比继承层次结构发现:

    Windows Phone 7中Pivot控件是通过使用泛型参数的类派生自ItemsControl:

    public class TemplatedItemsControl<T> : ItemsControl where T : System.Windows.FrameworkElement, new()

    这表明ItemsControl由类型为T的子元素填充,Pivot派生自TemplatedItemsControl,但类型参数设置为PivotItem。

    public class Pivot : TemplatedItemsControl<PivotItem>

    Windows Phone 8中Pivot控件直接派生自ItemsControl:

    public class Pivot : ItemsControl

    但是仅仅从类层次结构上说明不了任何问题,不管在Windows Phone 7或者8中Pivot都会继承自System.Windows.Controls.Control,也就说理论上都会监听到三个手势事件的。

    追踪二:Windows Phone 8对Pivot的说明中发现“新大陆”;

    4

    大家可以点击这里查看详细说明文档。

    同时针对于Windows Phone 8中对Panorama控件的解释,点击这里查看详细说明文档;

    8

    通过该文档,我发现在Windows Phone 8的Pivot控件和Panorama控件已经内置了拖动、轻拂或点击等常见的手势

    结论

    通过以上我追踪问题产生的原因,我得出的结论是:

    Windows Phone 8中我们在拖动Pivot控件或Panorama控件的时候,其实是产生了Manipulation相关事件,但是被Pivot或Panorama内部封装的手势路由事件直接给拦截掉了,以至于我们在ManipulationDelta和ManipulationCompleted事件中处理的任何自定义逻辑都不会被执行。

    同时我进行了简单的对比验证

    在一个Page中放置一个文本框控件和一个Pivot控件,然后在Page的cs文件中override一下OnManipulationStarted、OnManipulationDelta和OnManipulationCompleted三个事件。

    我在拖动文本框控件的时候OnManipulationDelta和OnManipulationCompleted事件都会被执行,但是拖动Pivot控件两个事件就不会执行,而OnManipulationStarted事件会被执行。

    那么我们可以在试一下,监听PivotItem中某一个控件的ManipulationStarted、ManipulationDelta和ManipulationCompleted三个事件,同样会发现ManipulationDelta和ManipulationCompleted中自定义的逻辑不会被执行。

    因此我认为Windows Phone 8中通过OnManipulationDelta和OnManipulationCompleted事件是无法监听Pivot控件的是向左还是向右拖动。

    同理我也对Windows Phone 8中Panorama控件使用同样方式进行了测试,这里我就不在过多解释了,有兴趣的同学可以试验一下。

    PS:如果大家有好的解决思路,希望提供给我,共同学习一下

    问题发散

    大家肯定都用过Windows Phone Toolkit,里面有相关手势监听的Demo。通过对比Windows Phone 7和8的版本源代码,会发现:

    WP7版本中GestureSample.xaml页面通过引用Toolkit封装的手势事件来对手势监控。

    5

    而WP8版本中GestureSample.xaml页面没有引用之前的Toolkit封装的手势事件,而是回归到本质使用Windows Phone自带的ManipulationStarted、ManipulationDelta和ManipulationCompleted三个事件来处理的。

    6

    7

    另外Windows Phone 8中Pivot和Panorama控件都是进行了内置[为了减少这两个控件对系统内存的占用率],同时Pivot控件增加了IsLocked属性来控制是否锁定了 pivot 控件。

    以上针对Windows Phone 8中Pivot和Panorama控件滑动手势的监听试验,我希望能够为大家起到抛砖引玉的作用。

    相关参考文章:

    1. Windows Phone 7中Pivot类说明文档
    2. Windows Phone 8中Pivot类说明文档
    3. Windows Phone Pivot 控件
    4. Windows Phone 8中Panorama类说名文档
    5. Windows Phone 的全景控件
  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/wzk89/p/3034230.html
Copyright © 2011-2022 走看看