One of the UI features of lists on Windows Phone 7 is that the "scroll bars" don't really act like traditional scroll bars; they are non-interactive and they only appear when the list is actually scrolling. To achieve this, the Silverlight team added a new visual state group that is used in the default control template for showing / hiding the scroll bars.

You can get programmatic access to the scroll state with the following approach. First, paste this XAML into the ContentGrid of a new WP7 application:

<ListBox FontSize="50" x:Name="theList">
  <ListBoxItem Content="Item 00"/>
  <ListBoxItem Content="Item 01"/>
  <ListBoxItem Content="Item 02"/>
  <ListBoxItem Content="Item 03"/>
  <ListBoxItem Content="Item 04"/>
  <ListBoxItem Content="Item 05"/>
  <ListBoxItem Content="Item 06"/>
  <ListBoxItem Content="Item 07"/>
  <ListBoxItem Content="Item 08"/>
  <ListBoxItem Content="Item 09"/>
  <ListBoxItem Content="Item 10"/>
  <ListBoxItem Content="Item 11"/>
  <ListBoxItem Content="Item 12"/>
  <ListBoxItem Content="Item 13"/>
  <ListBoxItem Content="Item 14"/>
  <ListBoxItem Content="Item 15"/>
  <ListBoxItem Content="Item 16"/>
  <ListBoxItem Content="Item 17"/>
  <ListBoxItem Content="Item 18"/>
  <ListBoxItem Content="Item 19"/>
  <ListBoxItem Content="Item 20"/>
  <ListBoxItem Content="Item 21"/>
  <ListBoxItem Content="Item 22"/>
  <ListBoxItem Content="Item 23"/>
  <ListBoxItem Content="Item 24"/>
  <ListBoxItem Content="Item 25"/>
  <ListBoxItem Content="Item 26"/>
  <ListBoxItem Content="Item 27"/>
  <ListBoxItem Content="Item 28"/>
  <ListBoxItem Content="Item 29"/>
</ListBox>

Now add the following to the code-behind file:

public MainPage()
{
  InitializeComponent();
  Loaded += new RoutedEventHandler(MainPage_Loaded);
}

bool alreadyHookedScrollEvents = false;

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
  if (alreadyHookedScrollEvents)
    return;

alreadyHookedScrollEvents = true;
  ScrollViewer viewer = FindSimpleVisualChild<ScrollViewer>(theList);
  if (viewer != null)
  {
    // Visual States are always on the first child of the control template
    FrameworkElement element = VisualTreeHelper.GetChild(viewer, 0) as FrameworkElement;
    if (element != null)
    {
      VisualStateGroup group = FindVisualState(element, "ScrollStates");
      if (group != null)
      {
        group.CurrentStateChanging += (s, args) => PageTitle.Text = args.NewState.Name;
      }
    }
  }
}

VisualStateGroup FindVisualState(FrameworkElement element, string name)
{
  if (element == null)
    return null;

IList groups = VisualStateManager.GetVisualStateGroups(element);
  foreach (VisualStateGroup group in groups)
    if (group.Name == name)
      return group;

return null;
}

T FindSimpleVisualChild<T>(DependencyObject element) where T : class
{
  while (element != null)
  {

if (element is T)
      return element as T;

element = VisualTreeHelper.GetChild(element, 0);
  }

return null;
}

What this does is attach to the CurrentStateChanging event of the VisualStateGroup, which will be raised every time the scroll state changes from "Scrolling" to "NotScrolling" or vice-versa. There's a bunch of infrastructure code to walk the visual tree and pull out a state group, but the core code is very simple:

  1. First we attach a handler called MainPage_Loaded to the Page.Loaded event
  2. When the page loads, we call FindSimpleVisualChild to get the ScrollViewerchild of the list (this is a pretty dumb function)
    1. We make sure to only do this once, because the page could get loaded more than once if it is navigated
  3. Then we call FindVisualState to get the named visual state from the first child of the ScrollViewer
  4. Then we add a handler to the CurrentStateChanging event

原文作者:Peter Torr - MSFT

原文链接: http://blogs.msdn.com/b/ptorr/archive/2010/07/23/how-to-detect-when-a-list-is-scrolling-or-not.aspx

