windowsphone開發listbox滾到底

l_serein發表於2012-11-08

假如ListBox控制元件繫結的資料很大的時候,通常會造成載入的速度很慢,那麼有一種互動方案可以優化一下這種情況,就是先在ListBox上載入一部分 的資料,等到使用者檢視的時候將ListBox滾動到底的時候再載入一部分資料。但是在ListBox控制元件裡面根本就沒有相關的事件和屬性來判斷出來 ListBox什麼時候滾動到底了,那麼下面講解一種解決的方法。 
     ListBox控制元件其實是封裝了ScrollViewer控制元件和ScrollBar控制元件在裡面的。那這就好辦了,通過獲取ListBox控制元件裡面封裝的ScrollViewer控制元件,然後通過ScrollViewer控制元件的屬性就可以判斷出來ListBox控制元件是否滾動到底了。 

下面看一下程式碼:

1

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

2

    <ListBox Name="listbox1" MouseMove="listbox1_MouseMove" >

 

3

    </ListBox>

4

</Grid>

01

using System;

 

02

using System.Collections.Generic;

03

using System.Windows;

 

04

using System.Windows.Controls;

05

using System.Windows.Input;

 

06

using System.Windows.Media;

07

using Microsoft.Phone.Controls;

 

08

 

09

namespace ListBoxUpdate

 

10

{

11

    public partial class MainPage : PhoneApplicationPage

 

12

    {

13

        public MainPage()

 

14

        {

15

            InitializeComponent();

 

16

 

17

            for (int i = 0; i < 30; i++)

 

18

            {

19

                listbox1.Items.Add("專案"+i);

 

20

            }

21

             

 

22

        }

23

 

 

24

        private void listbox1_MouseMove(object sender, MouseEventArgs e)

25

        {

 

26

            //獲取listbox的子型別ScrollViewer

27

            ScrollViewer scrollViewer = FindChildOfType<ScrollViewer>(listbox1);//ScrollViewer  scrollBar

 

28

            if (scrollViewer == null)

29

            {

 

30

                throw new InvalidOperationException("erro");

31

            }

 

32

            else

33

            {

 

34

                //判斷當前滾動的高度是否大於或者等於scrollViewer實際可滾動高度,如果等於或者大於就證明到底了

35

                if (scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight)

 

36

                {

37

                    //處理listbox滾動到底的事情

 

38

                    for (int i = 0; i < 10; i++)

39

                    {

 

40

                        int k = listbox1.Items.Count;

41

                        listbox1.Items.Add("專案" + k);

 

42

                        k++;

43

                    }

 

44

                }

45

            }

 

46

        }

47

 

 

48

        //獲取子型別

49

        static T FindChildOfType<T>(DependencyObject root) where T : class

 

50

        {

51

            var queue = new Queue<DependencyObject>();

 

52

            queue.Enqueue(root);

53

 

 

54

            while (queue.Count > 0)

55

            {

 

56

                DependencyObject current = queue.Dequeue();

57

                for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)

 

58

                {

59

                    var child = VisualTreeHelper.GetChild(current, i);

 

60

                    var typedChild = child as T;

61

                    if (typedChild != null)

 

62

                    {

63

                        return typedChild;

 

64

                    }

65

                    queue.Enqueue(child);

 

66

                }

67

            }

 

68

            return null;

69

        }

 

70

    }

71

}

 

相關文章