我有一个StackPannel的ScrollViewer。用户希望保存ScrollViewer的位置,因此当应用程序重新加载其数据时,StackPannel将显示他们之前正在查看的项目。它与选择的项目(如果有的话)无关,仅与ScrollViewer相对于StackPannel项目的部分有关。 因此,如果StackPannel有50个项目并且滚动ScrollViewer以便StackPannel的项目20-25可见,我需要重新加载应用程序并向下滚动到该位置而不选择项目。 另外,我正在使用MVVM,我也希望通过ViewModel代码设置ScrollViewer位置。
答案 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属性?它的成员代表您可以尝试绑定的每个滚动条(HorizontalOffset,VerticalOffset)的偏移量。不过,我不确定这些是依赖属性。
另一种选择是在可视树中找到实际的ScrollBar
控件,并绑定到每个控件的Position
属性。