WPF & MVVM: сохранить положение ScrollViewer и установить при перезагрузке - PullRequest
4 голосов
/ 10 августа 2010

У меня есть ScrollViewer для StackPannel.Пользователи хотят сохранить положение ScrollViewer, чтобы при повторной загрузке приложения со своими данными StackPannel отображал элементы, которые они просматривали ранее.Он не имеет никакого отношения к тому, какие элементы были выбраны, если таковые имеются, просто зелье ScrollViewer по отношению к элементам StackPannel.Итак, если StackPannel имеет 50 элементов и ScrollViewer прокручивается так, что элементы 20-25 StackPannel видимы, мне нужно перезагрузить приложение и прокрутить вниз до этой позиции без выбора элемента.Кроме того, я использую MVVM и хочу установить положение ScrollViewer с помощью кода ViewModel.

Ответы [ 3 ]

5 голосов
/ 11 августа 2010

Ниже пример сохранит смещение прокрутки в виртуальной машине и загрузит его, когда откроется окно (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();
0 голосов
/ 16 сентября 2011

Вы также можете установить положение ScrollViewer, вызвав метод ScrollToVerticalOffset .

contentScrollViewer.ScrollToVerticalOffset(50);
0 голосов
/ 10 августа 2010

Рассматривали ли вы использование свойства ScrollViewer.ScrollInfo ? В нем есть элементы, представляющие смещение каждой полосы прокрутки ( HorizontalOffset , VerticalOffset ), к которой можно попытаться привязать. Я не уверен, что это свойства зависимостей.

Другой вариант - найти действительные ScrollBar элементы управления в визуальном дереве и связать их со свойством Position каждого из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...