/// <summary> /// ListView가 Scroll이 될 때의 동작 정의 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _scrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) { var nowScrollViewer = sender as ScrollViewer; var scrollableHeight = nowScrollViewer.ScrollableHeight; var verticalOffset = nowScrollViewer.VerticalOffset; if (scrollableHeight == 0) { return; } int scope = 50; var topScope = scope; // 이전의 자료를 가져오기 위한 범위 var bottomScope = scrollableHeight - scope; // 이후의 자료를 가져오기 위한 범위 // 해당 범위 안에 들어갔을 경우 데이터를 가져온다. 현재는 무제한으로. if (verticalOffset < topScope && !IsTopScrolled) { if (IsUnlimitedData) { var newDateGroup = DateCollection.GetMoreItems(0, 10, DateTests, nextDirection: false); DateTests.Insert(0, newDateGroup); IsTopScrolled = true; } } else if (verticalOffset > bottomScope && !IsBottomScrolled) { if (IsUnlimitedData) { var newDateGroup = DateCollection.GetMoreItems(DateTests.Count - 1, 10, DateTests, nextDirection: true); DateTests.Add(newDateGroup); IsBottomScrolled = true; } } // 맨 위로 가거나 맨 아래로 가면 다시 자료를 가져오게 만들어야 함 if (verticalOffset < topScope && IsTopScrolled) { IsTopScrolled = false; } else if (verticalOffset > bottomScope && IsBottomScrolled) { IsBottomScrolled = false; } }
/// <summary> /// 현재 Render 되어 있는 ListViewItem을 별도의 ListView에 표기 /// </summary> /// <param name="isRecycle"></param> /// <param name="dateTest"></param> public void CheckRecycleRenderedList(bool isRecycle, DateItem dateTest, ListViewItem nowItem) { if (isRecycle) // 다시 가상화 되는 상태 { NowRenderedList.Remove(dateTest); } else { NowRenderedList.Add(dateTest); } NowCount.Text = "Now rendered items count : " + NowRenderedList.Count.ToString(); // PointerWheelChagnedEvent 가 발생하지 않으므로 Container에서 검색해서 Index가 ItemSource의 Count와 같으면 맨 끝으로 간주 var renderedLastItem = NowRenderedList.OrderBy(x => x.Name).LastOrDefault(); var endItem = DateTests.LastOrDefault().LastOrDefault() as DateItem; if (renderedLastItem == endItem) { //AddNewData(); } }