2012-10-05

[Windows Phone 7] Mango 密記– 改變 ListBox 捲動

 

在UI控制上面,有時候必須要能夠控制捲動..

包含很多手勢改變數值的部分..都會需要使用到..

曾經有篇文章討論過.. [Windows Phone 7]取得 ListBox 捲動數值

這篇來討論一下如何更改…

sshot-130_2

左邊有一個直的ListBox 裡面有TextBlock 0~100 按下"捲到50"的按鈕後,他會移到那個位置…

首先我們會宣告兩個變數

/// <summary>
/// 抓住ListBox中的ScrollViwer
/// </summary>
private ScrollViewer _SViewer;


/// <summary>
/// 抓住ListBox中的Scroll
/// </summary>
private ScrollBar _SCroll;

 


宣告兩隻指標,讓之後可以抓住 ListBox中的ScrollView 還有ScrollBar ..


void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
List<ScrollViewer> scrollBarViewer = GetVisualChildCollection<ScrollViewer>(listBoxMain);

///下列幾行負責抓取數值
_SViewer = scrollBarViewer[0];


// 取得 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);
_SCroll = scrollBar;
}
else // 此為橫向的
{

}
}



for (int i = 0; i <= 100; i++)
{
this.listBoxMain.Items.Add(new TextBlock { Text=i+"",Height=200} );
}


}

 


在LayoutRoot Loaded 事件時,將 _SViewer  , _SCroll 都指向 ListBox 中的 ScrollBar 還有ScrollViewer 之後..


下面兩個function 是去抓取ListBox 中VisaulChild 部分


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);
}
}
}

這樣 我們就可以透過.. ScrollToVerticalOffset 去設定垂直的數值…


private void btnTest1_Click(object sender, RoutedEventArgs e)
{
_SViewer.ScrollToVerticalOffset(50);
}

 

當然還有 ScrollToHorizontalOffset  這樣就可以自行控制,ListBox捲動..

 

在UI控制上面會變得很方便… 當然沒有做滑動的控制,只需要加上timer 就會有滑動的效果..

 

 

sshot-131_2

 

 

參考範例: