web-dev-qa-db-ja.com

ScrollViewerがWPFで最後までスクロールされていることを確認するにはどうすればよいですか?

カスタムコントロールにScrollViewerインスタンスがあります... scorollviewが最後までスクロールされるかどうかの要件が必要ですか?方法はありますか?

27
David Bekham

これは次の方法で確認できます。

...
scrollViewer.ScrollChanged += OnScrollChanged;
...

private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
   var scrollViewer = (ScrollViewer)sender;
   if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
          MessageBox.Show("This is the end"); 
}
45
Catherine

これが私のMVVM対応バージョンです:

public static class ScrollHelper
{
    public static readonly DependencyProperty ScrollToBottomProperty = DependencyProperty.RegisterAttached("ScrollToBottom", typeof(ICommand), typeof(ScrollHelper), new FrameworkPropertyMetadata(null, OnScrollToBottomPropertyChanged));

    public static ICommand GetScrollToBottom(DependencyObject ob)
    {
        return (ICommand) ob.GetValue(ScrollToBottomProperty);
    }

    public static void SetScrollToBottom(DependencyObject ob, ICommand value)
    {
        ob.SetValue(ScrollToBottomProperty, value);
    }

    private static void OnScrollToBottomPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var scrollViewer = obj as ScrollViewer;

        scrollViewer.Loaded += OnScrollViewerLoaded;

    }

    private static void OnScrollViewerLoaded(object sender, RoutedEventArgs e)
    {
        (sender as ScrollViewer).Loaded -= OnScrollViewerLoaded;

        (sender as ScrollViewer).Unloaded += OnScrollViewerUnloaded;
        (sender as ScrollViewer).ScrollChanged += OnScrollViewerScrollChanged;
    }

    private static void OnScrollViewerScrollChanged(object sender, ScrollChangedEventArgs e)
    {           
        var scrollViewer = (ScrollViewer)sender;
        if (scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight)
        {
            var command = GetScrollToBottom(sender as ScrollViewer);
            if (command == null || !command.CanExecute(null))
                return;

            command.Execute(null);
        }
    }

    private static void OnScrollViewerUnloaded(object sender, RoutedEventArgs e)
    {
        (sender as ScrollViewer).Unloaded -= OnScrollViewerUnloaded;
        (sender as ScrollViewer).ScrollChanged -= OnScrollViewerScrollChanged;
    }

}
5
Jordan