保存和恢复用户首选项
可以持久化几乎任何信息(包括用户定义的结构、枚举、对象等),按用户保存。
引言
有几种可用的示例用于保存和恢复应用程序或用户首选项,但大多数仅限于基本类型(数字、日期、布尔值、字符串等),或者需要代码来处理特定类型的对象。我认为这种方法过于限制,而且坦率地说,对于一个相当简单的操作来说过于复杂——将 _X_ 转换为字符串再转换回来。
答案主要在于两个内置接口
- 所有“基本类型”和枚举都实现了
IConvertable
,并标识了可以被直接转换为字符串并还原的东西。 IConvertable
是由所有“基本类型”和枚举实现的,它标识了可以被直接转换为字符串并还原的东西。
背景
此示例基于我实际用于将用户首选项保存到 SQL Server 数据库的生产代码构建。演示中的代码已修改为仅使用文本文件。
使用代码
示例代码
以下来自演示代码的摘录显示,保存和恢复各种用户首选项是多么容易:一个 Color
、一个 Font
和一个 String
。演示还将展示一个 Enum
(CheckState
)、一个 DateTime
、一个 Image
和一个用户定义的 Structure
(通过 frmWindowSettings
)。移动窗体,调整大小——下次运行应用程序时,它会保持相同的状态。
Protected Overrides Sub OnLoadSettings()
' Let mybase do its thing...
MyBase.OnLoadSettings()
' Load my form's data:
' TextBox attributes: text (String), font (Object), color (Structure)
tbFreeForm.ForeColor = CType(UserPreferences.GetPreference
("FREEFORM.COLOR", tbFreeForm.ForeColor), Color)
tbFreeForm.Font = CType(UserPreferences.GetPreference
("FREEFORM.FONT", tbFreeForm.Font), Font)
tbFreeForm.Text = CType(UserPreferences.GetPreference
("FREEFORM.TEXT", tbFreeForm.Text), String)
End Sub
Protected Overrides Sub OnSaveSettings()
' Let mybase do its thing...
MyBase.OnSaveSettings()
' Save my form's data:
UserPreferences.SavePreference("FREEFORM.COLOR",
tbFreeForm.ForeColor, True)
UserPreferences.SavePreference("FREEFORM.FONT", tbFreeForm.Font, True)
UserPreferences.SavePreference("FREEFORM.TEXT", tbFreeForm.Text, True)
' Since this is the "main" window, now we
' tell UserPrefs to actually save:
UserPreferences.SavePreferences()
End Sub
UserPreferences
UserPreferences
类有几个静态(Shared)方法
Public Shared Function GetPreference(ByVal Key As String,
ByVal DefaultValue As Object) As Object
Key
是首选项的唯一标识符DefaultValue
是在找不到已保存的首选项时要返回的值。
返回已保存的首选项(如果找到),或者返回提供的 DefaultValue
。 DefaultValue
的 Type
**必须**与已保存首选项的类型匹配——它用于确定如何还原已保存的值。
Public Shared Sub SavePreference(ByVal Key As String, ByVal Value As Object,
ByVal Persist As Boolean)
Key
是首选项的唯一标识符Value
是要保存的值Persist
确定值是否在会话之间保存(True
),还是仅在应用程序运行时存储在内存中(False
)。
将指定值保存到本地缓存;可以选择将其持久化到文件。
Public Shared Property AutoSave() As Boolean
设置 UserPreferences
的保存模式:使用 AutoSave = True
可在每次调用 SavePreference
时启用原子(键/值)保存。使用 AutoSave = False
可使用批量保存方法。演示仅支持 AutoSave = False
。
Public Shared Function DefaultFileName() As String
返回用于保存/加载用户首选项的默认文件名。格式为
x:\Documents and Settings\<username>\Application Data\
<exename>\Preferences.dat
Public Shared Sub FetchPreferences(Optional ByVal FileName As String = "")
FileName
是要使用的文件名(或DefaultFileName
,如果未提供)。
加载指定文件中的所有已保存用户首选项。
Public Shared Sub SavePreferences(Optional ByVal FileName As String = "")
FileName
是要使用的文件名(或 DefaultFileName,如果未提供)。
将所有用户首选项保存到指定的文件。
frmWindowSettings
还包含一个基类窗体,该窗体自动保存和恢复其最后一个大小、位置和状态。在创建新窗口时,我将此窗体用作继承的基础。它提供了自定义“事件”以便轻松添加加载/保存代码,以及一个新属性
Protected Overridable Sub OnLoadSettings()
在窗体和控件创建和初始化后调用。
Protected Overridable Sub OnSaveSettings()
在窗体关闭时调用。
Protected Overridable Sub OnRendered()
在窗体首次可见时调用。
Public Property SaveSettings() As Boolean
设置为 True
以启用窗口大小/位置还原(默认);设置为 False
以禁用。 SaveSettings = False
**不会**禁用 OnSaveSettings
或 OnLoadSettings
,只会禁用基类行为。
关注点
在开发例程时,我发现 DateTime
不是 100%“可转换”的。当 DateTime
转换为 String
时,仅保留秒,而丢弃任何小数部分。为防止数据丢失,DateTime
值在 SavePreference()
中存储为刻度(1/10,000 秒)。
历史
- 2003 年 11 月 1 日 - 更新了源代码
- 2004 年 1 月 16 日 - 更新了源代码