【问题标题】:WPF & MVVM: Save ScrollViewer Postion And Set When ReloadingWPF 和 MVVM:保存 ScrollViewer 位置并在重新加载时设置
【发布时间】:2010-08-10 16:19:14
【问题描述】:

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

【问题讨论】:

  • 我已经查看了 scroll.ScrollToHorizo​​ntalOffset() 但我想以某种方式为我的 ViewModel 绑定它

标签: c# wpf mvvm


【解决方案1】:

下面的示例将在 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();

【讨论】:

    【解决方案2】:

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

    contentScrollViewer.ScrollToVerticalOffset(50);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多