locked
ListBox设置ManipulationMode="Control"后很卡,是什么原因? RRS feed

  • 问题

  • 我的ListBox设置了ScrollViewer.ManipulationMode="Control"以后很卡,请问是为什么? 我看了再ScrollViewer.ManipulationMode="System"下内存与"Control"下是一样的,说明不是虚拟化的问题,那是为什么呢?  求解。我之所以设置ScrollViewer.ManipulationMode="Control"是为了获取ListBox中ScrollViewer的RenderTransform,用来判断TranslateY和ScaleY,看是否到达顶端且发生形变

    2011年11月9日 9:33

答案

  • 来自Partner Online Technical Community 的 解答:

    ListBox中的ScrollViewer.RenderTransform的类型是MatrixTransform而不是CompositeTransform,所以没有ScaleY或者TranslateY等属性。通过这个MatrixTransform也没有办法直接拿到当前ScrollViewer的上下滚动、压缩状态。 

     

    从这两个属性我猜想您的需求是检测当前ScrollViewer的位置。 

     

    我们可以通过以下方法拿到ListBoxScrollViewer对象,注意高亮的几行,这里参考自: 

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

     

    public MainPage()

    {

    InitializeComponent();

    this.Loaded += new RoutedEventHandler(MainPage_Loaded);

    listBox1.ManipulationCompleted +=new EventHandler<ManipulationCompletedEventArgs>(listBox1_ManipulationCompleted);

    }

     

    ScrollViewer viewer = null;

    void MainPage_Loaded(object sender, RoutedEventArgs e)

    {

    viewer = FindSimpleVisualChild<ScrollViewer>(listBox1);

    }

     

    private void listBox1_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)

    {

    if (viewer != null)

    {

    textBlock1.Text = "ScrollBar vertical percent is : " + (viewer.VerticalOffset / viewer.ScrollableHeight).ToString();

    }

    }

     

     

    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;

    }

     

    另外,我强烈建议您读一下这篇文章: 

    http://blogs.msdn.com/b/slmperf/archive/2011/06/30/windows-phone-mango-change-listbox-how-to-detect-compression-end-of-scroll-states.aspx 

    这里介绍的方法是对以上代码的扩展,在7.1中,我们可以拿到VerticalCompressionHorizontalCompression两种VisualStateGroup,可以用来检测ListBox的上下左右方向的压缩状态。其中也包括了示例代码下载。代码中很“华丽”地引用了twitterweb service,故拿到之后自己把ListBox的数据源手动替换掉即可成功运行看到效果。


    Xuesong
    2011年11月18日 2:52