我有一个ScrollViewer的StackPannel。用户希望保存ScrollViewer的位置,因此当应用程序重新载入数据时,StackPannel将显示他们之前查看的项目。它与选择哪些项目(如果有的话)无关,仅仅是与StackPannel项目相关的ScrollViewer的药水。 因此,如果StackPannel有50个项目并且ScrollViewer被滚动以便StackPannel的项目20-25可见,我需要重新加载应用程序并向下滚动到那个位置而不选择一个项目。 此外,我正在使用MVVM,我也想通过ViewModel代码设置ScrollViewer位置。WPF和MVVM:保存ScrollViewer的位置和重新加载时设置
4
A
回答
-1
你看过使用ScrollViewer.ScrollInfo属性吗?它的成员表示您可以尝试绑定的每个滚动条的偏移量(HorizontalOffset,VerticalOffset)。不过,我不确定这些是否依赖属性。
另一种选择是在可视树中找到实际的ScrollBar
控件,并绑定到它们中的每一个的Position
属性。
+0
这是一个比一个答案IMO更多评论。 – 2017-06-29 17:34:37
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();
0
您也可以通过调用ScrollToVerticalOffset 方法设置一个ScrollViewer中的位置。
contentScrollViewer.ScrollToVerticalOffset(50);
相关问题
- 1. MVVM WPF保存和加载用户设置设计模式
- 2. 保存和加载div位置 - 缩放并保存加载div位置加载
- 3. WPF如何创建,保存和加载多个设置文件
- 4. 手动设置窗口位置wpf mvvm
- 5. 保存WPF窗口和位置
- 6. 重新加载后保存div内的滚动位置
- 7. 在scrollviewer中保留位置
- 8. 在iOS中保存和加载设置和游戏进度
- 9. ScrollViewer和ScrollToVerticalOffset与mvvm
- 10. 在页面重新加载时保持滚动条位置
- 11. 在IOS中保存和加载大文件的位置
- 12. 保存并加载UIScrollView的位置
- 13. 如何让数组在重新加载时保持设置?
- 14. 重新使用mvvm和wpf的菜单
- 15. WPF:如何重置/重新计算的ScrollViewer “ScrollableHeight”
- 16. 设置ScrollViewer的行和页面大小
- 17. 取消设置和重置某些位
- 18. WPF:重置scatterviewitems的位置?
- 19. 保存重新加载时的选择
- 20. 使用Cookie加载,保存和重置jquery值
- 21. Java Swing保存和加载工作区/设置
- 22. 在页面加载/重新加载时设置选择值
- 23. 在数据重新加载时保存WPF TreeView状态
- 24. iPhone SDK - 加载/保存设置
- 25. Winforms - 动态加载/保存设置
- 26. 保存和恢复NSTextView的位置
- 27. WPF MVVM:视图模型更改时不重新加载视图
- 28. Bootstrap ScrollSpy在页面重新加载后重置位置
- 29. C#Winform:设置文件保存位置
- 30. SSRS URL访问设置保存位置?
我看着scroll.ScrollToHorizontalOffset(),但我想以某种方式结合,对于我的ViewModel – mike 2010-08-10 16:23:25