Как автоматически прокрутить ScrollViewer - только если пользователь не сменил положение прокрутки

Я хотел бы создать следующее поведение в a ScrollViewer это переносится ContentControl:
Когда ContentControl высота растет, ScrollViewer должен автоматически прокрутить в конец. Это легко к achive при помощи ScrollViewer.ScrollToEnd().
Однако, если пользователь использует полосу прокрутки, автоматической прокрутки не должно больше происходить. Это подобно тому, что происходит в окне вывода VS, например.

Проблема состоит в том, чтобы знать, когда прокрутка произошла из-за пользователя, прокручивающего и когда это произошло потому что измененный размер содержания. Я пытался играть с ScrollChangedEventArgsиз ScrollChangedEvent, но не мог заставить это работать.

Идеально, я не хочу обрабатывать всю возможную Мышь и события клавиатуры.

31
задан Elad 6 June 2010 в 15:48
поделиться

1 ответ

Этот код будет автоматически прокручиваться до конца при увеличении содержимого, если ранее оно было прокручено до конца вниз.

XAML:

<Window x:Class="AutoScrollTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <ScrollViewer Name="_scrollViewer">
        <Border BorderBrush="Red" BorderThickness="5" Name="_contentCtrl" Height="200" VerticalAlignment="Top">
        </Border>
    </ScrollViewer>
</Window>

Code behind:

using System;
using System.Windows;
using System.Windows.Threading;

namespace AutoScrollTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = new TimeSpan(0, 0, 2);
            timer.Tick += ((sender, e) =>
                {
                    _contentCtrl.Height += 10;

                    if (_scrollViewer.VerticalOffset == _scrollViewer.ScrollableHeight)
                    {
                        _scrollViewer.ScrollToEnd();
                    }
                });
            timer.Start();
        }
    }
}
9
ответ дан 27 November 2019 в 21:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: