【问题标题】:How can I distinguish user settings by name in C#?如何在 C# 中按名称区分用户设置?
【发布时间】:2012-12-17 10:38:03
【问题描述】:

CodeProjectStackOverflow.105932(以及其他一些文章,例如 StackOverflow.1873658 和 MSDN 文章)之后,我有一个主窗体,其大小、位置和 WindowState 保存在Properties.Settings.Default.<name> 中并从中读取,例如Properties.Settings.Default.WindowState = WindowState;,这对于这种窗体非常有用。我出现的每个代码示例似乎都认为 WindowState 的全局设置只有一个,没有一个说明如何区分每个实例的这些设置。

但是,我在表单的超类中编写了代码,因为我希望此应用程序中的所有表单都继承自该类,以便它们都能够保存/读取自己的大小、位置和状态。

我想做的只是用继承形式的类名替换上面键路径中的“默认”一词。这是伪代码,如果它可以工作的话会很棒(它没有,而且我找不到可以的变体):

Properties.Settings[this.ToString()].WindowState = WindowState;

如何正确、可重用、可维护、防熵地做到这一点?

编辑:“配置部分”会是答案吗? (也许为每个 Form 子类创建一个部分?)

编辑:不,不是配置部分,但我认为 this class 必须是正确解决方案的一部分。

【问题讨论】:

  • 我认为您需要将其带到 Code Review 站点。
  • 我真的希望这里的人们似乎一心只想对新用户的帖子投反对票,至少没有提供一些指向常见问题解答页面等的指针,将网站作为一个完全是一种伤害。
  • @user1944491 - 欢迎来到 Stack Overflow!您的帖子应该真正采取问题的形式。尽可能具体,并请尽量避免要求“主观”的答案。请参阅页面顶部的常见问题解答链接,了解如何最好地使用本网站。至于您当前的帖子,您能否改写一下,以便我们具体知道您需要什么帮助?或者,如果您只是寻求有关您的问题解决方案的反馈,上面的 Brannon 可能是正确的。
  • @XIVSolutions - 谢谢!我第一次出去时真的很想具体说明,但在阅读后我能明白你的意思。问题是“如何使用户设置特定于表单?” - 我最后一段中的代码是伪代码 - 没有用 - 我正在寻找正确的代码。我会尝试改写...
  • @user1944491 提出一个不会惹恼人们的 SO 问题本身就是一种艺术形式,我认为您做得不错。不要气馁,欢迎来到 SO :)

标签: c# windows winforms settings.settings settings


【解决方案1】:

嗯,从本质上讲,这并不是 .NET 中默认设置的工作方式。 Scope = User 的设置文件被小心地隐藏在一个私有的 AppData 文件夹中,其名称难以描述。通过散列主要 EXE 的各种属性创建的名称,包括其名称、位置和 [AssemblyVersion]。防止程序意外覆盖彼此的设置文件很重要。没有记录的方法可以从另一个程序获取该文件。主要是因为您没有很好的方法来猜测其他程序的这些属性值。

有一些解决方法,您可以创建自己的从 SettingsProvider 派生的类,而不是默认的 LocalFileSettingsProvider 类。有点痛苦,System.Configuration 并不是 .NET 中最好的命名空间。一个很好的入门方法是使用RegistrySettingsProvider SDK sample

或者只是解决问题,只需创建您自己的 XML 文件,并将其存储在 AppData 文件夹中,您可以随时从任何应用程序访问该文件夹。这通常是一个好主意,因为当许多应用程序共享一个公共数据文件时,您往往会被版本控制问题所困扰。您需要在其自己的程序集中声明一个可序列化 XML 的类来存储这些属性。顶部有一个沉重的“不先与我交谈就不要改变”评论。

【讨论】:

  • 汉斯,感谢您的光临。但是,我不想将一个文件用于多个应用程序 - 我希望这个应用程序的用户设置文件为运行时使用的每个表单存储 3 个属性(WindowState、位置、大小),并且我希望这些设置每个窗口都是唯一的,并且保持不变,以便下次使用应用程序时,每个窗口都可以以上次的状态、位置和大小打开。因为你的答案假设了一些完全不同的东西,所以我不确定它是否适用,抱歉。
  • 好吧,我当然弄错了。我没有想到一个应用程序有这么多顶级窗口,以至于这变得难以管理。不过,我将坚持使用“序列化您自己的 XML”解决方案。一个列表就可以了。
猜你喜欢
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多