2010-08-10 85 views
4

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

+0

我看着scroll.ScrollToHorizo​​ntalOffset(),但我想以某种方式结合,对于我的ViewModel – mike 2010-08-10 16:23:25

回答

-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);