2013-01-21 82 views
3

我正在搜索解決方案的所有時間,無法獲得正確的解決方案。 我有網格寬度960,其中有ScrollViewer。現在我想知道滾動時滾動的值(水平偏移量)。我找到的所有解決方案都是針對wpf/silverlight,而且它不適用於我。Windows Phone 7 - ScrollViewer值已更改

編輯

好,這裏是示例代碼,XAML:

<ScrollViewer Name="Scroll" LayoutUpdated="ScrollViewer_LayoutUpdated" IsEnabled="True" Width="480" ScrollViewer.HorizontalScrollBarVisibility="Auto"> 
    <Grid x:Name="ContentPanel" Background="Red" Margin="12,0,12,0" Width="960"> 
     <Rectangle Name="GreenRectangle" Fill="Green" Width="240" Height="240"></Rectangle> 
    </Grid> 
</ScrollViewer> 

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

+0

你能發表你正在使用的代碼嗎? –

+0

這是因爲在你停止你的手勢輸入(滑動)後首先觸發「LayoutUpdated」事件,而不是看手勢事件,例如。三角洲事件。 –

回答

4

有可能通過使用scrollviewers依賴屬性,它有一個Horizo​​ntalOffset和VerticalOffset。訣竅是將事件綁定到scrollviewer,但它可以在加載事件處理程序中完成。如果你在你的scrollviewer中放置一個寬的網格,你可以得到偏移量!

在您的XAML文件(這裏的MainPage樣品):

 <ScrollViewer Loaded="ScrollViewer_Loaded_1"> 
     <Grid x:Name="ContentPanel" Grid.Row="1" Width="1000" Margin="12,0,12,0"> 
      <StackPanel> 
       ... 

在隱藏文件的代碼(MainPage.cs這裏):

 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 
    } 
+0

謝謝你的迴應。但它不是我的問題的100%解決方案。這是令人耳目一新的抵消速度太慢。我需要做的,而我滾動我的形象應該更小或更大。此代碼有效但不流利。有什麼想法? – Brzooz

+0

你需要在這裏放一些代碼來顯示你的問題。圖像視圖和性能有很多解決方案和問題! –

0

這裏是我用

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" LayoutUpdated='ContentPanel_LayoutUpdated'> 

     <ScrollViewer x:Name='scroller' VerticalAlignment='Stretch' VerticalScrollBarVisibility='Visible' > 
      <StackPanel 
       x:Name='listItems'></StackPanel> 
     </ScrollViewer> 
    </Grid> 
的XAML代碼

這裏是後面的C#代碼

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

每當滾輪滾動,則網格(網格容器)的佈局變化如此佈局更新事件被觸發......請把破發點的情況下內部嘗試調試和查找偏移值..

+0

這似乎也刷新得太慢了。您可以滾動很多而不會觸發任何事件。 – RandomEngy

0

將屬性ManipulationMode =「Control」添加到ScrollViewer。這是必要的,否則UI線程將不會被通知足夠的ScrollViewer滾動值來獲得流暢的動畫 - 正常模式是Windows Phone的性能優化,您需要繞過!