2011-08-01 91 views
3

我創建了一個快速示例,將圖像放置在ScrollViewer中,啓動DispatcherTimer,然後每200 ms打印一次ScrollViewer.Horizo​​ntalOffset。從這個例子中,我注意到了一些奇怪的行爲 - 如果我抓住圖像並少量滾動,例如60像素左右,Horizo​​ntalOffset值永遠不會改變。 ScrollViewer沒有正確報告其位置的原因是什麼?編輯:我也嘗試抓住ScrollViewer中的ScrollBar(名爲「Horizo​​ntalScrollBar」)並檢查其Value屬性,但我得到了相同的結果。Windows Phone 7 ScrollViewer.Horizo​​ntalOffset不更新

EDIT2:看來這個bug只發生在Mango build 7712上(即使應用程序是爲7.0構建的)。我會關閉它,並希望它在最終版本中得到修復。

示例代碼。在我的機器上,我可以拖動圖像進行大範圍的更新。我似乎只獲得了120次左右的增量更新。我希望至少每10-20像素獲得一次更新。

<Grid x:Name="LayoutRoot" Background="Transparent"> 
     <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" x:Name="Scroll"> 
      <Image Source="Jellyfish.jpg" Stretch="None"/> 
     </ScrollViewer> 
    </Grid> 

MainPage.xaml.cs中:

// Constructor 
     public MainPage() 
     { 
      InitializeComponent(); 

      this.Loaded += (s, e) => 
       { 
        var scrollBar = Scroll.FindVisualChild("HorizontalScrollBar") as ScrollBar; 
        scrollBar.ValueChanged += (s1, e1) => Debug.WriteLine(DateTime.Now + " " + scrollBar.Value); 
       }; 
     } 

ExtensionMethods.cs:

public static class ExtensionMethods 
    { 
     public static FrameworkElement FindVisualChild(this FrameworkElement root, string name) 
     { 
      FrameworkElement temp = root.FindName(name) as FrameworkElement; 
      if (temp != null) 
       return temp; 

      foreach (FrameworkElement element in root.GetVisualDescendents()) 
      { 
       temp = element.FindName(name) as FrameworkElement; 
       if (temp != null) 
        return temp; 
      } 

      return null; 
     } 

     public static IEnumerable<FrameworkElement> GetVisualDescendents(this FrameworkElement root) 
     { 
      Queue<IEnumerable<FrameworkElement>> toDo = new Queue<IEnumerable<FrameworkElement>>(); 

      toDo.Enqueue(root.GetVisualChildren()); 
      while (toDo.Count > 0) 
      { 
       IEnumerable<FrameworkElement> children = toDo.Dequeue(); 
       foreach (FrameworkElement child in children) 
       { 
        yield return child; 
        toDo.Enqueue(child.GetVisualChildren()); 
       } 
      } 
     } 

     public static IEnumerable<FrameworkElement> GetVisualChildren(this FrameworkElement root) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++) 
       yield return VisualTreeHelper.GetChild(root, i) as FrameworkElement; 
     } 
    } 
+2

請注意如何獲得偏移量(代碼)?我剛剛構建了一個快速示例,它似乎工作正常。 –

+0

我剛剛測試過你的代碼,它對我來說工作正常。延遲可能是由您拍攝快照的方式引起的。介意分享嗎? –

+0

Hi Dennis - 快照代碼是上面的「Debug.WriteLine()」。當你運行該樣本時,你是否說它幾乎在每個像素處都會更新?我只能每80-120像素更新一次。 –

回答

2

我與ScrollViewer中和horizo​​ntalOffset經歷過,你可以更新您的開發工具,以β2把它工作(在我的情況下,scrollviewer是beta中的一個已知錯誤)。如果它仍然沒有運氣,試試我的代碼(我的作品):

public MainPage() 
    { 
     InitializeComponent(); 
     if (someVariable == 0) 
     { 
      myPopup = new Popup() { IsOpen = true, Child = new AnimatedSplashScreen() }; 
      backroungWorker = new BackgroundWorker(); 
      RunBackgroundWorker(); 

      timer = new DispatcherTimer(); 
      timer.Interval = TimeSpan.FromMilliseconds(10); 

      timer.Tick += new EventHandler(timer_Tick); 
      timer.Start(); 

      someVariable = 1; 
     } 


    } 

    #region timer 
    void timer_Tick(object sender, EventArgs e) 
    { 

     if (imagesScrollview.HorizontalOffset == (listBox.ActualWidth - 483)) 
      imagesScrollview.ScrollToHorizontalOffset(10); 
     imagesScrollview.ScrollToHorizontalOffset(imagesScrollview.HorizontalOffset +1); 
     current = imagesScrollview.HorizontalOffset + 1; 
+0

啊,謝謝你指出它在第一個測試版中被竊聽。我會看看beta 2是否解決了這個問題。 –

+0

不幸的是,這似乎並不是解決方案。最新的測試版仍然存在問題。 –