WPF& MVVM:在重新加载时保存ScrollViewer位置和设置

时间:2010-08-10 16:19:14

标签: c# wpf mvvm

我有一个StackPannel的ScrollViewer。用户希望保存ScrollViewer的位置,因此当应用程序重新加载其数据时,StackPannel将显示他们之前正在查看的项目。它与选择的项目(如果有的话)无关,仅与ScrollViewer相对于StackPannel项目的部分有关。 因此,如果StackPannel有50个项目并且滚动ScrollViewer以便StackPannel的项目20-25可见,我需要重新加载应用程序并向下滚动到该位置而不选择项目。 另外,我正在使用MVVM,我也希望通过ViewModel代码设置ScrollViewer位置。

3 个答案:

答案 0 :(得分:5)

下面的示例将在VM中存储滚动偏移量,并在窗口(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();

答案 1 :(得分:0)

您还可以通过调用ScrollToVerticalOffset来设置ScrollViewer的位置 方法

contentScrollViewer.ScrollToVerticalOffset(50);

答案 2 :(得分:-1)

您是否考虑过使用ScrollViewer.ScrollInfo属性?它的成员代表您可以尝试绑定的每个滚动条(HorizontalOffsetVerticalOffset)的偏移量。不过,我不确定这些是依赖属性。

另一种选择是在可视树中找到实际的ScrollBar控件,并绑定到每个控件的Position属性。