Я хотел бы создать следующее поведение в a ScrollViewer
это переносится ContentControl
:
Когда ContentControl
высота растет, ScrollViewer
должен автоматически прокрутить в конец. Это легко к achive при помощи ScrollViewer.ScrollToEnd()
.
Однако, если пользователь использует полосу прокрутки, автоматической прокрутки не должно больше происходить. Это подобно тому, что происходит в окне вывода VS, например.
Проблема состоит в том, чтобы знать, когда прокрутка произошла из-за пользователя, прокручивающего и когда это произошло потому что измененный размер содержания. Я пытался играть с ScrollChangedEventArgs
из ScrollChangedEvent
, но не мог заставить это работать.
Идеально, я не хочу обрабатывать всю возможную Мышь и события клавиатуры.
Этот код будет автоматически прокручиваться до конца при увеличении содержимого, если ранее оно было прокручено до конца вниз.
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();
}
}
}