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

创建自定义设置提供程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.52/5 (18投票s)

2007 年 10 月 18 日

CPOL

3分钟阅读

viewsIcon

263787

downloadIcon

10141

演示如何编写自定义设置提供程序。

引言

本文演示了如何编写自定义设置提供程序,以便您可以将 My.Settings 持久化到自己的存储系统中。提供的示例在应用程序文件夹中创建了一个 XML 文件,这对于可移植应用程序非常理想。它还包括有关如何将存储实现到 U3 兼容 USB 设备上的简要详细信息。

背景

.NET 2.0 引入的 My.Settings 功能通过提供一种通用、易于使用且经过深思熟虑的加载/保存设置的方法,为开发人员节省了大量时间和重复的精力。对于标准的 WinForms 应用程序,这效果很好,可以自动分离本地和漫游设置,并将它们分别存储在Documents and Settings\User\Local Settings\Application DataDocuments and Settings\User\Application Data 文件夹层次结构中。但是,如果您没有典型场景,例如希望将设置存储在网络驱动器上,或者希望它们与应用程序一起便携以便可以从 USB 设备运行,该怎么办?与 .NET 框架中的大多数事物一样,您可以覆盖此默认行为,这是值得庆幸的。在这种情况下,是通过编写自己的 Settings Provider 来实现的。这听起来令人生畏,但实际上相对简单。您所要做的就是创建一个继承自 SettingsProvider 的新类,并提供必须重写的 ApplicationName 属性,我将其默认为 Product Name。

Using the Code

使用自定义设置提供程序很简单;只需将该类包含在您的应用程序中,然后在查看 My Project/Settings 页面时,只需将 Provider 属性(默认为空白)设置为您的提供程序类名即可。请注意,Provider 属性是为每个设置单独设置的;这样,您可以将某些项保留在默认的 .NET 提供程序模型下,但可以覆盖一些关键项,以便使用此便携式提供程序与您一起携带。

下面的屏幕截图显示了更改此设置的确切位置

Screenshot - CustomSettingsProvider1.jpg

默认情况下,漫游属性设置为 false,对于便携式设置提供程序,这意味着该设置是特定于计算机的。对于窗口大小/位置等设置,这是期望的,但对于您希望无论计算机如何使用的设置(在此示例中为 UserWord),都应将其设置为 true。

除此之外,像往常一样处理设置。在示例应用程序中,我们只是在 Form Load 和 Closing 事件中获取和设置它们。

运行应用程序时,它会尝试从名为 applicationtitle.settings 的 XML 文件加载设置。由于一开始不存在此文件,因此它会使用默认值。在退出应用程序后,将创建设置文件。如果您查看它(在项目的 bin/debug 文件夹中),您会发现它具有以下格式:

<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <WorkPC>
    <WindowSize>300, 100</WindowSize>
    <WindowLocation>100, 100</WindowLocation>
  </WorkPC>
  <HomePC>
    <WindowSize>300, 200</WindowSize>
    <WindowLocation>300, 300</WindowLocation>
  </HomePC>
  <UserWord>Test</UserWord>
</Settings>

请注意,漫游值为 false 的设置如何包含在当前 PC 名称的元素中,而 UserWord 的漫游设置位于 Settings 节点级别,这意味着无论您使用哪台 PC,它都会被使用。

还包含了一个 U3 特定设置提供程序。它继承自 PortableSettingsProvider,重写了 GetAppSettingsPath 函数,该函数在这种情况下会尝试从环境变量中检索路径。如果您对将设置存储在 XML 文件中感到满意,但只想更改位置(可能是常见的网络映射),那么您也可以使用此继承技术。

关注点

Settings Provider 的实际核心发生在 GetPropertyValuesSetPropertyValues 函数中。这些函数传入一个集合对象,其中包含此提供程序需要获取/设置的所有属性,我们只需遍历这些属性,将它们加载或保存到我们的 XML 文档中。我实现了一个 SettingsXML 属性,该属性要么加载,要么创建一个带有必需根节点的新 XML 文档。

最后一个有趣的点是 IsRoaming 函数。它会查找属性上 SettingsManageabilityAttribute 类型的属性集合。此属性的存在表明 IsRoaming 属性设置为 true。

历史

  • 2007 年 10 月 18 日 - 初始文章。
© . All rights reserved.