UWP/WinRT:如何保存然后恢复简单的文本框以从终止状态恢复?

Wil*_*nes 5 textbox windows-runtime c++-cx uwp

在描述 Windows 10 UWP 应用程序生命周期的文档中,它指出:

用户现在希望您的应用程序在设备上执行多任务时能够记住其状态。例如,他们希望页面滚动到相同的位置,并且所有控件都处于与以前相同的状态。通过了解启动、挂起和恢复的应用程序生命周期,您可以提供这种无缝行为。

然而,似乎没有太多关于如何实现这一目标的文档。我认为所有内容都是由应用程序开发人员手动保存的,然后在恢复时使用应用程序挂起时隐藏的任​​何数据从头开始重新创建,所有这些都是为了造成应用程序的确切内存状态从未改变的错觉。

我试图仅使用一个最小的示例(一个仅包含 TextBox 的 XAML 页面)来解决这个问题。但即使在这种情况下,我还是有点难以理解如何实现目标。我将提供更一般的想法,但我的具体问题只是如何保存然后恢复一个简单的文本框以从终止状态恢复?我正在使用 C++/CX 工作,但会寻求我能得到的任何帮助。

到目前为止,我对此的想法如下:

  • 显然,至少必须保存 TextBox 的文本。
    • 这可以保存到ApplicationData::Current->LocalSettings.
    • 我立即看到的一个问题是,我上面引用的有关生命周期的文档指出,应用程序必须在挂起信号或面临终止后的 5 秒内完成保存。文本框可能会保存大量数据,导致在繁忙的 IO 情况下可能会导致保存被切断,特别是如果我们开始扩展到微不足道的单个 TextBox 情况之外。
    • 幸运的是,该文档指出,“我们建议您为此目的使用应用程序数据 API,因为它们保证在应用程序进入挂起状态之前完成。有关详细信息,请参阅使用 UWP 应用程序访问应用程序数据。” 不幸的是,当您点击该链接时,没有任何相关内容提供更多详细信息,而且我在 API 中找不到任何记录此行为的内容。通过保存到ApplicationData::Current->LocalSettings我们是否可以避免因数据损坏或丢失而被切断?
  • 一旦满足了最低要求,接下来我们可能需要额外的内容,例如光标和窗口位置。
    • 我们可以使用 获取光标位置TextBox->SelectionStart,据我所知,返回当前光标位置的用法在 API 中没有记录。这似乎也很适合存储为intinto ApplicationData::Current->LocalSettings
    • 我们如何获取、保存和恢复TextBox窗口的滚动位置?
  • 现在我们已经有了额外的东西,那么困难的东西怎么样,比如撤消历史记录?我认为这是不可能的,因为我在 Stackoverflow 上关于如何访问 TextBox 的撤消功能的问题没有得到答案。尽管如此,如果他们切换到另一个应用程序,然后回来认为由于我们实现了完美且无缝的终止恢复,该应用程序从未关闭,并且他们的撤消历史记录已被清除,那么用户体验似乎确实很差。
  • 是否还需要为文本框保存其他内容才能创建理想的用户体验?我错过了什么还是有更简单的方法来完成这一切?像 Microsoft 的 Edge 浏览器这样的东西如何处理复杂的情况,其中有数十个选项卡、表单输入、滚动位置等都需要在 5 秒内保存?

chu*_*e x 1

您引用的应用程序生命周期文档已针对 Windows 10 进行了更新,但似乎丢失了您想知道的一些重要部分。

\n

我发现了一篇旧的博客文章,管理应用程序生命周期,让您的应用程序感觉“永远活着”,这似乎是您链接的灵感。

\n

在博客文章的最后,有一段内容如下:

\n
\n

在正确的时间保存正确的数据

\n

在应用程序的整个生命周期中始终增量保存重要数据。由于您的应用程序只有最多五秒的时间来运行挂起事件处理程序代码,因此您需要确保重要的应用程序数据在挂起时已保存到持久存储中。

\n

在编写应用程序时,您需要管理两种类型的数据:会话数据和用户数据。会话数据是与用户\xe2\x80\x99s当前在应用程序中的体验相关的临时数据。例如,用户正在查看的当前股票、用户在电子书中阅读的当前页面或一长串项目中的滚动位置。用户数据是持久的,并且无论如何都必须始终可供用户访问。例如,用户正在输入的正在进行的文档、在应用程序中拍摄的照片或用户\xe2\x80\x99 的游戏进度。

\n
\n

鉴于上述情况,我将尝试回答您的问题:

\n
\n

如何保存并恢复一个简单的文本框以从终止状态恢复?

\n
\n

当最终用户在文本框中输入内容时,应用程序会将后台内容保存到数据存储中。借用文字处理软件的工作原理,您可以自动保存文本框“文档”。我认为文本框内容就是上面的博客文章所描述的“用户数据”。由于保存是在暂停之外完成的,因此无需担心时间窗口。

\n

当您的应用程序从终止状态恢复时,它会检查数据存储并将所有数据加载到文本框中。

\n
\n

一旦满足了最低要求,接下来我们可能需要额外的内容,例如光标和窗口位置。

\n
\n

我会将这些项目视为“会话数据”,并在暂停期间保存它们。毕竟,在应用程序处于活动状态时无需跟踪此信息。用户不关心10分钟前开始打字时光标在哪里——他只关心暂停时的光标位置。

\n
\n

那些困难的事情怎么样,比如撤消历史记录?

\n
\n

我认为撤消历史记录是“用户数据”,并会在发生时(暂停之外)保存它。换句话说,当用户输入内容时,您的应用程序应该保存撤消所需的信息。

\n