Ниже пример сохранит смещение прокрутки в виртуальной машине и загрузит его, когда откроется окно (TestWindow).Вы также должны сохранить и загрузить размер окна, так как это, скорее всего, также повлияет на смещение прокрутки.Если вы хотите, вы можете переместить код позади в TestWindow в присоединенный класс поведения.
XAML:
<Window x:Class="ScrollTest.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="200" Width="300"
Loaded="OnLoaded"
Closing="OnClosing">
<Grid>
<ScrollViewer Name="_scroll" VerticalScrollBarVisibility="Auto">
<StackPanel>
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
<Button Content="Click me" />
</StackPanel>
</ScrollViewer>
</Grid>
</Window>
Код сзади:
using System;
using System.ComponentModel;
using System.Windows;
namespace ScrollTest
{
public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
_scroll.ScrollToVerticalOffset((DataContext as VM).ScrollOffset);
}
private void OnClosing(object sender, CancelEventArgs e)
{
(DataContext as VM).ScrollOffset = _scroll.VerticalOffset;
}
}
public class VM
{
public double ScrollOffset { get; set; }
}
}
Использование:
private void OnOpenOpenTestWindow(object sender, RoutedEventArgs e)
{
TestWindow testWindow = new TestWindow();
testWindow.DataContext = _vm;
testWindow.Show();
}
private VM _vm = new VM();