65.9K
CodeProject 正在变化。 阅读更多。
Home

保存和恢复用户首选项

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.53/5 (17投票s)

2003年7月18日

CPOL

3分钟阅读

viewsIcon

156357

downloadIcon

1354

可以持久化几乎任何信息(包括用户定义的结构、枚举、对象等),按用户保存。

Screen Shot

引言

有几种可用的示例用于保存和恢复应用程序或用户首选项,但大多数仅限于基本类型(数字、日期、布尔值、字符串等),或者需要代码来处理特定类型的对象。我认为这种方法过于限制,而且坦率地说,对于一个相当简单的操作来说过于复杂——将 _X_ 转换为字符串再转换回来。

答案主要在于两个内置接口

  • 所有“基本类型”和枚举都实现了 IConvertable,并标识了可以被直接转换为字符串并还原的东西。
  • IConvertable 是由所有“基本类型”和枚举实现的,它标识了可以被直接转换为字符串并还原的东西。

背景

此示例基于我实际用于将用户首选项保存到 SQL Server 数据库的生产代码构建。演示中的代码已修改为仅使用文本文件。

使用代码

示例代码

以下来自演示代码的摘录显示,保存和恢复各种用户首选项是多么容易:一个 Color、一个 Font 和一个 String。演示还将展示一个 EnumCheckState)、一个 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 是在找不到已保存的首选项时要返回的值。

返回已保存的首选项(如果找到),或者返回提供的 DefaultValueDefaultValueType **必须**与已保存首选项的类型匹配——它用于确定如何还原已保存的值。

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 **不会**禁用 OnSaveSettingsOnLoadSettings,只会禁用基类行为。

关注点

在开发例程时,我发现 DateTime 不是 100%“可转换”的。当 DateTime 转换为 String 时,仅保留秒,而丢弃任何小数部分。为防止数据丢失,DateTime 值在 SavePreference() 中存储为刻度(1/10,000 秒)。

历史

  • 2003 年 11 月 1 日 - 更新了源代码
  • 2004 年 1 月 16 日 - 更新了源代码
© . All rights reserved.