Windows Phone 7 – ScrollViewer值已更改

我一直在寻找解决方案而且无法获得正确的解决方案。 我的网格宽度为960,其中包含ScrollViewer 。 现在我想知道滚动时滚动的值(水平偏移)。 我找到的所有解决方案都适用于wpf / silverlight,它对我不起作用。

编辑

好的,这是示例代码,xaml:

      

C#

 private void ScrollViewer_LayoutUpdated(object sender, EventArgs e) { GreenRectangle.Width = Scroll.HorizontalOffset; GreenRectangle.Height = Scroll.HorizontalOffset; } 

但问题是它并没有一直改变大小。 也许我的英语不好,你不能理解我。 这是电影示例,我向左滑动,尺寸始终相同。 当我停止滑动时,它正在改变大小。

https://www.dropbox.com/s/eh28oavxpsy19bw/20130122_1601_56.avi

通过使用scrollviewers依赖项属性,它可以具有Horizo​​ntalOffset和VerticalOffset。 诀窍是将事件绑定到scrollviewer,但它可以在load事件处理程序中完成。 如果在滚动查看器中放置一个宽网格,则可以获得偏移量!

在您的xaml文件中(此处为MainPage示例):

     ... 

在您的代码隐藏文件(MainPage.cs here)中:

  public static readonly DependencyProperty ScrollViewVerticalOffsetProperty = DependencyProperty.Register( "ScrollViewVerticalOffset", typeof(double), typeof(MainPage), new PropertyMetadata(new PropertyChangedCallback(OnScrollViewVerticalOffsetChanged)) ); public static readonly DependencyProperty ScrollViewHorizontalOffsetProperty = DependencyProperty.Register( "ScrollViewHorizontalOffset", typeof(double), typeof(MainPage), new PropertyMetadata(new PropertyChangedCallback(OnScollViewHorizontalOffsetChanged)) ); private ScrollViewer _listScrollViewer; private void ScrollViewer_Loaded_1(object sender, RoutedEventArgs e) { _listScrollViewer = sender as ScrollViewer; Binding binding1 = new Binding(); binding1.Source = _listScrollViewer; binding1.Path = new PropertyPath("VerticalOffset"); binding1.Mode = BindingMode.OneWay; this.SetBinding(ScrollViewVerticalOffsetProperty, binding1); Binding binding2 = new Binding(); binding2.Source = _listScrollViewer; binding2.Path = new PropertyPath("HorizontalOffset"); binding2.Mode = BindingMode.OneWay; this.SetBinding(ScrollViewHorizontalOffsetProperty, binding2); } public double ScrollViewVerticalOffset { get { return (double)this.GetValue(ScrollViewVerticalOffsetProperty); } set { this.SetValue(ScrollViewVerticalOffsetProperty, value); } } public double ScrollViewHorizontalOffset { get { return (double)this.GetValue(ScrollViewHorizontalOffsetProperty); } set { this.SetValue(ScrollViewHorizontalOffsetProperty, value); } } private static void OnScrollViewVerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { MainPage page = obj as MainPage; ScrollViewer viewer = page._listScrollViewer; // ... do something here } private static void OnScollViewHorizontalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { MainPage page = obj as MainPage; ScrollViewer viewer = page._listScrollViewer; // ... do something here } 

这是我使用的XAML代码

      

这里是C#代码

 private void ContentPanel_LayoutUpdated(object sender, EventArgs e) { var offset = scroller.VerticalOffset; } 

每当滚动滚动条时,网格(容器网格)的布局都会发生变化,因此会触发布局更新事件…请通过在事件中放置断点并查找偏移值来尝试调试。

将属性ManipulationMode =“Control”添加到ScrollViewer。 这是必需的,否则将不会通过足够的ScrollViewer滚动值通知UI线程以获得流畅的动画 – 正常模式是您需要绕过的Windows Phone的性能优化!