2012-10-05

[Windows Phone 7] Mango 密記– 取得ListBox捲動數值

 

這幾天有人問我說如何取得ListBox中捲動了多少..

這剛好我之前有解過,我就想說就把Code整理簡單一點來分享..


介紹一下配置..

sshot-59_2

 

在 listBoxMain  中我會塞入100個 TextBlox資料, 然後在捲動時候,會顯示數值在txtSPValue 這TextBlock中..

首先看一下 LayoutRoot Loaded 事件 :

private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
          //取得 listBoxMain 中的ScrollBar
          List<ScrollBar> scrollBarList = GetVisualChildCollection<ScrollBar>(listBoxMain);
 
          foreach (ScrollBar scrollBar in scrollBarList)
          {
              
              //如果是垂直的ScrollBar加入此事件
              if (scrollBar.Orientation == System.Windows.Controls.Orientation.Vertical)
              {
                  scrollBar.ValueChanged += new RoutedPropertyChangedEventHandler<double>(scrollBar_ValueChanged);
              }
              else //此為橫向的
              {
                  
              }
          }
 
 
          ///新增100個TextBlock為測試資料
          for (int i = 1; i <= 100; i++) 
          {
              TextBlock tb = new TextBlock();
              tb.FontSize = 22;
              tb.Width = 200;
              tb.Text = i.ToString();
              this.listBoxMain.Items.Add(tb);
          }
 
 
 
}


其中有呼叫到  GetVisualChildCollection



程式碼為 :




 

public static List<T> GetVisualChildCollection<T>(object parent) where T : UIElement
{
          List<T> visualCollection = new List<T>();
          GetVisualChildCollection(parent as DependencyObject, visualCollection);
          return visualCollection;
}
 
 
private static void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : UIElement
{
          int count = VisualTreeHelper.GetChildrenCount(parent);
          for (int i = 0; i < count; i++)
          {
              DependencyObject child = VisualTreeHelper.GetChild(parent, i);
              if (child is T)
              {
                  visualCollection.Add(child as T);
              }
              else if (child != null)
              {
                  GetVisualChildCollection(child, visualCollection);
              }
          }
}


簡單的說,ListBox的組成,因為在Silverlight 架構中,他其中包含了 Scroll ,上述目的為抓取ScrollBar的部分,這也是Silverlight很具彈性設計的地方..
看一下卷軸值改變時候的事件:



/// <summary>
/// 直向滾動時數值改變的Event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void scrollBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
          this.txtSPValue.Text = (sender as ScrollBar).GetValue(ScrollBar.ValueProperty).ToString();
}


請注意:


因為有人問我說為什麼,他感覺到hold住ListBox 其中的Item進行Scroll的時候,感覺到數值並非即時更新,


似乎會慢一點點,是這樣的,可能是因為效能的關係,在ScrollViewer.ManipulationMode 預設為 "System"


此時需要把ListBox 中的 ScrollViewer.ManipulationMode="Control" 這時候數值連動,就會非常即時



sshot-60_2


如果您控制UI要道非常細緻,這都是不能忽略的小關鍵…此時ListBox XAML Code 為:



<ListBox ScrollViewer.ManipulationMode="Control" Height="601" HorizontalAlignment="Left" Name="listBoxMain" 
VerticalAlignment="Top" Width="169" />


 結果:


sshot-61_2


下載:





參考:


http://www.cnblogs.com/vistach/archive/2011/12/21/Windows_Phone_WP7_ListBox_ScrollBar_Multi_Page.html