WP8_检测列表是否滑动的更多相关文章

  1. android中列表的滑动删除仿ios滑动删除

    大家是不是觉得ios列表的滑动删除效果很酷炫?不用羡慕android也可以实现相同的效果 并且可以自定义效果,比如左滑删除,置顶,收藏,分享等等 其实就是自定义listview重写listview方法 ...

  2. Android-自定义仿QQ列表Item滑动

    效果图: 布局中去指定自定义FrameLayout: <!-- 自定义仿QQ列表Item滑动 --> <view.custom.shangguigucustomview.MyCust ...

  3. python极简代码之检测列表是否有重复元素

    极简python代码收集,实战小项目,不断撸码,以防遗忘.持续更新: 1,检测列表是否有重复元素: 1 # !usr/bin/env python3 2 # *-* coding=utf-8 *-* ...

  4. 提升html5的性能体验系列之二列表流畅滑动

    App的顶部一般有titlebar,下面是list.常见的一个需求是要在list滚动时,titlebar不动.这个简单的需求,实现起来其实并不简单. 在普通web上的做法是使用div的滚动条,把lis ...

  5. [转]ionic3项目实战教程三(创建provider、http请求、图文列表、滑动列表)

    本文转自:https://blog.csdn.net/lyt_angularjs/article/details/81145468 版权声明:本文为博主原创文章,转载请注明出处.谢谢! https:/ ...

  6. 提升HTML5的性能体验系列之二 列表流畅滑动

    App的顶部一般有titlebar,下面是list.常见的一个需求是要在list滚动时,titlebar不动.这个简单的需求,实现起来其实并不简单. 在普通web上的做法是使用div的滚动条,把lis ...

  7. 微信小程序列表项滑动显示删除按钮

    微信小程序并没有提供列表控件,所以也没有iOS上惯用的列表项左滑删除的功能,SO只能自己干了. 原理很简单,用2个层,上面的层显示正常的内容,下面的层显示一个删除按钮,就是记录手指滑动的距离,动态的来 ...

  8. 模仿qq列表信息滑动删除效果

    这个效果的完成主要分为两个部分 自定义view作为listview的列表项 一个view里面包括 显示头像,名字,消息内容等的contentView和滑动才能显示出来的删除,置顶的右边菜单menuVi ...

  9. egret之好友列表(滑动列表)

    本文采用List+Scroller实现列表滑动功能 首先新建两个皮肤,一个用做好友界面的显示,一个用作单个好友的显示,新建皮肤如下: 皮肤一取名为:wxMainSkin,添加如下控件 皮肤一取名为:w ...

随机推荐

  1. Visual Studio 2012 比较好用的插件推荐

    为了高效率的开发,下面笔者推荐几款非常不错的插件,方便大家.   以上控件的安装方式是: 然后通过联网的方式下载,安装后,需要重启一下Visual Studio方可使用.

  2. linux 常用alias

    alias qqcom='cd /usr/local/qqcom_app/' alias php_c='cd /usr/local/php/lib/' alias ap_c='cd /usr/loca ...

  3. redis使用日志(一) 安装,调试

    第一步:下载,安装 root@iZ28fgejjw7Z:/# wget http://download.redis.io/releases/redis-.tar.gz root@iZ28fgejjw7 ...

  4. JQ获取当前是第几个元素,以及直接选取第几个元素的方法

    一.获取当前是第几个元素的方法使用:$(this).index() 实例: $(function () { $('.menu li').mouseover(function () { alert($( ...

  5. ethereal抓包工具

    ethereal是目前网络上开源的一款功能强大的以太网抓包工具,该软件可以监听异常封包,检测软件封包问题,从网络上抓包,并且能对数据包进行分析,从而帮助用户解决各种网络故障,更加方便查看.监控TCP ...

  6. android之Widget01

    ExampleAppWidgetProvider.java package com.example.mars_2600_widget01; import android.appwidget.AppWi ...

  7. Win7允许被ping

    我们可以通过命令行方式来执行入站 Ping 的规则是启用还是禁用,命令行如下: netsh firewall set icmpsetting 8 netsh firewall set icmpsett ...

  8. 创建一个hibernate helloword

    1.下载hibernate包 http://hibernate.org/orm/ 点download下载最终版 安装hibernate插件hibernatetools 2.创建一个java工程 导入必 ...

  9. Innosetup中将bat文件压缩到压缩包中

      有时候在安装的过程中需要调用某些文件(bat或者exe等文件),但是只需要使用一次,然后就可以删掉该文件, 在Innosetup中应该这样操作: 1.在.iss脚本的[Files]章节写下: So ...

  10. 全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发环境)

    https://segmentfault.com/a/1190000000606752