這幾天有人問我說如何取得ListBox中捲動了多少..
這剛好我之前有解過,我就想說就把Code整理簡單一點來分享..
介紹一下配置..
在 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" 這時候數值連動,就會非常即時
如果您控制UI要道非常細緻,這都是不能忽略的小關鍵…此時ListBox XAML Code 為:
<ListBox ScrollViewer.ManipulationMode="Control" Height="601" HorizontalAlignment="Left" Name="listBoxMain"
VerticalAlignment="Top" Width="169" />
結果:
下載:
參考: