WPF 和 MVVM:保存 ScrollViewer 位置并在重新加载时设置

2024-04-14

我有一个 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(使用前将#替换为@)

WPF 和 MVVM:保存 ScrollViewer 位置并在重新加载时设置 的相关文章

  • 我们可以在 C# 中定义枚举的隐式转换吗?

    是否可以在 C 中定义枚举的隐式转换 可以实现这一目标的东西吗 public enum MyEnum one 1 two 2 MyEnum number MyEnum one long i number 如果没有 为什么不呢 有一个解决方案
  • MVC。网络错误:初始化字符串的格式不符合从索引 0 开始的规范

    我的连接字符串是
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • 在 2 个 .c 文件之间共享函数

    dir1有dir2 file1 c和file1 h dir2 有 file2 c 现在 如果我想在 file2 c 中访问 file1 c 中定义的函数 我需要在 file1 h 中声明它并在 file2 c 中包含 file1 h 这是一
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 多态性中基类缺少虚拟析构函数 = 资源泄漏?

    我们知道 如果要多态地使用基类 则需要将基类的析构函数指定为 virtual 否则程序中可能会出现资源泄漏 因为只会调用基类析构函数 而不会调用派生对象析构函数 我们还知道构造函数 析构函数纯粹是初始化 未初始化构造 而operator n
  • 将标准库添加到C++ eclipse项目中

    一个 非常 新手 C 问题 有没有办法自动将标准库添加到 C eclipse 项目中 我安装了 CDT 主要功能插件 您可以手动添加 STL 标头的路径路径和符号 gt 包含选项卡 http help eclipse org galileo
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • ObjectTrackingEnabled 和 linq-to-sql

    I read here http www sidarok com web blog content 2008 05 02 10 tips to improve your linq to sql application performance
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 如何“全局”捕获对象实例中引发的异常

    我目前正在编写一个 winforms 应用程序 C 我正在使用企业库异常处理块 遵循我所看到的相当标准的方法 IE 在 Program cs 的 Main 方法中 我已将事件处理程序连接到 Application ThreadExcepti
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • 如何在 Autofac 中使用工厂模式?

    目前我有以下内容 public interface IService void Start public class FirstService IService 我通过执行以下操作来解决该服务 using var scope lifetim
  • RMarkdown PDF 输出中未显示某些 Unicode 字符

    我正在尝试将一些课程笔记整理为 PDF 但无法正确显示某些 Unicode 字符 使用xelatex https en wikipedia org wiki XeTeXLatex 引擎对于渲染文档是必需的 使用默认引擎会因无法识别的字符而导
  • 挂钩 Win32 窗口创建/调整大小/查询大小

    我正在尝试 扩展 现有的应用程序 The goal就是在不更改应用程序代码的情况下使现有应用程序变得更大 一个约束拉伸的应用程序不会 注意到 它 因此 如果应用程序查询创建的窗口大小 它将看到原始大小 而不是调整后的大小 我设法使用调整窗口
  • Mayavi (Python) 中的 TVTK 错误

    我正在运行 Fedora 17 x64 机器 并且我尝试通过以下方式安装 Mayavi for python yum install mayavi 工作得很好 除了每次我编写调用 mayavi 模块 如 mlab 的代码时 from ent
  • 根据时间戳间隔创建 csv 文件的数据框

    我相信我的问题非常简单 并且一定有一个非常简单的方法来解决这个问题 但是由于我对Python 特别是pandas很陌生 我无法自己解决它 我有数百个 csv 文件 格式如下 text 2014 02 22 13 00 00 所以格式是str
  • 如何强制 QCompleter 检查 QLineEdit 中的第二个单词

    我有一个功能可以实现带有自动完成功能的文本框 我找到了一个使用 QLineEdit 和 QCompleter 的代码 因此我有我的字符串值 一 二 三 等 一旦我输入 on 完成器就会建议我列表中带有前缀 on 的每个单词 但是当我从列表中
  • 关闭还是不关闭 Oracle 连接?

    我的应用程序存在性能问题 因此我开始从根本上调查这个问题 与数据库的连接 最佳实践说 打开连接 使用它并尽快关闭 但我不知道这会导致的开销 所以问题是 1 尽快打开 使用 关闭连接是使用 ODP NET 的最佳方法吗 2 有没有办法以及如何
  • 使用 CertPathBuilder 构建证书路径时无法获得受信任的根 CA

    我有最终实体 一些中间 CA 和一些受信任 CA 的证书 并且我正在尝试使用CertPathBuilder找到最终实体和可信 CA 之一之间的认证路径 但是 我当前的实现包括任何中间 CA 和最终实体 但未能包括受信任的根 我已经尝试过 B
  • 提供额外的媒体资源(图形/声音)作为 Google Play 应用内计费项目

    在我通过 Google Play 提供的 Android 应用程序中 我想提供可以通过应用程序内结算购买的其他项目 我想要提供的项目类型是媒体内容 例如图形和声音 这些内容通常会进入res应用程序的文件夹 当然 问题是这些资源必须受到保护
  • 使用 LINQ 从两个不同的列表创建对,其中条目具有相同的属性

    我有两个清单Requests and Responses谁继承了抽象AbstractLineModel班级 响应和请求都包含一个 或不包含 名为RequestId A CallPair包含一对匹配的Request and a Respons
  • SAML 名称 ID 策略

    我对单点登录 SSO 的概念还很陌生 我发现 SAML 请求和响应是实现 SSO 流程的最佳方式 然后我开始阅读有关 SAML2 0 的内容 我来到了一个学期名称 ID 策略在 saml 2 0 中 这在 saml 1 0 中不存在 定义说
  • pandas 中的多行是否可以有一个唯一索引?

    pandas 中的多行是否可以有一个唯一索引 例子 index country value 1 NL hi 2 NL wet 3 SWE 4 4 SWE maybe 因此 在本示例中 我无法将 NL 设置为索引 因为它不是唯一的 panda
  • Python 错误,“‘模块’对象没有属性‘lstrip’”

    Python 文档来自http docs python org library string html http docs python org library string html string lstrip s chars 返回删除了
  • 将特定 JSON 字段从 .responseText 提取到单个 Excel 单元格

    我正在尝试从 JSON 中检索特定字段 resolve 我不确定如何才能获得这一领域 我添加了 Msgbox Exists Fail 以查看代码是否能够读取单元格内的单词 resolve 但是我返回失败 有什么办法可以让我只获得现场解析吗
  • Doctrine - 如何在 postSave() 事件中获取 SQL INSERT 查询?

    我想获得当调用对象的 save 方法时 Doctrine 生成的确切 SQL INSERT 查询 最好 我想在模型的 postSave 事件中获取它并将其记录在 txt 文件中 例如 我想获取 记录以下 SQL 查询 INSERT INTO
  • 如何从 YouTube URL 获取 flv 文件路径

    我有一个 SWF 媒体播放器 播放 flv 视频 但我想让它播放 youtube 视频 所以我必须传递给播放器flv文件路径 该场景是一个我可以上传视频或输入网址的网站 我可以输入 YouTube 视频 URL 我正在使用 ASP NET
  • 如何加载图像以在 RCP 中查看?

    我正在开发一个RCP plugin project其中包括某些视图 第一个视图 员工详细信息 例如name address等等 有一个选项可以使用浏览按钮上传员工图像 第二个视图显示在第一个视图中输入的详细信息 除照片之外的所有详细信息都显
  • GitHub Actions - 如何在子目录中构建项目

    我正在使用 GitHub Actions 构建我的项目 但我的 Dart 项目位于存储库的子目录中 动作脚本找不到我的pubspec yaml并获取依赖项 如何指向我的 GitHub Action 在我的存储库的子目录中查找源代码 root
  • 如何使用 javascript 更改 div 内的 HTML 代码? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在构建一个 HTML 网站 该网站的页面太多 所以我想要一个代码 以便我可以从我的网站编辑特定的 div 以便它将应用于我的网站中的所
  • WPF 和 MVVM:保存 ScrollViewer 位置并在重新加载时设置

    我有一个 StackPannel 的 ScrollViewer 用户希望保存 ScrollViewer 的位置 以便当应用程序重新加载其数据时 StackPannel 将显示他们之前查看的项目 它与选择哪些项目 如果有的话 无关 而只是 S