来自Partner Online Technical Community 的 解答:
ListBox中的ScrollViewer.RenderTransform的类型是MatrixTransform而不是CompositeTransform,所以没有ScaleY或者TranslateY等属性。通过这个MatrixTransform也没有办法直接拿到当前ScrollViewer的上下滚动、压缩状态。
从这两个属性我猜想您的需求是检测当前ScrollViewer的位置。
我们可以通过以下方法拿到ListBox的ScrollViewer对象,注意高亮的几行,这里参考自:
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中,我们可以拿到VerticalCompression和HorizontalCompression两种VisualStateGroup,可以用来检测ListBox的上下左右方向的压缩状态。其中也包括了示例代码下载。代码中很“华丽”地引用了twitter的web
service,故拿到之后自己把ListBox的数据源手动替换掉即可成功运行看到效果。
Xuesong