読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

WinRT:ListBoxでひっぱって更新をする

スクロールバウンズ

ListBoxは通常ではアイテムをスクロールして一番上に行った時や一番下までスクロールしたことを知ることができません。

タイムライン系のアプリではListBoxをひっぱって更新などがよく用いられるのでListBoxで一番上までスクロールしたという情報は必要です。

 

ListBoxの中のScrollViewerを取得する

ListBoxのスクロールバウンズを取得するにはListBoxを構成する要素の一つであるScrollViewerを取得します。

既存のコントロールの構成要素を取得するにはVisualTreeHelperを使ってたどって行きます。

 

まず、ListBoxのLoadedイベントでVisualTreeHelperを使います。

必ず、Loadedイベント以降でないと、コンストラクタなどでVisualTreeHelperを使うとnullが返ってきます。

 

ScrollViewerを取得することができたら、ViewChangedイベント内で、VerticalOffsetの値をみれば今どこまでスクロールしているのかがわかります。

private void listBox_Loaded(object sender, RoutedEventArgs e)
{
    var border = (Border)VisualTreeHelper.GetChild(this.listBox,0);
    var scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border,0);
    scrollViewer.ViewChanged += (s, arg) =>
    {
        ScrollViewer viewer=s as ScrollViewer;
        if (viewer.VerticalOffset <= 2)
        {
            Debug.WriteLine("トップ");
        }
        if (viewer.VerticalOffset == viewer.ScrollableHeight)
        {
            Debug.WriteLine("ボトム");
        }
    };
  
}