我有一个 StackPannel 的 ScrollViewer。用户希望保存 ScrollViewer 的位置,以便当应用程序重新加载其数据时,StackPannel 将显示他们之前查看的项目。它与选择哪些项目(如果有的话)无关,而只是 ScrollViewer 相对于 StackPannel 项目的部分。
因此,如果 StackPannel 有 50 个项目,并且 ScrollViewer 滚动以便 StackPannel 的项目 20-25 可见,我需要重新加载应用程序并向下滚动到该位置而不选择项目。
另外,我正在使用 MVVM,我也想通过 ViewModel 代码设置 ScrollViewer 位置。
下面的示例将在虚拟机中存储滚动偏移并在窗口(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; }
}
}
Usage:
private void OnOpenOpenTestWindow(object sender, RoutedEventArgs e)
{
TestWindow testWindow = new TestWindow();
testWindow.DataContext = _vm;
testWindow.Show();
}
private VM _vm = new VM();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)