Windows Phone 7: valore ScrollViewer modificato

Sto cercando tutto il tempo per la soluzione e non posso ottenere quello corretto. Ho una griglia con larghezza 960 e ScrollViewer di ScrollViewer . Ora mi piacerebbe conoscere il valore (offset orizzontale) del mio scorrimento durante lo scorrimento. Tutte le soluzioni che sto trovando sono per wpf / silverlight e non funzionerà per me.

modificare

Ok, ecco il codice di esempio, xaml:

      

c #

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

Ma il problema è che non cambia continuamente taglia. Forse il mio inglese non sta bene e non puoi ascoltarmi. Ecco un esempio di film, sto scivolando a destra e la dimensione è sempre la stessa. Quando smetto di scorrere, le dimensioni cambiano.

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

È ansible usando le proprietà di dipendenza dello scrollviewer, ha un HorizontalOffset e un VerticalOffset. Il trucco è associare l’evento allo scrollviewer, ma può essere fatto nel gestore di eventi load. Se metti una griglia larga nel tuo scrollviewer puoi ottenere l’offset!

Nel file xaml (esempio di MainPage qui):

     ... 

Nel tuo codice dietro il file (MainPage.cs qui):

  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 } 

ecco il codice XAML che ho usato

      

ed ecco il codice C # dietro

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

ogni volta che lo scroller viene fatto scorrere, il layout della griglia (griglia del contenitore) cambia in modo tale che l’evento di aggiornamento del layout viene triggersto … prova a eseguire il debug posizionando il punto di interruzione all’interno dell’evento e cerca il valore dell’offset.

Aggiungi la proprietà ManipulationMode = “Control” al tuo ScrollViewer. Questo è necessario perché altrimenti il ​​thread dell’interfaccia utente non verrà informato con i valori di scorrimento ScrollViewer sufficienti per ottenere un’animazione fluida: la modalità normale è un’ottimizzazione delle prestazioni di Windows Phone da bypassare!